Working with Chart Hooks

1. Defining Hook Annotations

Example: Basic hook

apiVersion: batch/v1
kind: Job
metadata:
  name: db-migrate
  annotations:
    "helm.sh/hook": pre-upgrade,pre-install
    "helm.sh/hook-weight": "-5"
    "helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
spec:
  template:
    spec:
      restartPolicy: Never
      containers:
        - name: migrate
          image: {{ include "myapp.image" . }}
          command: ["./migrate"]

2. Using pre-install Hook

PhaseRuns
pre-installAfter templates rendered, before any resource created
Use caseSchema bootstrap, secret pre-generation

3. Using post-install Hook

PhaseRuns
post-installAfter all manifests applied and (if --wait) marked Ready
Use caseSmoke tests, cache warm-up, register webhooks

4. Using pre-upgrade Hook

PhaseUse case
pre-upgradeDatabase migrations, backups before manifest changes

5. Using post-upgrade Hook

PhaseUse case
post-upgradeCache invalidation, post-deploy notifications

6. Using pre-delete Hook

PhaseUse case
pre-deleteBackup data, drain queues before uninstall

7. Using post-delete Hook

PhaseUse case
post-deleteCleanup external resources (DNS, IAM, CDN)

8. Using pre-rollback Hook

PhaseUse case
pre-rollbackReverse migrations before previous revision applied

9. Using post-rollback Hook

PhaseUse case
post-rollbackRestore caches, notify monitoring of revert

10. Setting Hook Weight

AnnotationBehavior
helm.sh/hook-weight: "-10"Lower weight runs first (string-encoded int)
Same weightSorted by kind, then name (alphabetical)

11. Setting Hook Deletion Policy

PolicyEffect
before-hook-creationDelete previous run before creating new (default)
hook-succeededDelete after success — keeps cluster clean
hook-failedDelete after failure

12. Using test Hook

Example: Connectivity test

apiVersion: v1
kind: Pod
metadata:
  name: {{ include "myapp.fullname" . }}-test-connection
  annotations:
    "helm.sh/hook": test
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  restartPolicy: Never
  containers:
    - name: wget
      image: busybox:1.36
      command: ["wget", "--spider", "{{ include "myapp.fullname" . }}:{{ .Values.service.port }}"]
Note: Run tests with helm test <release> after install.