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
| Phase | Runs |
pre-install | After templates rendered, before any resource created |
| Use case | Schema bootstrap, secret pre-generation |
3. Using post-install Hook
| Phase | Runs |
post-install | After all manifests applied and (if --wait) marked Ready |
| Use case | Smoke tests, cache warm-up, register webhooks |
4. Using pre-upgrade Hook
| Phase | Use case |
pre-upgrade | Database migrations, backups before manifest changes |
5. Using post-upgrade Hook
| Phase | Use case |
post-upgrade | Cache invalidation, post-deploy notifications |
6. Using pre-delete Hook
| Phase | Use case |
pre-delete | Backup data, drain queues before uninstall |
7. Using post-delete Hook
| Phase | Use case |
post-delete | Cleanup external resources (DNS, IAM, CDN) |
8. Using pre-rollback Hook
| Phase | Use case |
pre-rollback | Reverse migrations before previous revision applied |
9. Using post-rollback Hook
| Phase | Use case |
post-rollback | Restore caches, notify monitoring of revert |
10. Setting Hook Weight
| Annotation | Behavior |
helm.sh/hook-weight: "-10" | Lower weight runs first (string-encoded int) |
| Same weight | Sorted by kind, then name (alphabetical) |
11. Setting Hook Deletion Policy
| Policy | Effect |
before-hook-creation | Delete previous run before creating new (default) |
hook-succeeded | Delete after success — keeps cluster clean |
hook-failed | Delete 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.