Hooks & release lifecycle
Run jobs at install/upgrade.
Sometimes you need to run something at a point in a release’s life — migrate a database before an upgrade, seed data after install, back up before a change. Helm hooks are ordinary Kubernetes resources (usually Jobs) annotated to run at a lifecycle phase: pre-install, post-install, pre-upgrade, post-upgrade, pre-delete, post-delete. Helm runs the hook, waits for it, and then continues the release.
apiVersion: batch/v1kind: Jobmetadata:name: {{ .Release.Name }}-migrateannotations:"helm.sh/hook": pre-upgrade,pre-install"helm.sh/hook-weight": "0" # ordering among hooks"helm.sh/hook-delete-policy": before-hook-creation,hook-succeededspec:template:spec:restartPolicy: Nevercontainers:- { name: migrate, image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}", command: ["/app/migrate"] }
Weights and delete policies
hook-weight orders multiple hooks in a phase (lower runs first); hook-delete-policy controls when the hook resource is cleaned up (before-hook-creation to clear a prior run, hook-succeeded to remove it on success). A failing hook aborts the release, which is what you want for a migration that must succeed before new pods roll — the upgrade stops rather than shipping code against an un-migrated schema.