Manifest Management
Raw YAML, Kustomize, and Helm manifest rendering in Wardn
Manifest Management
For Git-source apps, source.git.manifestType selects how manifests are rendered before being applied.
Supported Types
| Type | Status | Description |
|---|---|---|
Auto | ✅ | Default — detects kustomization.yaml → Kustomize, Chart.yaml → Helm, else Raw |
Raw | ✅ | Plain YAML/JSON manifests |
Kustomize | ✅ | Kustomize overlays rendered by the operator |
Helm | 📋 Planned | Schema exists; render fails today |
Raw YAML/JSON
Wardn reads .yaml, .yml, and .json files from source.git.path and parses them into resources.
spec:
source:
type: Git
git:
repoURL: https://github.com/myorg/my-app
path: manifests
manifestType: RawMulti-Document Files
Documents separated by --- are all parsed:
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
key: value
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 3Directory Structure
my-repo/
└── manifests/
├── deployment.yaml
├── service.yaml
├── configmap.yaml
└── ingress.yamlAll .yaml, .yml, and .json files in the path are parsed and applied.
Kustomize ✅
When manifestType is Kustomize (or Auto finds a kustomization.yaml in the path), the operator renders the overlay — bases, overlays, patches, components.
spec:
source:
type: Git
git:
repoURL: https://github.com/myorg/my-app
path: overlays/production
manifestType: Auto # detects kustomization.yaml
kustomize:
images:
- ghcr.io/acme/api=v1.2.3 # newName=newTag overrides
namePrefix: prod-
components:
- ../../components/monitoringsource.git.kustomize layers overrides on top of the tracked kustomization.yaml without editing the repo — image pins, name prefixes, extra components.
Helm — 📋 planned
Not implemented. manifestType: Helm — or an Auto-detected Chart.yaml — fails the reconcile today. The source.git.helm config (valuesFile, releaseName, namespace, inlineValues) and the HelmChart source type are schema-reserved for the future implementation.
The target shape:
spec:
source:
type: Git
git:
path: charts/my-app
manifestType: Helm
helm:
valuesFile: values/production.yaml
releaseName: my-app
inlineValues: |
replicas: 3Variable Substitution ✅
source.git.substitution applies a Flux-style ${VAR} map to rendered manifests post-build:
spec:
source:
type: Git
git:
substitution:
ENVIRONMENT: production
IMAGE_TAG: v1.2.3Keeps environment-specific values out of tracked manifests.
SOPS Encrypted Manifests — 📋 planned
Not wired. The operator has no SOPS decryption — a SOPS-encrypted file would be applied with ENC[...] literals intact. The server's secret-store registry supports an age provider for future decryption plumbing. See Secret Management.
Server-Side Apply
All rendered objects are applied with Kubernetes server-side apply:
- Field manager
wardn-operatorwith forced ownership — fields Wardn rendered stay Wardn-managed; conflicts are taken over rather than failing - Managed-by label
cd.wardn.space/app: <app-name>stamped on every applied object — this is whatsyncPolicy.pruneselects on - Pruning — objects carrying the app's label in the destination namespace that leave the rendered set are deleted (when
prune: true)
There is no API-server dry-run preflight — manifests go straight to apply. Invalid manifests surface as Failed operations on status.operationState and SyncError conditions.
Related
- Configuration — full
AppCRD spec - Helm Charts Guide — Helm deployment (planned)
- Kustomize Guide — tutorial for Kustomize overlays
- Secret Management — Vault/OpenBao, SOPS age, and ESO integration