Menyatukan CI dan CD dalam satu alur GitOps: membangun dan menguji kode, membuat image, lalu menyerahkan deployment sepenuhnya kepada ArgoCD. Diulas contoh nyata dengan GitHub Actions serta praktik terbaik pemisahan tanggung jawab.

Di episode 17 sebelumnya kita membahas notifications & alerts — bagaimana ArgoCD memberi tahu tim lewat Slack, email, atau webhook ketika status sinkronisasi atau kesehatan berubah. Namun sampai di sini kita masih memperlakukan Git sebagai sumber yang "tiba-tiba berubah" tanpa memahami siapa yang mengubahnya. Pada episode ini kita menutup lingkaran itu: mengintegrasikan ArgoCD dengan pipeline CI/CD, sehingga dari commit kode sampai aplikasi live di cluster adalah satu alur yang dapat dilacak.
Mengapa ini penting? Dalam setup tradisional, CI dan CD sering menyatu: satu pipeline menjalankan build lalu langsung kubectl apply ke cluster. Masalahnya, pipeline itu memegang kredensial cluster, dan setiap deployment adalah keputusan yang hanya tercatat di log pipeline yang bisa hilang. GitOps menawarkan pembagian kerja yang lebih sehat: CI bertanggung jawab membangun dan menguji artefak, sementara CD — yang dipegang ArgoCD — bertanggung jawab menerapkan konfigurasi yang sudah disetujui di Git. CI boleh memegang kredensial registry, CD cukup membaca Git. Setelah episode ini, pola ini akan kalian pahami sampai level implementasi.
Sebelum menulis pipeline, kalian harus paham siapa melakukan apa. Model GitOps membagi alur menjadi dua domain yang berbeda kepentingannya:
| Domain | Tanggung jawab | Hasil keluaran | Kredensial yang dipegang |
|---|---|---|---|
| CI (Continuous Integration) | Checkout kode, lint, unit test, build image, push ke registry, scan keamanan | Image immutable dengan tag unik (SHA commit atau versi semver) | Token registry, kredensial Git untuk commit manifest |
| CD (Continuous Delivery) | Membaca Git, merekonsiliasi, menerapkan, memantau kesehatan | Cluster selalu sama dengan Git | Kredensial Git saja (pull), dipegang ArgoCD |
Intinya: CI menghasilkan artefak, CD menerapkan artefak. ArgoCD tidak perlu tahu bagaimana image dibuat; ia hanya perlu tahu bahwa image dengan tag tertentu sudah ada di registry, lalu mewujudkannya di cluster. Pemisahan ini membuat CI bisa dijalankan ulang tanpa memengaruhi cluster, dan membuat rollback CD tidak bergantung pada pipeline.
Tahap build adalah urutan langkah yang menghasilkan image. Standar industri memakai lima langkah berurutan:
name: ci
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: bun install --frozen-lockfile
- run: bun run lint && bun run test
- 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:
push: true
tags: ghcr.io/org/api:${{ github.sha }}Perhatikan pola tag image: SHA commit sebagai tag adalah cara termurah untuk membuat artefak immutable — setiap commit menghasilkan image yang tidak pernah ditimpa, sehingga kalian selalu bisa merekonstruksi versi persis yang berjalan di produksi. exit-code: "1" pada Trivy membuat pipeline gagal jika ditemukan CVE dengan severity tinggi — inilah gerbang keamanan sebelum image masuk cluster.
Setelah image berada di registry, tugas CI belum selesai. Dalam model GitOps, langkah berikutnya adalah memperbarui manifest di Git agar ArgoCD melihat image baru. Pilihan termudah adalah Kustomize images (dari episode 8):
- uses: azure/setup-kubectl@v4
- uses: imranismail/setup-kustomize@v2
- run: |
cd manifests/overlays/staging
kustomize edit set image ghcr.io/org/api:${{ github.sha }}
git config user.name "ci-bot"
git config user.email "ci@org.dev"
git commit -am "chore(staging): bump api to ${{ github.sha }}"
git pushSetelah git push, dua hal bisa terjadi tergantung syncPolicy pada Application:
| Sync policy | Perilaku setelah commit manifest | Kapan dipakai |
|---|---|---|
| Manual | ArgoCD mendeteksi OutOfSync, menunggu persetujuan | Production, perubahan sensitif |
| Automated | ArgoCD langsung menyinkronkan secara otomatis | Dev/staging, perubahan rutin |
| Automated + selfHeal | Kembalikan drif cluster ke Git secara otomatis | Lingkungan yang harus selalu sama dengan Git |
Jika Application memakai automated sync, tidak ada lagi langkah manual — ArgoCD melihat perubahan Git, menyinkronkan, dan health check berjalan. Jika manual, tim menjalankan:
argocd app get api --show-operation
argocd app sync api --strategy apply
argocd app wait api --healthTip
Pola pipeline menulis manifest, ArgoCD yang menerapkan membuat satu-satunya titik tulis ke cluster adalah Git. Jika kalian ingin benar-benar ketat, tambahkan branch protection di repo manifest sehingga commit hanya bisa masuk lewat pull request yang sudah direview — ini memberi lapisan persetujuan manusia tanpa memberi siapa pun akses langsung ke cluster.
Pola yang sama — build, push, update manifest, ArgoCD sync — bisa dibangun di platform mana pun. Yang membedakan hanyalah sintaks:
| Platform CI | Cara update manifest | Cara memicu ArgoCD |
|---|---|---|
| GitHub Actions | Step kustomize edit set image + commit | Tidak perlu memicu langsung: ArgoCD membaca Git |
| GitLab CI/CD | Script kustomize + git commit dengan API token | Webhook GitLab ke ArgoCD (opsional, untuk sync cepat) |
| Jenkins | Stage update manifest memakai kustomize | Plugin ArgoCD atau argocd app sync via CLI |
| Tekton | Task kustomize + task git commit dalam pipeline | argocd-app task dari catalog Tekton |
Kunci yang harus diingat: jangan pernah memanggil argocd app sync dari pipeline untuk "men-deploy". ArgoCD seharusnya menarik sendiri dari Git. Jika kalian memanggil sync dari pipeline, kalian kembali ke model push, dan klaim utama GitOps — semua perubahan bersumber dari Git — menjadi rusak. Biarkan ArgoCD menjadi pengemudi.
latest adalah musuh reproducibility.git revert atau argocd app rollback. Dokumentasikan langkah rollback di runbook.Deployment yang baik diuji sebelum dan sesudah diterapkan:
kubectl kustomize atau helm template --validate) untuk menangkap YAML yang rusak sebelum masuk Git.apiVersion: batch/v1
kind: Job
metadata:
name: api-smoke-test
annotations:
argocd.argoproj.io/hook: PostSync
spec:
template:
spec:
restartPolicy: Never
containers:
- name: smoke
image: curlimages/curl:latest
command: ["sh", "-c", "curl -sf http://api:8080/healthz"]Jika curl gagal (misalnya kode keluar non-zero), job hook gagal, dan ArgoCD menandai sinkronisasi sebagai gagal — pemicu yang bisa menyalakan notifikasi (episode 17) dan membuka jalan otomatis rollback.
Episode ini menyatukan seluruh alur: CI membangun dan menguji artefak lalu memperbarui manifest di Git, dan ArgoCD sebagai CD menarik perubahan dan merekonsiliasi cluster. Kita membahas lima langkah build stage, pola kustomize edit set image sebagai jembatan CI ke CD, perbandingan sync policy, contoh di GitHub Actions, GitLab, Jenkins, dan Tekton, serta testing strategy dengan PostSync hooks.
Poin yang harus kalian bawa:
Alur "cepat dan dapat dilacak" sekarang siap. Namun cepat saja tidak cukup — di produksi kalian butuh cara melepas versi baru tanpa memutus pengguna. Di episode 19 selanjutnya kita akan membahas progressive delivery dengan Argo Rollouts — canary, blue-green, analisis metrik, dan traffic splitting. Sampai jumpa di episode 19!