Langsung ke konten
KamusNgoding
Pemula Cicd 7 menit baca

Apa itu CI/CD? Penjelasan Lengkap untuk Pemula

#cicd #devops #pemula #dasar

Apa itu CI/CD? Penjelasan Lengkap untuk Pemula

Pendahuluan

Pernahkah kamu mengalami situasi seperti ini: Kamu dan tim baru saja selesai mengkode fitur baru, lalu saat digabungkan semua kode masing-masing, tiba-tiba muncul ratusan error yang bikin kepala pusing? Atau kamu harus begadang untuk mendeploy aplikasi ke server secara manual, satu per satu, sambil was-was takut ada yang terlewat?

Nah, masalah ini yang diselesaikan oleh CI/CD.

CI/CD adalah singkatan dari Continuous Integration / Continuous Delivery (atau Continuous Deployment). Ini adalah sebuah praktik dan otomatisasi yang memungkinkan tim developer untuk merilis kode dengan lebih cepat, lebih aman, dan lebih konsisten — tanpa harus bergantung pada proses manual yang rawan kesalahan.

Bayangkan kamu ingin membangun aplikasi seperti Gojek yang harus melayani jutaan pengguna setiap hari. Tanpa CI/CD, setiap kali ada fitur baru atau bug fix, kamu harus tes manual, paket manual, upload manual ke server — proses yang melelahkan dan penuh risiko. Dengan CI/CD, semua itu berjalan otomatis hanya dengan satu git push.


Memahami Continuous Integration (CI)

Continuous Integration (CI) adalah praktik di mana setiap developer secara rutin menggabungkan (merge) perubahan kode mereka ke dalam satu repository bersama — biasanya beberapa kali dalam sehari. Setiap kali ada kode baru masuk, sistem CI secara otomatis akan:

  1. Mengambil kode terbaru
  2. Menjalankan build (kompilasi/pemrosesan)
  3. Menjalankan semua tes otomatis
  4. Melaporkan hasilnya ke tim

Analoginya seperti ini: bayangkan kamu dan 5 teman sedang mengerjakan puzzle bersama. Daripada masing-masing mengerjakan bagian sendiri lalu disatukan di akhir (yang bisa kacau), CI mengharuskan kamu menyatukan potongan puzzle secara berkala — jadi kalau ada yang nggak cocok, ketahuannya lebih cepat.

Berikut contoh sederhana konfigurasi CI menggunakan GitHub Actions:

# .github/workflows/ci.yml
name: CI Pipeline

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout kode
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependensi
        run: npm install

      - name: Jalankan build
        run: npm run build

      - name: Jalankan tes
        run: npm test

Setiap kali ada git push ke branch main atau develop, pipeline di atas akan otomatis berjalan. Kalau tes gagal, tim langsung tahu — sebelum kode sempat masuk ke production.

Kamu bisa pelajari lebih dalam cara mengonfigurasi tes otomatis di artikel Cara Menjalankan Tes Otomatis dengan GitHub Actions.


Memahami Continuous Delivery dan Continuous Deployment (CD)

Setelah CI memastikan kode kamu lolos build dan tes, giliran CD yang bekerja.

Ada dua varian CD yang perlu kamu pahami:

Continuous Delivery

Kode yang sudah lulus CI secara otomatis disiapkan (packaged) dan siap di-deploy ke environment production — namun perlu persetujuan manual sebelum benar-benar dirilis ke pengguna. Cocok untuk aplikasi enterprise yang butuh kontrol lebih ketat.

Dengan Continuous Delivery, tim tetap memegang kendali penuh atas kapan rilis terjadi. Semua pekerjaan teknis (build, test, packaging) sudah otomatis, tapi keputusan “kapan deploy” tetap di tangan manusia.

Continuous Deployment

Kode yang sudah lulus CI langsung otomatis di-deploy ke production tanpa perlu persetujuan manual. Cocok untuk tim yang punya test coverage tinggi dan butuh rilis sangat cepat.

Bayangkan kamu ingin membangun layanan SaaS yang perlu merilis puluhan kali dalam sehari — Continuous Deployment memungkinkan hal ini berjalan tanpa campur tangan manusia sama sekali.

Berikut contoh pipeline CD lengkap yang melanjutkan konfigurasi CI sebelumnya:

# .github/workflows/cd.yml
name: CD Pipeline

