Back to Blog

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:

TahapTarget Durasi
LintDi bawah 2 menit
Unit testDi bawah 5 menit
BuildDi bawah 5 menit
Integration testDi bawah 10 menit
Total pipelineDi 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:

  1. Deteksi kegagalan melalui health check atau metrik
  2. Picu rollback ke versi baik sebelumnya yang diketahui
  3. Alert tim dengan konteks deployment
  4. 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

  1. Mengabaikan build yang rusak: Branch utama yang rusak harus menjadi prioritas utama tim. Jika tetap rusak selama berjam-jam, praktik CI telah gagal.
  2. Melewatkan test demi kecepatan: Pipeline cepat dibangun melalui optimisasi, bukan dengan menghapus test.
  3. Langkah deployment manual: Jika manusia harus mengklik tombol atau menjalankan script, suatu saat akan dilakukan salah.
  4. 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:

  1. Minggu 1: Setup pipeline CI yang menjalankan linting dan unit test di setiap push
  2. Minggu 2: Tambahkan langkah build yang menghasilkan artifact yang bisa di-deploy
  3. Minggu 3: Otomatiskan deployment ke environment development
  4. Minggu 4: Tambahkan integration test dan deploy ke environment staging
  5. 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.

Read in English English Version