GitHub Actions adalah layanan CI/CD bawaan GitHub. Kamu menulis workflow dalam file YAML di repo, dan setiap kali sebuah event terjadi (misalnya push), GitHub menyalakan mesin baru dan menjalankan langkah-langkahnya. Ingat dapur katering di pelajaran Apa itu CI/CD? Workflow adalah lembar SOP yang ditempel di dinding dapurnya: kapan dikerjakan (setiap ada pesanan baru), di dapur mana (koki baru dengan dapur kosong), dan langkahnya satu per satu.
🧪 Tebakan cepat: step pertama workflow-mu langsung
run: npm ci, tanpaactions/checkout. Lulus atau gagal? Tebak dulu, jawabannya ada di bagian "Runner mulai dari mesin kosong".
File workflow ada di .github/workflows
GitHub cuma membaca workflow dari folder .github/workflows/ di root repo. Setiap file .yml atau .yaml di situ adalah satu workflow. Ini ci.yml milik catatan-api, sama dengan yang ada di Lab:
# .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npm test
Sedikit YAML dulu: kunci: nilai per baris, isi yang menjorok (pakai spasi, bukan tab) adalah milik kunci di atasnya, baris diawali - adalah satu item daftar, dan [main] adalah daftar yang ditulis dalam satu baris.
name: CI: nama workflow yang tampil di tab Actions.on: event yang memicu workflow.jobs: daftar job.testadalah id job-nya, kamu bebas memberi nama.runs-on: ubuntu-latest: job ini jalan di runner, mesin virtual Ubuntu yang disiapkan GitHub.steps: langkah-langkahnya, dijalankan berurutan dari atas.
on: kapan workflow jalan
pushdenganbranches: [main]: jalan setiap ada commit yang di-push kemain. Push ke branch lain gak memicu apa pun.pull_requestdenganbranches: [main]: jalan waktu pull request kemaindibuka, dan setiap kali PR itu dapat commit baru. Yang dicocokkan adalah branch tujuan PR-nya.- Tanpa filter cabang, bentuknya bisa lebih pendek:
on: push, atau beberapa event sekaliguson: [push, pull_request]. - Event lain yang sering dipakai:
workflow_dispatch(tombol "Run workflow" manual) danschedule(jadwal cron).
Di latihannya kamu membaca format sederhana buatan latihan, on: push, pull_request, yang dipisah koma. Di file workflow asli, daftar seperti itu ditulis dengan kurung siku: on: [push, pull_request].
steps: uses atau run
Setiap step memakai salah satu dari dua kunci ini:
usesmenjalankan action, yaitu kode siap pakai buatan orang lain, ditulispemilik/repo@versi.actions/checkout@v4mengambil kode repo-mu,actions/setup-node@v4memasang Node.with:memberi input ke action, misalnyanode-version: 20.runmenjalankan perintah shell di runner, persis seperti di terminal:npm ci,npm test.name:boleh ditambahkan untuk label di log. Tanpaname, GitHub menulis "Run actions/checkout@v4" atau "Run npm ci".
Kalau tertukar, hasilnya beda. run: actions/checkout@v4 dijalankan bash sebagai perintah, dan gagal dengan actions/checkout@v4: No such file or directory (exit code 127). uses: npm test bahkan gak sempat jalan, karena GitHub menolak file-nya: Expected format {org}/{repo}[/path]@ref. Actual 'npm test'.
Runner mulai dari mesin kosong
Setiap job dapat mesin baru yang bersih. Belum ada kode repo-mu di sana. Itulah tugas actions/checkout: menyalin repo ke folder kerja runner, /home/runner/work/catatan-api/catatan-api. Tanpa checkout, npm ci gak menemukan package.json:
Run npm ci
npm error code ENOENT
npm error syscall open
npm error path /home/runner/work/catatan-api/catatan-api/package.json
npm error errno -2
npm error enoent Could not read package.json: Error: ENOENT: no such file or directory, open '/home/runner/work/catatan-api/catatan-api/package.json'
Error: Process completed with exit code 254.
Jadi jawabannya gagal. Itu jawaban tebakannya. Step yang gagal menghentikan job: step sesudahnya dilewati.
Membaca log Actions
Buka tab Actions, pilih run-nya, lalu job test. Untuk workflow di atas, setelah push ke main, daftar step-nya begini:
✓ Set up job
✓ Run actions/checkout@v4
✓ Run actions/setup-node@v4
✓ Run npm ci
✓ Run npm test
✓ Post Run actions/setup-node@v4
✓ Post Run actions/checkout@v4
✓ Complete job
- "Set up job" dan "Complete job" ditambahkan GitHub: menyiapkan dan membereskan runner.
- "Post Run ..." adalah langkah beres-beres milik action, dijalankan di akhir dengan urutan terbalik.
- Klik satu step untuk membuka log-nya. Step
rundiawali perintahnya danshell: /usr/bin/bash -e {0}. Kalau ada yang gagal, baris terakhirnyaError: Process completed with exit code ..., dan alasannya ada di atas baris itu.
Urutan job dengan needs, test di beberapa versi Node dengan matrix, dan branch protection dibahas di pelajaran Testing di CI/CD Pipeline. Pelajaran berikutnya, GitHub Actions Advanced, melanjutkan ke cache, environment, dan secret.
⚠️ Jebakan yang sering ketemu
- Folder salah.
.github/workflow/(tanpa s) ataugithub/workflows/(tanpa titik) diabaikan GitHub tanpa pesan apa pun. - Tab untuk indentasi. YAML cuma menerima spasi. GitHub menolak file-nya dengan
You have an error in your yaml syntax on line .... branch:bukanbranches:. Kuncinya jamak. Salah tulis ditolak denganUnexpected value 'branch'.- Lupa checkout. Runner kosong, jadi setiap perintah yang butuh file repo gagal.
usesdanruntertukar. Action pakaiuses, perintah terminal pakairun.
TL;DR: Workflow GitHub Actions ditulis dalam YAML di .github/workflows/. on menentukan event pemicunya (push dan pull_request, dengan branches: [main] untuk membatasi branch), jobs berisi job yang masing-masing jalan di runner baru (runs-on: ubuntu-latest), dan steps berjalan berurutan. uses: pemilik/repo@versi menjalankan action (misalnya actions/checkout@v4, wajib di awal karena runner mulai kosong), run: menjalankan perintah shell. Step yang gagal menghentikan job, dan alasannya ada tepat di atas Error: Process completed with exit code ....