Mengotomasi siklus rilis aplikasi: pipeline GitHub Actions untuk membangun dan push image, rolling update dengan kubectl set image atau GitOps Argo CD/Flux, menangani migrasi schema sebelum deploy, dan menjaga zero-downtime dengan readiness probe serta strategi maxSurge dan maxUnavailable

Upload manual image dan kubectl apply yang setengah jadi sudah waktunya pensiun. Di episode 22 kita membangun pipeline rilis yang konsisten: perubahan kode → build image → push registry → deploy ke cluster → traffic mengalir — tanpa satu pun langkah manusia di tengah jalan.
Khusus untuk arsitektur kita (stateful via PVC RWX), ada aturan emas: kode berubah, data jangan diganggu. Pipeline harus tahu perbedaan antara "update image" dan "migrasi schema".
Workflow GitHub Actions untuk build dan push image ke GHCR:
name: build-image
on:
push:
branches: [main]
paths: ["app/**", "Dockerfile"]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v6
with:
context: ./app
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}Setiap commit ke main menghasilkan image baru ber-tag commit hash.
Setelah image terpush, lakukan deploy:
kubectl set image deployment/laravel laravel-web=ghcr.io/<user>/laravel-media:$(git rev-parse HEAD)
kubectl rollout status deployment/laravel --timeout=180sRolling update mengganti Pod satu per satu; data volume RWX tetap ter-mount — dari sudut pandang data, ini hanya pertukaran proses.
Pola GitOps menyimpan seluruh manifest di git, dan operator (Argo CD/Flux) menjaga cluster selalu sesuai repo. Saat image berubah, cukup update repo — operator menerapkan:
argocd app sync laravel
argocd app health laravelKeuntungan GitOps: history deploy = history git, rollback = revert commit, drift cluster terdeteksi otomatis.
Tip
Mulai dari yang sederhana: kubectl set image + rollout sudah memberi 80% nilai. Tambahkan Argo CD/Flux ketika tim besar atau banyak environment — jangan langsung melompat tanpa dasar.
Aturan emas pipeline + storage:
kubectl set image; volume tidak tersentuh; data tetap.kubectl apply -f job-migrate.yaml
kubectl wait --for=condition=complete job/laravel-migrate --timeout=180s
kubectl set image deployment/laravel laravel-web=ghcr.io/<user>/laravel-media:v2Warning
Jangan pernah menjalankan migrasi sesudah beberapa replica sudah naik versi baru — kondisi "schema v2, kode v1" adalah kebakaran. Urutan yang benar: migrasi selesai → baru rollout.
Dua mekanisme menjaga lalu lintas tetap mengalir selama rollout:
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0maxUnavailable: 0 menjamin selalu ada Pod lama yang melayani — traffic tidak pernah kosong. maxSurge: 1 membatasi Pod baru yang muncul serentak.
Gunakan maxUnavailable: 0 untuk aplikasi single-Pod sekalipun; biaya yang dibayar hanya satu Pod sementara di atas kapasitas.
Pada episode 22 ini, rilis aplikasi kalian kini otomatis dan aman:
Inti yang harus dibawa pulang:
kubectl set image (rolling) atau GitOps (Argo CD/Flux).maxUnavailable: 0, maxSurge: 1.kubectl rollout undo.Di episode 23 selanjutnya kita akan mengeraskan produksi: manajemen Config & Secret, security checklist dari ekspor NFS sampai Pod security admission, operational checklist, dan penyusunan runbook untuk skenario NFS down. Sampai jumpa di episode 23!