on:
  push:
    branches: [main]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout kode
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependensi
        run: npm install

      - name: Jalankan build
        run: npm run build

      - name: Jalankan tes
        run: npm test

  deploy:
    runs-on: ubuntu-latest
    needs: build-and-test  # Hanya jalan kalau CI berhasil

    steps:
      - name: Checkout kode
        uses: actions/checkout@v3

      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '18'

      - name: Install dependensi
        run: npm install

      - name: Build untuk production
        run: npm run build

      - name: Deploy ke server
        env:
          DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
          SERVER_HOST: ${{ secrets.SERVER_HOST }}
        run: |
          # Contoh deploy ke VPS via SSH
          ssh -i $DEPLOY_KEY user@$SERVER_HOST "
            cd /var/www/myapp &&
            git pull origin main &&
            npm install --production &&
            pm2 restart myapp
          "

Perhatikan kata kunci needs: build-and-test — artinya job deploy hanya akan dijalankan jika job CI berhasil. Ini adalah inti dari pipeline CI/CD yang aman: tidak ada kode rusak yang lolos ke production.


Manfaat Utama Menggunakan CI/CD

Kenapa CI/CD penting? Ini beberapa alasannya:

1. Deteksi Bug Lebih Cepat Bug yang ditemukan segera setelah kode ditulis jauh lebih mudah diperbaiki daripada bug yang baru ketahuan berbulan-bulan kemudian. CI memastikan setiap perubahan kecil langsung diuji.

2. Rilis Lebih Sering dan Lebih Aman Jika ingin membangun layanan seperti Tokopedia yang butuh update fitur hampir setiap hari, CI/CD memungkinkan kamu rilis kecil-kecil tapi sering — mengurangi risiko dibanding rilis besar yang jarang.

3. Mengurangi Pekerjaan Manual Deploy manual butuh waktu, konsentrasi, dan rentan kesalahan manusia. CI/CD mengotomatiskan proses ini sehingga tim bisa fokus pada pengembangan.

4. Konsistensi Environment Setiap build dijalankan di environment yang sama (container). Tidak ada lagi “di komputerku jalan kok!” karena semua berjalan di kondisi yang identik.

5. Meningkatkan Kepercayaan Tim Dengan test coverage yang baik dan pipeline yang solid, developer lebih berani melakukan perubahan besar tanpa takut merusak sistem.


Contoh Kasus Nyata

Mari kita bayangkan sebuah tim kecil yang membangun aplikasi e-commerce lokal. Sebelum CI/CD, alur kerjanya seperti ini:

Developer nulis kode → Kirim ke lead lewat WhatsApp → 
Lead review manual → Deploy manual ke server → 
Cek manual di browser → Kalau error, balik lagi dari awal

Prosesnya bisa makan waktu 2-3 hari hanya untuk satu fitur kecil.

Setelah mengimplementasikan CI/CD dengan GitHub Actions:

Developer push ke branch fitur → 
Pull Request otomatis trigger CI → 
Tes otomatis berjalan (5 menit) → 
Lead cukup review kode, bukan deploy → 
Merge ke main → CD otomatis deploy ke staging → 
Setelah approved, deploy ke production

Prosesnya bisa turun menjadi beberapa jam saja, bahkan kurang.

Berikut contoh sederhana script tes menggunakan Jest (JavaScript) yang akan dijalankan oleh CI:

// tests/cart.test.js
const { hitungTotal } = require('../src/cart');

describe('Fungsi hitungTotal', () => {
  test('harus menghitung total dengan benar', () => {
    const items = [
      { nama: 'Baju', harga: 150000, qty: 2 },
      { nama: 'Celana', harga: 200000, qty: 1 },
    ];
    expect(hitungTotal(items)).toBe(500000);
  });

  test('harus mengembalikan 0 jika keranjang kosong', () => {
    expect(hitungTotal([])).toBe(0);
  });
});

Jika fungsi hitungTotal mengalami perubahan yang tidak sengaja merusak logikanya, CI akan langsung menangkap error ini sebelum masuk ke production.


Troubleshooting: Error yang Sering Muncul

Pipeline Gagal dengan “Exit Code 1” tapi Tidak Ada Pesan Error Jelas

Penyebab: Biasanya salah satu perintah dalam pipeline mengembalikan kode error, namun output-nya tidak terlihat karena terlalu panjang atau tidak dicetak ke stdout dengan benar.

Solusi:

# Tambahkan flag verbose pada perintah tes
- name: Jalankan tes
  run: npm test -- --verbose

# Atau tambahkan perintah debugging sebelum langkah yang gagal
- name: Cek environment
  run: |
    node --version
    npm --version
    ls -la
    cat package.json

Secret / Credentials Tidak Terbaca di Pipeline

Penyebab: Secret yang disimpan di GitHub Secrets tidak dioper dengan benar ke environment variabel di dalam job, atau nama variabelnya salah ketik.

