Setiap kali kamu git push, ada serangkaian pekerjaan yang sebaiknya berjalan otomatis: menjalankan test, memastikan kode tidak error, membangun image Docker, hingga men-deploy ke server. Kalau semuanya dikerjakan manual, proyek akan cepat berantakan dan rawan kesalahan manusia. Di sinilah GitHub Actions hadir — layanan CI/CD bawaan GitHub yang memungkinkanmu mengotomatiskan seluruh alur kerja hanya dengan satu file YAML. Dalam tutorial ini kamu akan membangun pipeline CI/CD lengkap dari nol: dari test otomatis hingga push Docker image, langkah demi langkah.
Apa Itu GitHub Actions?
GitHub Actions adalah platform otomatisasi yang berjalan langsung di dalam repository GitHub-mu. Kamu cukup mendefinisikan serangkaian perintah dalam file YAML, dan GitHub akan mengeksekusinya setiap kali terjadi event tertentu — misalnya saat kamu push, membuka pull request, membuat tag rilis, atau bahkan sesuai jadwal (cron).
Konsepnya sederhana: event memicu workflow, workflow berisi satu atau lebih job, dan setiap job terdiri dari beberapa step yang dijalankan di atas mesin virtual bernama runner. Semua job berjalan paralel secara default, sementara step di dalam satu job berjalan berurutan.
Istilah kunci: Event = pemicu (push, PR, jadwal). Workflow = file YAML di folder .github/workflows. Job = kumpulan langkah yang berjalan di satu runner. Step = perintah atau aksi individual. Runner = mesin (Ubuntu/Windows/macOS) yang mengeksekusi job.
Prasyarat
Untuk mengikuti tutorial ini, kamu hanya butuh tiga hal: (1) akun GitHub, (2) sebuah repository tempat kita menaruh kode, dan (3) pemahaman dasar Git. Jika kamu belum familiar dengan Git, baca dulu Panduan Git untuk Pemula — artikel ini mengasumsikan kamu sudah bisa clone, commit, dan push.
Struktur Dasar Workflow
Workflow GitHub Actions disimpan di folder .github/workflows/ di dalam repository-mu dengan ekstensi .yml. Begitu file tersebut ter-push ke GitHub, Actions otomatis mengenalinya dan siap dijalankan. Berikut kerangka dasar sebuah workflow:
name: Nama Workflow
on:
push:
branches: [ main ]
jobs:
nama-job:
runs-on: ubuntu-latest
steps:
- run: echo "Halo, CI/CD!"
Bagian name hanyalah label yang tampil di tab Actions. Bagian on menentukan kapan workflow dipicu. Bagian jobs berisi pekerjaan yang akan dijalankan, masing-masing dengan runs-on (jenis runner) dan daftar steps.
Workflow Pertama: Hello CI
Mari mulai dari yang paling sederhana. Buat folder .github/workflows/ di root repository-mu, lalu buat file ci.yml dengan isi berikut:
name: CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout kode
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Install dependensi
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Jalankan test
run: pytest
Simpan, commit, lalu push ke branch main. Buka tab Actions di repository GitHub-mu — kamu akan melihat workflow CI sedang berjalan. Klik nama run untuk melihat log setiap step secara real-time.
Workflow di atas melakukan tiga hal: men-checkout kode, menyiapkan Python 3.12, lalu menjalankan pytest. Ini adalah pola paling umum dalam CI: ambil kode → pasang dependensi → jalankan test.
Menjalankan Test Otomatis dengan Pytest
Contoh di atas memanggil pytest, jadi pastikan proyekmu punya test yang bisa dijalankan. Buat file test_math.py sederhana seperti ini:
# test_math.py
def test_penjumlahan():
assert 1 + 1 == 2
def test_perkalian():
assert 3 * 4 == 12
Lalu daftarkan pytest di requirements.txt bersama dependensi lain. Sekarang, setiap kali kamu push, GitHub Actions otomatis menjalankan test ini — jika ada yang gagal, kamu langsung mendapat notifikasi dan tanda silang merah pada commit. Jika kamu baru belajar menulis test, kami punya panduan lengkap di Belajar Testing Python dengan Pytest.
Mempercepat Workflow dengan Caching
Setiap job berjalan di mesin yang bersih, artinya dependensi selalu diunduh ulang dari nol. Untuk proyek besar ini bisa memakan waktu lama. Untungnya, actions/setup-python punya opsi cache yang menyimpan hasil instalasi pip antar-run:
- name: Setup Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: pip
Dengan cache: pip, GitHub akan memulihkan paket yang sudah pernah diunduh sehingga run berikutnya jauh lebih cepat. Cara kerjanya otomatis membaca requirements.txt sebagai kunci cache — kalau file itu berubah, cache dibuat ulang.
Build & Push Docker Image ke Registry
Setelah test lolos, langkah berikutnya biasanya membangun image Docker dan mendorongnya ke registry seperti Docker Hub atau GHCR. Jika kamu belum mengenal Docker, mulailah dari Belajar Docker untuk Pemula. Berikut workflow yang membangun dan meng-push image setiap kali kamu membuat tag rilis v*:
name: Build & Push Docker Image
on:
push:
tags: [ 'v*' ]
jobs:
docker:
runs-on: ubuntu-latest
steps:
- name: Checkout kode
uses: actions/checkout@v4
- name: Login ke Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build & push image
uses: docker/build-push-action@v6
with:
push: true
tags: ${{ secrets.DOCKER_USERNAME }}/flask-app:latest
Perhatikan penggunaan ${{ secrets.DOCKER_USERNAME }} — ini cara aman menyisipkan kredensial tanpa menulisnya langsung di file workflow yang bisa dilihat publik.
Menyimpan Secret dengan Aman
Jangan pernah menulis token atau password langsung di file YAML — file itu tersimpan di repository dan bisa bocor. Sebagai gantinya, simpan sebagai encrypted secret. Buka Settings → Secrets and variables → Actions → New repository secret, lalu tambahkan misalnya DOCKER_USERNAME dan DOCKER_PASSWORD.
Jangan pernah commit kredensial apa pun (token API, password, SSH key) ke repository, apalagi yang publik. Sekali ter-push ke riwayat Git, ia sulit dihapus tuntas. Selalu gunakan secrets GitHub dan file .env yang di-ignore.
Matrix Build: Uji Banyak Versi Sekaligus
Sering kali kamu ingin memastikan kode berjalan di beberapa versi Python sekaligus. Alih-alih menulis banyak job yang hampir sama, gunakan matrix:
name: Test Multi-Versi Python
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pip install -r requirements.txt
- run: pytest
GitHub akan menjalankan job yang sama untuk Python 3.10, 3.11, dan 3.12 secara paralel. Ini cara standar menguji kompatibilitas lintas versi tanpa menulis ulang workflow.
Menambahkan Status Badge di README
Agar status CI terlihat langsung dari halaman utama repository, tambahkan badge ke README.md:
[](https://github.com/USERNAME/REPO/actions/workflows/ci.yml)
Ganti USERNAME dan REPO dengan milikmu. Sekarang setiap orang yang mengunjungi repository langsung tahu apakah test terakhir lolos atau gagal.
Tips: Mulailah dari yang kecil — satu workflow untuk test sudah memberi nilai besar. Tambahkan build image dan deploy secara bertahap setelah kamu nyaman. Kamu juga bisa menjadwalkan workflow (misalnya nightly build) dengan pemicu schedule yang memakai sintaks cron.
Kesimpulan
GitHub Actions adalah pintu masuk paling mudah ke dunia CI/CD: gratis untuk repository publik, langsung terintegrasi dengan GitHub, dan didukung ribuan action siap pakai di marketplace. Dengan satu file YAML, kamu sudah bisa menjalankan test, membangun image Docker, hingga deploy otomatis setiap kali ada perubahan kode. Praktikkan sekarang di salah satu proyekmu dan rasakan bedanya — kode yang teruji otomatis jauh lebih percaya diri untuk di-release.
Apakah GitHub Actions gratis?
Ya, GitHub Actions gratis untuk repository publik. Untuk repository privat, kamu mendapat kuota menit runner gratis setiap bulan (tergantung plan), dan kamu bisa menambahnya dengan langganan berbayar.
Apakah workflow langsung berjalan otomatis setelah push?
Ya. Begitu file workflow di folder .github/workflows/ ter-push ke branch yang sesuai dengan pemicu on, Actions akan langsung mengeksekusinya. Kamu bisa memantau progresnya di tab Actions.
Bisakah GitHub Actions dipakai selain untuk proyek Python?
Tentu. GitHub Actions bersifat agnostik bahasa — kamu bisa menjalankan test untuk JavaScript, Go, Rust, Java, dan lainnya, membangun aplikasi mobile, hingga deploy ke AWS, Vercel, atau server sendiri.