Praktik Terbaik CI/CD Pipeline untuk Tim
Bagaimana mendesain CI/CD pipeline yang andal untuk menangkap bug lebih awal, mengotomatiskan deployment, dan memberi tim kepercayaan di setiap rilis.
Apa yang Sebenarnya Diselesaikan CI/CD
Sebelum CI/CD, deployment software adalah peristiwa yang menegangkan. Developer bekerja terisolasi selama berminggu-minggu. Integrasi kode terjadi di menit terakhir. Testing manual dan terburu-buru. Deployment terjadi Jumat malam dengan tim menahan napas. Rollback berarti memulihkan dari backup dan berharap yang terbaik.
Continuous Integration dan Continuous Delivery menyelesaikan ini dengan membuat integrasi, testing, dan deployment otomatis, sering, dan dapat direproduksi. Alih-alih satu rilis bulanan yang menakutkan, Anda mengirim perubahan kecil beberapa kali per hari dengan percaya diri.
Continuous Integration: Fondasi
Praktik Inti
Setiap developer push kode ke branch utama minimal sekali per hari. Setiap push memicu build dan test run otomatis. Jika ada yang rusak, tim memperbaikinya segera.
Ini adalah aturan yang tidak bisa ditawar: branch utama selalu dalam kondisi yang bisa di-deploy.
Pipeline CI Praktis
# .github/workflows/ci.yml
name: CI Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run lint
test:
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm test -- --coverage
- uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage/
build:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm'
- run: npm ci
- run: npm run build
Pipeline ini menjalankan tiga tahap secara berurutan: lint, test, build. Jika linting gagal, test tidak berjalan. Jika test gagal, build tidak terjadi. Feedback cepat, compute minimal yang terbuang.
Kecepatan Pipeline Penting
Pipeline CI yang memakan 45 menit menghambat commit yang sering. Developer menumpuk perubahan untuk menghindari menunggu, yang mengalahkan tujuan continuous integration.
Target waktu pipeline:
| Tahap | Target Durasi |
|---|---|
| Lint | Di bawah 2 menit |
| Unit test | Di bawah 5 menit |
| Build | Di bawah 5 menit |
| Integration test | Di bawah 10 menit |
| Total pipeline | Di bawah 15 menit |
Teknik untuk mencapai ini:
- Eksekusi paralel: Jalankan lint, type check, dan unit test secara bersamaan
- Caching dependensi: Cache
node_modules, Docker layer, dan build artifact - Testing selektif: Hanya jalankan test yang terpengaruh file yang berubah
- Build inkremental: Hanya rebuild yang berubah
Continuous Delivery: Dari Build ke Deployment
Progresi Environment
Kode bergerak melalui environment dalam urutan yang ditentukan:
Development → Staging → Production
Setiap environment memiliki tujuan:
- Development: Kode terbaru dari main. Digunakan developer untuk integration testing.
- Staging: Mirror production. Digunakan untuk validasi final, performance testing, dan review stakeholder.
- Production: Environment live yang menghadap pelanggan.
Strategi Deployment
Rolling deployment: Ganti instance satu per satu. Zero downtime. Rollback mudah dengan melanjutkan versi lama.
Blue-green deployment: Jalankan dua environment identik. Arahkan traffic dari blue (saat ini) ke green (baru) setelah verifikasi. Rollback instan dengan mengarahkan kembali ke blue.
Canary deployment: Arahkan persentase kecil traffic (5% hingga 10%) ke versi baru. Monitor error rate dan performa. Tingkatkan traffic secara bertahap jika sehat.
# Contoh konfigurasi canary deployment
canary:
steps:
- setWeight: 5
- pause: { duration: 5m }
- analysis:
templates:
- templateName: error-rate
args:
- name: service-name
value: web-app
- setWeight: 25
- pause: { duration: 10m }
- setWeight: 50
- pause: { duration: 10m }
- setWeight: 100
Untuk kebanyakan tim, rolling deployment adalah titik awal yang tepat. Beralih ke canary saat monitoring Anda cukup matang untuk mendeteksi masalah selama rollout.
Testing dalam Pipeline
Piramida Test
Strukturkan test Anda dengan lebih banyak test cepat dan lebih sedikit test lambat:
/ E2E Tests \ Sedikit, lambat, mahal
/ Integration \ Beberapa, kecepatan sedang
/ Unit Tests \ Banyak, cepat, murah
- Unit test: Jalan di setiap commit. Cover logika bisnis, utilitas, dan transformasi data.
- Integration test: Jalan di setiap commit atau pull request. Cover API endpoint, query database, dan interaksi service.
- End-to-end test: Jalan sebelum deployment ke staging dan production. Cover perjalanan pengguna kritikal.
Quality Gate
Tentukan kriteria yang tidak bisa ditawar yang harus lolos sebelum kode bergerak maju:
- Semua test lolos (zero failure)
- Code coverage di atas threshold (minimal 80%)
- Tidak ada kerentanan keamanan kritikal atau tinggi
- Tidak ada error linting
- Build menghasilkan artifact valid
- Ukuran Docker image dalam budget
Otomatiskan gate ini. Pengawasan manusia harus disimpan untuk code review, bukan untuk mengecek apakah test lolos.
Keamanan dalam Pipeline
Shift Left
Integrasikan pengecekan keamanan lebih awal dalam pipeline, bukan sebagai gerbang terakhir:
security:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Audit dependensi
run: npm audit --audit-level=high
- name: Pemindaian secret
uses: trufflesecurity/trufflehog@main
with:
path: ./
- name: Pemindaian SAST
uses: github/codeql-action/analyze@v3
- Pemindaian dependensi: Cek kerentanan yang diketahui di paket pihak ketiga
- Pemindaian secret: Deteksi API key, password, atau token yang tidak sengaja di-commit
- Analisis statis (SAST): Identifikasi pola keamanan di kode Anda sendiri
- Pemindaian container: Cek Docker image untuk layer dasar yang rentan
Manajemen Secret
Jangan pernah simpan secret di file konfigurasi pipeline. Gunakan:
- Secret level environment di platform CI/CD Anda
- Secret manager eksternal (HashiCorp Vault, AWS Secrets Manager)
- Pembuatan kredensial dinamis untuk akses berumur pendek
Monitoring dan Rollback
Verifikasi Pasca-Deployment
Setelah setiap deployment, verifikasi secara otomatis:
- Health check endpoint mengembalikan 200
- Error rate tetap dalam baseline
- Response time tetap dalam range yang dapat diterima
- Metrik bisnis kunci (pemrosesan pesanan, keberhasilan pembayaran) stabil
Rollback Otomatis
Saat pengecekan pasca-deployment gagal, rollback secara otomatis:
- Deteksi kegagalan melalui health check atau metrik
- Picu rollback ke versi baik sebelumnya yang diketahui
- Alert tim dengan konteks deployment
- Simpan log dan artifact untuk investigasi
Semakin cepat Anda bisa rollback, semakin sedikit dampak deployment buruk. Targetkan penyelesaian rollback dalam 5 menit.
Pemeliharaan Pipeline
Perlakukan Pipeline sebagai Kode
Konfigurasi CI/CD Anda hidup di version control bersama kode aplikasi Anda. Terapkan standar yang sama:
- Code review perubahan pipeline
- Test perubahan pipeline di branch sebelum merge
- Dokumentasikan keputusan pipeline yang tidak jelas
- Refactor saat pipeline menjadi terlalu kompleks
Monitor Kesehatan Pipeline
Lacak metrik ini setiap minggu:
- Build success rate: Target 95%+ (kegagalan harus dari masalah kode nyata, bukan infrastruktur flaky)
- Mean time to fix: Seberapa cepat build yang rusak diperbaiki?
- Tren durasi pipeline: Apakah semakin lambat seiring waktu?
- Tingkat flaky test: Test yang kadang lolos kadang gagal mengikis kepercayaan
Kesalahan Umum
- Mengabaikan build yang rusak: Branch utama yang rusak harus menjadi prioritas utama tim. Jika tetap rusak selama berjam-jam, praktik CI telah gagal.
- Melewatkan test demi kecepatan: Pipeline cepat dibangun melalui optimisasi, bukan dengan menghapus test.
- Langkah deployment manual: Jika manusia harus mengklik tombol atau menjalankan script, suatu saat akan dilakukan salah.
- Tidak ada rencana rollback: Harapan bukan strategi deployment. Uji prosedur rollback Anda secara reguler.
Memulai Perjalanan CI/CD Anda
Jika tim Anda saat ini deploy secara manual, mulai dari sini:
- Minggu 1: Setup pipeline CI yang menjalankan linting dan unit test di setiap push
- Minggu 2: Tambahkan langkah build yang menghasilkan artifact yang bisa di-deploy
- Minggu 3: Otomatiskan deployment ke environment development
- Minggu 4: Tambahkan integration test dan deploy ke environment staging
- Bulan 2: Implementasikan deployment production otomatis dengan health check
Setiap langkah mengurangi risiko dan membangun kepercayaan tim. Dalam dua bulan, Anda akan memiliki pipeline CI/CD fungsional. Dalam enam bulan, Anda akan bertanya-tanya bagaimana Anda pernah deploy dengan cara lain.