Merancang CI/CD sebagai platform: standardisasi pipeline lewat template, artifact registry yang aman, dan pola pipeline yang konsisten agar seluruh tim release dengan cara yang sama dan terukur

Setelah di episode 6 kita membangun portal (Backstage) sebagai wajah platform, episode ini melengkapi alur paling penting yang developer pakai setiap hari: CI/CD. Di banyak organisasi, pipeline CI/CD adalah "wild west" — setiap tim punya pipeline sendiri, cara build sendiri, dan registri sendiri. Platform engineer mengubah ini menjadi produk: pipeline yang distandardisasi, aman secara default, dan terukur.
Mengapa CI/CD harus jadi platform, bukan kumpulan workflow? Karena pipeline adalah titik di mana kode berubah menjadi produksi — titik paling berisiko dalam siklus release. Pipeline yang tidak terstandarisasi berarti: cara deploy yang berbeda-beda, image yang tidak konsisten, dan tidak ada jaminan bahwa apa yang diuji adalah apa yang di-deploy.
Empat prinsip yang menjadi kompas perancangan:
Kuncinya adalah template, bukan dokumentasi. Jika cara deploy hanya dijelaskan di dokumen, setiap tim akan menginterpretasikan dengan caranya sendiri. Jika cara deploy adalah template yang harus dipakai, konsistensi terjamin.
name: Service Build & Deploy
on:
workflow_call:
inputs:
environment:
type: string
required: true
image-name:
type: string
required: true
secrets:
REGISTRY_PASSWORD:
required: true
DEPLOY_TOKEN:
required: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build image
run: docker build -t ${{ vars.REGISTRY }}/${{ inputs.image-name }}:${{ github.sha }} .
- name: Scan vulnerabilities
uses: aquasecurity/trivy-action@master
with:
image-ref: ${{ vars.REGISTRY }}/${{ inputs.image-name }}:${{ github.sha }}
severity: CRITICAL,HIGH
- name: Sign image
uses: sigstore/cosign-installer@v3
- run: cosign sign ${{ vars.REGISTRY }}/${{ inputs.image-name }}:${{ github.sha }}
- name: Push image
run: docker push ${{ vars.REGISTRY }}/${{ inputs.image-name }}:${{ github.sha }}Template ini menjadi workflow_call — service kalian tinggal memanggilnya:
name: Deploy payments-api
on:
push:
branches: [main]
jobs:
deploy:
uses: org/platform-workflows/.github/workflows/template-service.yml@main
with:
environment: prod
image-name: payments-api
secrets: inheritPerhatikan transfer pengetahuan yang terjadi: semua kompleksitas build, scan, signing dipindahkan ke satu tempat. Tim payments tidak perlu tahu detail cosign atau trivy — mereka tinggal memanggil template. Ini contoh nyata abstraksi CI/CD sebagai produk.
Note
workflow_call memungkinkan template di-versioning (@v1, @v2). Ini penting: ketika platform mengubah cara build, perubahan itu terjadi sekali di template, bukan di 50 repo. Semua tim meng-upgrade dengan memilih versi template, bukan menyalin ulang workflow.
Artifact registry (container image, package, helm chart) adalah bagian CI/CD yang paling sering diremehkan tapi paling berdampak. Platform engineer menganggap registry sebagai produk dengan aturan:
| Aspek | Kebijakan Platform |
|---|---|
| Lokasi | Satu registry terpusat per environment (mis. GHCR, ECR, GAR) |
| Tagging | Immutable: ${{ sha }}; tag latest hanya untuk convenience, bukan deploy |
| Retention | Auto-cleanup image lama, retensi dihitung per kebijakan |
| Akses | Registry siluman (private); pull via service account, bukan key manusia |
| Scan | CVE scan otomatis pada setiap push + enforce gate untuk CRITICAL |
Kebijakan "image immutable + tag SHA" adalah yang paling penting: apa yang di-deploy hari ini harus bisa ditelusuri ke commit tertentu — kemampuan yang tidak dimiliki tag latest yang menyesatkan.
Satu pola pipeline untuk service containerized (bisa disesuaikan per jenis workload):
Platform engineer juga menetapkan jenjang environment yang konsisten: dev → staging → prod. Setiap jenjang punya gate:
dev : push ke branch feature/main -> auto-deploy, no gate
staging : PR merge ke main -> auto-deploy, butuh smoke test pass
prod : tag release (v*) -> manual approval + runbook rollbackGate yang jelas mencegah dua masalah klasik: deploy sembarangan ke prod, dan pipeline yang macet karena setiap deploy butuh approval manual.
Untuk tim besar, antrean merge dan strategi deploy adalah bagian dari platform CI/CD:
# Pola yang direkomendasikan platform
strategy:
type: RollingUpdate # default
rollingUpdate:
maxUnavailable: 0
maxSurge: 1Kita tidak perlu menerapkan semua strategi — yang perlu platform lakukan adalah menetapkan default dan menyediakan opsi terdokumentasi.
Pipeline CI/CD harus diamati seperti sistem lain. Metrics yang paling penting:
| Metric | Pertanyaan |
|---|---|
| Pipeline duration | Berapa lama build + deploy? |
| Success rate | Berapa % pipeline yang gagal? |
| Deploy frequency | Berapa sering deploy ke prod? |
| Change failure rate | Berapa % deploy yang menyebabkan insiden? |
| Time to restore | Berapa cepat pulih dari kegagalan? |
Empat yang terakhir adalah DORA metrics yang kita bahas lebih dalam di episode 22. Untuk sekarang: pastikan setiap pipeline mengirim metrics ke stack observability (episode 9), dan tim platform punya dashboard sendiri untuk CI/CD health.
Warning
DORA metrics akan tidak berguna jika pipeline kalian tidak distandarkan. Jika 50 tim punya 50 pipeline berbeda, angka deploy frequency tidak bisa dibandingkan antar tim. Standardisasi dulu, ukur setelahnya.
latest untuk deploy — menelusuri "mana commit yang menyebabkan bug" menjadi tidak mungkin.Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita masuk ke jaringan: service mesh & networking — Istio/Linkerd, mTLS, dan traffic management yang menjadi lapisan kontrol komunikasi antar-service di platform. CI/CD yang hebat tetap butuh jaringan yang benar untuk deliver trafik yang benar!