Chart maintainer guide
Template files
| Template | What it creates |
|---|---|
deployment.yaml | Deployment |
statefulset.yaml | StatefulSet |
cronjob.yaml | CronJob |
service.yaml | Service per workload |
route.yaml | OpenShift Route |
ingress.yaml | Ingress |
hpa.yaml | HorizontalPodAutoscaler |
keda.yaml | KEDA ScaledObject / ScaledJob |
pdb.yaml | PodDisruptionBudget |
scc.yaml | OpenShift SCC binding |
certificate.yaml | cert-manager Certificate |
configmap.yaml | ConfigMap |
secret.yaml | Secret |
sealedsecret.yaml | SealedSecret |
pvc.yaml | PersistentVolumeClaim |
persistentvolume.yaml | PersistentVolume |
serviceaccount.yaml | ServiceAccount |
rbac.yaml | Role + RoleBinding |
extra-manifests.yaml | Free-form extra manifests |
_helpers.tpl | Shared template helpers |
How workload templates work
All workload templates iterate over their list and output one resource per item:
{{- range .Values.deployments }}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .name }}
...
{{- end }}
Inside the loop, use .key to access the current item and $.key (with $) to access root scope — for example $.Release.Name or $.Values.globalKey.
Testing
# Lint
helm lint base-chart/
# Render with a values file
helm template my-app base-chart/ -f test-values.yaml
# Render only one template
helm template my-app base-chart/ -f test-values.yaml \
--show-only templates/deployment.yaml
Adding a new template
- Create
base-chart/templates/my-resource.yaml. - Iterate over the relevant list (
deployments,statefulsets,cronjobs, or a new global list). - Gate the output on an
enabledflag so nothing is created by default:{{- if and .myResource .myResource.enabled }}
---
...
{{- end }} - Add the new key with a disabled default to
base-chart/values.yaml. - Document the new key in the Values reference.
Bumping the chart version
Edit base-chart/Chart.yaml:
version: 1.1.0 # bump this
Then publish to the OCI registry and update ociChartVersion in the UI chart config (ui/docs/src/app/charts/base-chart-1.0.0.js → create a new version file).