apiVersion: v1 kind: ConfigMap metadata: name: {{ .Release.Name }}-db-migration namespace: {{ .Values.global.namespace }} data: migrate.sql: | -- Add made_by column if it doesn't exist DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'recipes' AND column_name = 'made_by' ) THEN ALTER TABLE recipes ADD COLUMN made_by TEXT; END IF; END $$; -- Create index if it doesn't exist CREATE INDEX IF NOT EXISTS idx_recipes_made_by ON recipes (made_by); -- Verify schema SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'recipes' ORDER BY ordinal_position; --- apiVersion: batch/v1 kind: Job metadata: name: {{ .Release.Name }}-db-migration-{{ .Release.Revision }} namespace: {{ .Values.global.namespace }} labels: app: {{ .Release.Name }}-db-migration component: migration annotations: "helm.sh/hook": post-upgrade,post-install "helm.sh/hook-weight": "5" "helm.sh/hook-delete-policy": before-hook-creation spec: ttlSecondsAfterFinished: 300 template: metadata: labels: app: {{ .Release.Name }}-db-migration spec: restartPolicy: Never containers: - name: migrate image: postgres:16-alpine command: - /bin/sh - -c - | echo "Waiting for database to be ready..." until pg_isready -h $DB_HOST -U $DB_USER; do echo "Database not ready, waiting..." sleep 2 done echo "Database is ready, running migration..." PGPASSWORD=$DB_PASSWORD psql -h $DB_HOST -U $DB_USER -d $DB_NAME -f /migration/migrate.sql echo "Migration completed successfully" env: - name: DB_HOST valueFrom: secretKeyRef: name: {{ .Release.Name }}-db-credentials key: DB_HOST - name: DB_PORT valueFrom: secretKeyRef: name: {{ .Release.Name }}-db-credentials key: DB_PORT - name: DB_NAME valueFrom: secretKeyRef: name: {{ .Release.Name }}-db-credentials key: DB_NAME - name: DB_USER valueFrom: secretKeyRef: name: {{ .Release.Name }}-db-credentials key: DB_USER - name: DB_PASSWORD valueFrom: secretKeyRef: name: {{ .Release.Name }}-db-credentials key: DB_PASSWORD volumeMounts: - name: migration-script mountPath: /migration volumes: - name: migration-script configMap: name: {{ .Release.Name }}-db-migration