Dagimal hacker

ArgoCD: CI Cukup Build, Urusan Deploy Serahin ke Git

Kalau kita bicara CI/CD, kebanyakan orang masih sering campur aduk antara proses CI dan CD dalam satu pipeline. Build image, push ke registry, terus langsung deploy ke Kubernetes dalam satu alur. Kelihatannya simpel, tapi ada beberapa masalah yang muncul seiring waktu:

ArgoCD hadir dengan pendekatan GitOps: sumber kebenaran untuk kondisi cluster adalah Git repository. ArgoCD yang akan watch repo, dan kalau ada perbedaan antara yang ada di Git dengan yang berjalan di cluster, dia akan sync otomatis atau minta kita untuk sync manual.

Intinya, CI cukup urusin build dan push image. CD sepenuhnya urusan ArgoCD.

Konsep GitOps

Sebelum masuk ke praktek, penting untuk paham filosofi GitOps:

Dengan pendekatan ini, history deployment ada di Git history. Mau tau siapa yang deploy apa dan kapan? Cukup git log.

Arsitektur yang Kita Bangun

Kita memisahkan konfigurasi menjadi beberapa bagian untuk meningkatkan reusability dan keamanan:

  1. App Repo $\rightarrow$ kode aplikasi. CI pipeline di sini yang handle build dan push image.
  2. Helm Chart Repo $\rightarrow$ berisi template manifest Kubernetes yang generik.
  3. Helm Values Repo $\rightarrow$ berisi konfigurasi spesifik per aplikasi, per environment, dan per cluster.

Alurnya:

Developer push code → CI build & push image → CI update image tag di Helm Values Repo
                                                        ↓
                                          ArgoCD detect perubahan di Helm Values Repo
                                                        ↓
                                          ArgoCD sync ke Kubernetes cluster menggunakan Chart + Values

CI tidak pernah sentuh cluster langsung. Tugasnya selesai setelah update image tag di Helm Values Repo.

Instalasi ArgoCD

kubectl create namespace argocd

kubectl apply -n argocd -f \
  https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

Tunggu semua pod ready:

kubectl get pods -n argocd -w

Akses ArgoCD UI lewat port-forward:

kubectl port-forward svc/argocd-server -n argocd 8080:443

Ambil password awal:

kubectl get secret argocd-initial-admin-secret \
  -n argocd \
  -o jsonpath="{.data.password}" | base64 -d

Buka https://localhost:8080, login dengan user admin dan password yang barusan didapat.

Implementasi Multiple Sources (Helm Chart + Values)

Salah satu fitur powerful ArgoCD adalah Multiple Sources. Kita bisa mengambil Chart dari satu repo dan Values-nya dari repo lain. Ini sangat berguna agar kita tidak perlu menduplikasi chart untuk setiap environment.

Struktur Helm Values Repository

Values Repo kita strukturkan agar rapi per environment dan per aplikasi:

helm-values/
├── staging/
│   └── billing-engine/
│       ├── values.yaml             # Base values untuk staging
│       └── values-gdl-stg.yaml     # Override khusus cluster GDL Staging
└── production/
    └── billing-engine/
        ├── values.yaml
        └── values-gdl-prod.yaml

Membuat ArgoCD ApplicationSet

Untuk mengelola deployment ke banyak cluster sekaligus, kita menggunakan ApplicationSet.

apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: billing-engine
  namespace: argocd
spec:
  generators:
    - list:
        elements:
          - cluster: gdl-stg
            url: "https://kube.dagimal.com:6443"
  template:
    metadata:
      name: 'billing-engine-{{cluster}}'
    spec:
      project: default
      sources:
        # Source 1: Helm Values Repo (di-refer sebagai 'values')
        - repoURL: https://git.dagimal.com/devops/helm-values.git
          targetRevision: main
          ref: values
        # Source 2: Helm Chart Repo
        - repoURL: https://git.dagimal.com/devops/helm-chart.git
          targetRevision: main
          path: pelayanan-pelanggan
          helm:
            valueFiles:
              - $values/staging/billing-engine/values-{{cluster}}.yaml
              - $values/staging/billing-engine/values.yaml
      destination:
        server: '{{url}}'
        namespace: app
      syncPolicy:
        automated:
          prune: false
          selfHeal: true
        syncOptions:
          - CreateNamespace=true

Poin penting:

CI Pipeline: Tugasnya Hanya Build dan Update Tag

CI pipeline kini hanya perlu mengupdate file .yaml di Helm Values Repo. Contoh menggunakan GitLab CI:

# .gitlab-ci.yml di App Repo
stages:
  - build
  - update-config

build-image:
  stage: build
  script:
  - docker build -t registry.dagimal.com/myapp:$CI_COMMIT_SHORT_SHA .
  - docker push registry.dagimal.com/myapp:$CI_COMMIT_SHORT_SHA
  only:
  - main

update-helm-values:
  stage: update-config
  image: alpine/git
  script:
  - git clone https://oauth2:$VALUES_REPO_TOKEN@gitlab.example.com/devops/helm-values.git
  - cd helm-values
  # Update image tag di values file menggunakan sed atau yq
  - sed -i "s|tag:.*|tag: \"$CI_COMMIT_SHORT_SHA\"|" staging/myapp/values.yaml
  - git config user.email "ci@example.com"
  - git config user.name "CI Pipeline"
  - git add .
  - git commit -m "chore: update myapp image tag to $CI_COMMIT_SHORT_SHA"
  - git push
  only:
  - main

Sync Manual vs Otomatis

ArgoCD punya dua mode sync:

Sync Otomatis (menggunakan automated di syncPolicy) ArgoCD akan langsung sync begitu ada perubahan di Git. Cocok untuk staging atau development.

Sync Manual Kita yang tentukan kapan deploy terjadi. Cocok untuk production di mana kita mau ada kontrol lebih.

Rollback Semudah Git Revert

Salah satu kelebihan GitOps yang paling terasa: rollback semudah revert commit di Git.

Kalau deploy terbaru bermasalah:

# Di Helm Values Repo, revert commit terakhir
git revert HEAD
git push

ArgoCD akan detect perubahan dan sync ulang ke versi sebelumnya. Atau lewat ArgoCD CLI:

# Lihat history deployment
argocd app history billing-engine-gdl-stg

# Rollback ke revision tertentu
argocd app rollback billing-engine-gdl-stg <revision-id>

Selain itu, rollback juga bisa dilakukan langsung melalui UI ArgoCD dengan cukup beberapa klik saja. Dan jika ingin meloncat ke versi image manapun, kita cukup mengubah nilai tag image di Helm Values Repo.

Real Talk

Pemisahan antara Chart dan Values menggunakan fitur Multiple Sources ArgoCD membuat manajemen konfigurasi menjadi sangat scalable. Kita tidak perlu mengelola ratusan file manifest Kubernetes yang hampir identik. Cukup satu Chart untuk semua, dan beberapa file Values untuk membedakan environment.

Alur kerja menjadi jauh lebih bersih: