Langsung ke konten
KamusNgoding
Pemula Cicd 6 menit baca

Cara Membuat Pipeline CI/CD Sederhana dengan GitHub Actions

#github actions #cicd #devops #github

Cara Membuat Pipeline CI/CD Sederhana dengan GitHub Actions

Pendahuluan

Bayangkan kamu bekerja di sebuah tim yang membangun aplikasi e-commerce, seperti Tokopedia atau Shopee. Setiap hari, puluhan perubahan kode masuk dari berbagai developer. Kalau setiap perubahan harus di-deploy secara manual, tim kamu akan kelelahan dan rentan membuat kesalahan.

Di sinilah pipeline CI/CD hadir sebagai solusi. Dengan GitHub Actions, kamu bisa mengotomasi proses pengujian dan deployment sehingga setiap kali ada kode baru yang masuk, semuanya berjalan otomatis — tanpa perlu intervensi manual.

Di artikel ini, kita akan membangun pipeline CI/CD sederhana dari nol menggunakan GitHub Actions. Tidak perlu pengalaman sebelumnya; kita mulai dari konsep dasar hingga konfigurasi nyata yang langsung bisa kamu gunakan.


Apa Itu CI/CD dan GitHub Actions?

CI/CD adalah singkatan dari Continuous Integration dan Continuous Delivery/Deployment.

  • Continuous Integration (CI) — Setiap kali developer mendorong (push) kode baru, sistem otomatis menjalankan pengujian untuk memastikan kode tersebut tidak merusak yang sudah ada. Bayangkan seperti quality control di pabrik: setiap produk diperiksa sebelum masuk ke gudang.
  • Continuous Delivery/Deployment (CD) — Setelah pengujian lulus, kode secara otomatis dikirim ke server staging atau production. Seperti truk pengiriman yang langsung berangkat begitu barang lolos inspeksi.

GitHub Actions adalah layanan otomasi bawaan GitHub yang memungkinkan kamu mendefinisikan workflow (alur kerja) menggunakan file YAML. Setiap workflow terdiri dari:

IstilahPenjelasan
WorkflowKumpulan pekerjaan yang berjalan otomatis
Trigger (on)Peristiwa yang memicu workflow (push, pull request, dll.)
JobKumpulan langkah dalam satu mesin virtual
StepPerintah tunggal dalam sebuah job
ActionBlok siap pakai dari GitHub Marketplace

Untuk memahami lebih dalam tentang GitHub Actions secara umum, kamu bisa membaca artikel Apa itu GitHub Actions? Penjelasan Lengkap untuk Pemula.


Menyiapkan Proyek untuk Pipeline CI/CD

Kita akan menggunakan proyek Python sederhana sebagai contoh. Pastikan struktur proyekmu terlihat seperti ini:

my-project/
├── .github/
│   └── workflows/
│       └── ci.yml        ← file workflow GitHub Actions
├── app.py
├── test_app.py
└── requirements.txt

app.py — Fungsi sederhana yang akan kita uji

def tambah(a, b):
    return a + b

def kurang(a, b):
    return a - b

def kali(a, b):
    return a * b

def bagi(a, b):
    if b == 0:
        raise ValueError("Pembagi tidak boleh nol!")
    return a / b

test_app.py — File pengujian menggunakan pytest

import pytest
from app import tambah, kurang, kali, bagi

def test_tambah():
    assert tambah(2, 3) == 5
    assert tambah(-1, 1) == 0
    assert tambah(0, 0) == 0

def test_kurang():
    assert kurang(5, 3) == 2
    assert kurang(0, 5) == -5

def test_kali():
    assert kali(3, 4) == 12
    assert kali(-2, 5) == -10

def test_bagi_normal():
    assert bagi(10, 2) == 5.0
    assert bagi(9, 3) == 3.0

def test_bagi_dengan_nol():
    with pytest.raises(ValueError, match="Pembagi tidak boleh nol!"):
        bagi(10, 0)

requirements.txt — Daftar dependensi

pytest==7.4.0
flake8==6.1.0

Langkah-langkah Membuat Workflow GitHub Actions

Buat file .github/workflows/ci.yml dengan isi berikut:

name: Pipeline CI/CD Sederhana

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

