Mengotomasi pipeline delivery: workflow CI yang membangun dan mem-push image Laravel, manifest infrastruktur storage yang ber-version dengan GitOps (ArgoCD/Flux), menyuntikkan konfigurasi StorageClass dan PVC, serta deployment otomatis ke cluster

Sampai episode 20, sebagian interaksi dengan cluster masih manual: kubectl apply, docker build, push. Episode 21 menutup siklus itu dengan CI/CD & GitOps: Git menjadi sumber kebenaran, pipeline membangun dan mengirim, dan cluster menarik perubahan sendiri.
Bagi tim kecil, keputusannya strategis: GitOps sederhana (semua manifest di repo + ArgoCD/Flux) memberikan jejak perubahan, rollback yang mudah, dan on-boarding yang jelas — dengan kompleksitas yang masih masuk akal.
Dalam GitOps, StorageClass & PVC adalah resources biasa — dideklarasikan di repo, direview lewat PR, dan di-deploy dengan pull model:
perbaikan/gitops/kubernetes/
├── storage/
│ ├── storageclass-openebs-hostpath.yaml
│ ├── storageclass-openebs-nfs-rwx.yaml
│ ├── storageclass-openebs-lvm.yaml
│ └── networkpolicy-nfs.yaml (episode 11)
├── apps/
│ ├── laravel/
│ │ ├── pvc-media-storage.yaml
│ │ ├── deployment-laravel.yaml
│ │ └── ingress-laravel.yaml
│ └── postgres/
│ ├── statefulset-postgres.yaml
│ └── pvc-data-postgres.yaml
└── monitoring/
└── podmonitor-openebs.yaml (episode 18)Kelebihan besar: perubahan StorageClass (mis. menonaktifkan kelas lama) melalui review PR, bukan perintah langsung ke cluster.
Workflow GitHub Actions untuk membangun & mem-push image:
name: Build Laravel Image
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
permissions:
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: .
push: true
tags: ghcr.io/${{ github.repository }}:latest,ghcr.io/${{ github.repository }}:${{ github.sha }}Setiap push ke main memproduksi image ter-tag dengan SHA — jejak build yang unik dan mudah di-rollback.
ArgoCD menyinkronkan folder manifest dengan cluster:
kubectl create ns argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlDaftarkan aplikasi laravel dari repo GitOps:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: laravel
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/<org>/perbaikan-gitops
path: kubernetes/apps/laravel
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: apps
syncPolicy:
automated:
prune: true
selfHeal: truekubectl apply -f app-laravel.yaml
kubectl -n argocd get app laravelNote
selfHeal mengembalikan kondisi yang "dikoreksi" manual kembali ke Git — inilah filosofi GitOps: Git adalah norma, drift adalah bug. Untuk storage, aktifkan ini dengan hati-hati (StorageClass/ReclaimPolicy jangan "dikoreksi" oleh ArgoCD bila kalian ingin mengelola perubahan via Git saja).
Bagi pipeline aplikasi, storage adalah API standar — cukup tiga kebiasaan:
kubectl.jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Apply manifest aplikasi dari GitOps
run: kubectl apply -k kubernetes/apps/laravel
- name: Jalankan migrasi (Job)
run: kubectl apply -f job-migrate.yaml && kubectl wait --for=condition=complete job/laravel-migrateTip
Mulailah dari ArgoCD + satu folder apps/laravel. Jangan proyek besar di awal — nilai GitOps muncul justru ketika pola sudah berjalan stabil selama dua-tiga pekan, bukan saat pertama kali dipasang.
Pada episode 21 ini, delivery menjadi otomatis dan dapat dipertanggungjawabkan:
Inti yang harus dibawa pulang:
latest + SHA tag).apps/* dari repo ke cluster dengan prune + selfHeal.Di episode 22 selanjutnya kita akan mengemas bare minimum produksi small: checklist kapasitas, keamanan, observability, backup yang wajib terpenuhi sebelum merilis, beserta estimasi risiko bila menangguhkan bagian tertentu. Sampai jumpa di episode 22!