Solusi:

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Deploy
        env:
          # Pastikan nama secret di sini SAMA PERSIS
          # dengan nama di Settings > Secrets
          API_KEY: ${{ secrets.API_KEY }}
          DB_PASSWORD: ${{ secrets.DB_PASSWORD }}
        run: |
          # Cek apakah secret tersedia (tanpa print nilainya!)
          if [ -z "$API_KEY" ]; then
            echo "ERROR: API_KEY tidak tersedia"
            exit 1
          fi
          ./deploy.sh

Build Berhasil di Lokal tapi Gagal di Pipeline

Penyebab: Perbedaan versi Node.js, Python, atau dependensi antara mesin lokal dan runner CI. Biasanya juga karena file .env tidak tersedia di CI karena tidak di-commit ke repository.

Solusi:

# Pastikan versi runtime eksplisit dan sama dengan lokal
- name: Setup Node.js
  uses: actions/setup-node@v3
  with:
    node-version: '18.17.0'  # Gunakan versi spesifik, bukan '18'
    cache: 'npm'              # Cache dependensi untuk mempercepat

# Buat file .env dari secrets untuk keperluan testing
- name: Buat file .env
  run: |
    echo "DATABASE_URL=${{ secrets.DATABASE_URL }}" >> .env
    echo "APP_KEY=${{ secrets.APP_KEY }}" >> .env

Pertanyaan yang Sering Diajukan

Apa perbedaan CI dan CD?

CI (Continuous Integration) fokus pada proses menggabungkan dan menguji kode secara otomatis setiap kali ada perubahan. CD (Continuous Delivery/Deployment) fokus pada proses merilis kode ke environment staging atau production secara otomatis setelah CI berhasil. Keduanya biasanya digunakan bersama sebagai satu pipeline yang saling melengkapi.

Apakah CI/CD hanya untuk tim besar?

Tidak sama sekali! Bahkan developer solo pun sangat diuntungkan dengan CI/CD. Pipeline sederhana di GitHub Actions gratis untuk repository publik dan memiliki batas yang cukup generous untuk proyek pribadi. Dengan pipeline dasar, kamu sudah bisa mengotomatiskan tes dan deploy hanya dalam 30 menit.

Apa tools CI/CD yang populer selain GitHub Actions?

Beberapa tools populer lainnya adalah GitLab CI/CD (terintegrasi dengan GitLab), Jenkins (open-source, bisa di-hosting sendiri), CircleCI, Travis CI, dan Bitbucket Pipelines. Untuk proyek yang juga menggunakan infrastruktur cloud, Cloudflare Pages menyediakan pipeline deploy otomatis yang sangat mudah dikonfigurasi — bisa kamu pelajari lebih lanjut di artikel Apa itu CDN Cloudflare? Penjelasan Lengkap untuk Pemula.

Bagaimana cara memulai CI/CD untuk proyek yang sudah berjalan?

Mulailah dari langkah kecil: buat satu pipeline CI yang hanya menjalankan npm test atau php artisan test setiap kali ada push. Setelah terbiasa, tambahkan step build, linting, dan akhirnya deploy. Jangan coba implementasikan segalanya sekaligus — bertahap adalah kuncinya.

Apakah CI/CD bisa digunakan untuk proyek backend seperti Laravel?

Tentu saja! CI/CD sangat umum digunakan untuk aplikasi Laravel. Kamu bisa mengonfigurasi pipeline untuk menjalankan migration database di environment testing, menjalankan PHPUnit atau Pest, lalu deploy ke server. Artikel Testing di Laravel: Panduan Lengkap PHPUnit dan Pest untuk Developer Indonesia bisa jadi referensi bagus untuk melengkapi pipeline CI/CD Laravel kamu.


Kesimpulan

CI/CD bukan sekadar “fitur mewah” untuk perusahaan besar — ini adalah fondasi dari pengembangan software modern yang sehat. Dengan mengotomatiskan proses integrasi, pengujian, dan deployment, kamu dan tim bisa bekerja lebih cepat, lebih percaya diri, dan lebih jarang terjaga malam karena deployment yang gagal.

Mulailah dari pipeline sederhana: satu job, dua langkah — build dan test. Dari sana, kamu bisa terus berkembang sesuai kebutuhan proyekmu. Ingat, CI/CD yang berjalan 80% otomatis jauh lebih baik daripada yang sempurna tapi tidak pernah diimplementasikan.

Selamat belajar dan terus berlatih! Kalau ada pertanyaan atau kamu ingin eksplorasi topik DevOps lebih dalam, jangan ragu untuk menjelajahi artikel-artikel lainnya di KamusNgoding — masih banyak hal seru yang menunggumu!

Artikel Terkait