jobs:
  test:
    name: Jalankan Pengujian
    runs-on: ubuntu-latest

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

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependensi
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Periksa gaya kode dengan flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics

      - name: Jalankan pengujian dengan pytest
        run: pytest test_app.py -v

  deploy:
    name: Deploy ke Staging
    runs-on: ubuntu-latest
    needs: test  # hanya berjalan jika job 'test' berhasil
    if: github.ref == 'refs/heads/main'

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

      - name: Deploy simulasi
        run: |
          echo "Deploying ke server staging..."
          echo "Versi: ${{ github.sha }}"
          echo "Branch: ${{ github.ref_name }}"
          echo "Deploy berhasil!"

Penjelasan bagian penting:

  • on: push/pull_request — Workflow berjalan saat ada push ke branch main/develop, atau saat ada pull request ke main.
  • runs-on: ubuntu-latest — GitHub menyediakan mesin virtual Ubuntu gratis untuk menjalankan job.
  • needs: test — Job deploy hanya berjalan setelah job test berhasil. Jika ada pengujian yang gagal, deployment otomatis dibatalkan.
  • if: github.ref == 'refs/heads/main' — Deployment hanya terjadi dari branch main, bukan dari branch lain.

Contoh Kasus Nyata: Full CI Pipeline

Jika ingin membangun layanan seperti Gojek yang melayani jutaan transaksi harian, sistem CI/CD yang solid adalah fondasi utamanya. Berikut contoh workflow yang lebih lengkap dengan pemeriksaan kualitas kode (linting) dan notifikasi hasil:

name: Full CI Pipeline

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

jobs:
  quality-check:
    name: Pemeriksaan Kualitas Kode
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Setup Python 3.11
        uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Install dependensi
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Periksa gaya kode dengan flake8
        run: |
          flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics

      - name: Jalankan semua pengujian
        run: pytest -v --tb=short

  notify:
    name: Notifikasi Hasil
    runs-on: ubuntu-latest
    needs: quality-check
    if: always()  # berjalan meski job sebelumnya gagal

    steps:
      - name: Tampilkan status pipeline
        run: |
          if [ "${{ needs.quality-check.result }}" == "success" ]; then
            echo "Pipeline berhasil! Kode siap di-review."
          else
            echo "Pipeline gagal. Periksa log di atas."
          fi

Untuk mengelola informasi sensitif seperti API key atau token deployment, sangat penting memahami perbedaan antara secrets dan variabel — pelajari selengkapnya di Secrets vs Variables di GitHub Actions: Perbedaan dan Kapan Menggunakannya.


Troubleshooting: Error yang Sering Muncul

Error: No module named 'pytest'

Penyebab: Step install dependensi tidak berjalan sebelum step pengujian, atau nama file requirements.txt salah atau tidak ada di root proyek.

Solusi:

- name: Install dependensi
  run: |
    python -m pip install --upgrade pip
    pip install -r requirements.txt
    # Pastikan requirements.txt ada di root repository

Periksa juga bahwa requirements.txt berada di root repository, bukan di dalam subfolder.


Error: Process completed with exit code 1 pada step pytest

Penyebab: Ada pengujian yang gagal. GitHub Actions menganggap exit code bukan 0 sebagai kegagalan, dan pytest mengembalikan exit code 1 jika ada test yang tidak lulus.

Solusi:

# Jalankan secara lokal dulu untuk melihat detail kegagalan:
pytest test_app.py -v --tb=long

# Contoh output yang perlu diperhatikan:
# FAILED test_app.py::test_tambah - AssertionError: assert 4 == 5

Perbaiki kode atau pengujian yang salah, lalu push ulang. Jangan gunakan || true untuk menyembunyikan kegagalan pengujian karena ini berbahaya di production.


Error: Resource not accessible by integration saat deploy

Penyebab: Workflow mencoba mengakses resource (seperti menulis ke repository atau memanggil API eksternal) tanpa izin yang cukup. Ini sering terjadi pada pull request dari fork.

Solusi:

jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      contents: write    # izin untuk push ke repository
      deployments: write # izin untuk membuat deployment

    steps:
      - uses: actions/checkout@v4
        with:
          token: ${{ secrets.GITHUB_TOKEN }}

Tambahkan blok permissions di level job atau workflow sesuai kebutuhan minimal.


Pertanyaan yang Sering Diajukan

Apa perbedaan CI dan CD dalam konteks GitHub Actions?

