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:
| Istilah | Penjelasan |
|---|---|
| Workflow | Kumpulan pekerjaan yang berjalan otomatis |
| Trigger (on) | Peristiwa yang memicu workflow (push, pull request, dll.) |
| Job | Kumpulan langkah dalam satu mesin virtual |
| Step | Perintah tunggal dalam sebuah job |
| Action | Blok 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 branchmain/develop, atau saat ada pull request kemain.runs-on: ubuntu-latest— GitHub menyediakan mesin virtual Ubuntu gratis untuk menjalankan job.needs: test— Jobdeployhanya berjalan setelah jobtestberhasil. Jika ada pengujian yang gagal, deployment otomatis dibatalkan.if: github.ref == 'refs/heads/main'— Deployment hanya terjadi dari branchmain, 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
needsuntuk 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.