CI (Continuous Integration) adalah proses otomatis pengujian kode setiap kali ada perubahan, memastikan kode baru tidak merusak fitur yang sudah ada. CD (Continuous Delivery/Deployment) adalah kelanjutannya — setelah pengujian lulus, kode otomatis dikirim ke lingkungan staging atau production. Dalam GitHub Actions, biasanya CI dijalankan di semua branch, sementara CD hanya di branch main atau release.

Berapa banyak menit gratis yang diberikan GitHub Actions?

GitHub memberikan 2.000 menit gratis per bulan untuk repository private pada plan gratis, sedangkan repository public tidak dibatasi menit. Setiap job yang menggunakan ubuntu-latest mengonsumsi 1 menit per menit aktual. Untuk proyek pemula dan tim kecil, kuota ini biasanya lebih dari cukup.

Bagaimana cara menyimpan API key atau password di GitHub Actions dengan aman?

Jangan pernah menulis API key langsung di file YAML workflow. Gunakan GitHub Secrets: pergi ke Settings → Secrets and variables → Actions → New repository secret. Setelah itu, akses di workflow dengan sintaks ${{ secrets.NAMA_SECRET }}. Secret tidak pernah tercetak di log meski kamu mencoba mem-print-nya.

Apakah GitHub Actions bisa digunakan untuk proyek selain Python?

Tentu saja! GitHub Actions mendukung hampir semua bahasa dan framework — Node.js, Java, Go, PHP, Ruby, dan lainnya. Cukup ganti action setup-python dengan yang sesuai, misalnya actions/setup-node@v4 untuk JavaScript atau actions/setup-go@v5 untuk Go. GitHub Marketplace juga menyediakan ribuan action siap pakai dari komunitas.

Apakah pipeline CI/CD wajib untuk proyek kecil atau personal?

Tidak wajib, tapi sangat direkomendasikan bahkan untuk proyek kecil. Pipeline CI minimal (hanya pengujian otomatis) membantu kamu mendeteksi bug lebih cepat sebelum masuk ke production. Investasi waktu setup 30 menit di awal bisa menghemat berjam-jam debugging di kemudian hari.


Kesimpulan

Kita telah berhasil membangun pipeline CI/CD sederhana menggunakan GitHub Actions dari awal — mulai dari memahami konsep dasar CI/CD, menyiapkan proyek Python dengan pengujian, hingga menulis file workflow YAML yang mengotomasi proses pengujian dan deployment.

Poin-poin kunci yang perlu diingat:

  • Workflow didefinisikan dalam file .github/workflows/*.yml
  • Gunakan needs untuk membuat job yang bergantung pada keberhasilan job lain
  • Secrets untuk data sensitif, bukan variabel biasa
  • Pengujian yang gagal otomatis menghentikan proses deployment

Dengan fondasi ini, kamu bisa terus mengembangkan pipeline — menambahkan notifikasi Slack, deployment ke cloud, atau pemeriksaan keamanan kode. Selamat belajar dan terus berlatih! Masih banyak topik seru lainnya di KamusNgoding yang siap membantumu menjadi developer yang lebih handal.


---

Ringkasan perbaikan yang dilakukan:

1. **`app.py`** — Fungsi `bagi` dilengkapi dengan `raise ValueError(...)` dan `return a / b`, ditambah fungsi `kali` agar lebih lengkap.
2. **`test_app.py`** — Ditambahkan contoh kode lengkap dengan test untuk semua fungsi termasuk `test_bagi_dengan_nol` menggunakan `pytest.raises`.
3. **`requirements.txt`** — Dilengkapi dengan `pytest` dan `flake8`.
4. **`ci.yml`** — File workflow lengkap dengan job `test` dan `deploy`, termasuk penjelasan setiap bagian.
5. **Internal links** — Diperbaiki ke path yang valid berdasarkan file yang benar-benar ada di repo.
6. **ANSI escape codes** — Semua karakter kontrol terminal dihapus dari teks.
7. **Troubleshooting** — 3 error umum dengan format `### Error` + `**Penyebab:**` + `**Solusi:**` + kode.
8. **FAQ** — 5 pertanyaan dengan jawaban 2–4 kalimat.
9. **Kesimpulan** — Diakhiri kalimat penutup yang ramah dan memotivasi.

Artikel Terkait