Dasar Workflow
Workflow Minimal
# .github/workflows/ci.yml name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "Hello from CI"
Konsep Utama
WorkflowFile YAML di .github/workflows/ yang mendefinisikan otomasi
EventTrigger yang memulai workflow (push, PR, jadwal, dll.)
JobKumpulan step yang berjalan di runner yang sama
StepTugas individual — menjalankan perintah atau menggunakan action
RunnerVM yang menjalankan job (ubuntu-latest, macos-latest, windows-latest)
ActionUnit kode yang bisa digunakan ulang, direferensikan dengan uses:
Trigger
Event Umum
on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 6 * * 1" # every Monday 6 AM UTC workflow_dispatch: # manual trigger
Filter Event
branches:Trigger hanya untuk branch tertentu
paths:Trigger hanya saat file yang cocok berubah
tags:Trigger saat push tag (v*)
types: [opened, synchronize]Filter tipe aktivitas PR
branches-ignore:Kecualikan branch tertentu
paths-ignore:Kecualikan path file tertentu
Job & Step
Konfigurasi Job
jobs: test: runs-on: ubuntu-latest needs: build # depends on build job if: github.ref == 'refs/heads/main' timeout-minutes: 10 steps: - uses: actions/checkout@v4 - run: npm test
Tipe Step
run:Jalankan perintah shell
uses:Gunakan action yang sudah dipublikasikan
with:Teruskan input ke action
name:Nama tampilan di UI
id:Referensikan output step via steps..outputs
if:Eksekusi kondisional
continue-on-error: trueJangan gagalkan job jika step gagal
Action
Menggunakan Action
steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - uses: ./.github/actions/my-action # local action
Action Populer
actions/checkout@v4Checkout kode repository
actions/setup-node@v4Install Node.js
actions/setup-python@v5Install Python
actions/upload-artifact@v4Upload artifact build
actions/download-artifact@v4Unduh artifact dari job lain
actions/cache@v4Cache dependensi antar run
actions/github-script@v7Jalankan JS dengan klien GitHub API
Environment Variable
Mengatur Variabel
env: # workflow-level NODE_ENV: production jobs: build: env: # job-level CI: true steps: - run: echo "$MY_VAR" env: # step-level MY_VAR: hello
Variabel Default
github.shaSHA commit yang memicu workflow
github.refRef branch atau tag (refs/heads/main)
github.repositoryNama owner/repo
github.actorUser yang memicu workflow
github.event_nameEvent yang memicu workflow
runner.osOS runner (Linux, macOS, Windows)
Secret
Menggunakan Secret
steps: - run: deploy --token "$TOKEN" env: TOKEN: ${{ secrets.DEPLOY_TOKEN }} - uses: some/action@v1 with: api-key: ${{ secrets.API_KEY }}
Aturan Secret
secrets.GITHUB_TOKENToken yang dibuat otomatis, dicakup ke repo
Settings → SecretsTambah secret di pengaturan repo atau org
MaskingNilai secret disembunyikan di log secara otomatis
Environment secretsDicakup ke environment deployment
Org secretsDibagikan ke seluruh repo dalam organisasi
Matrix Strategy
Matrix Build
jobs: test: strategy: matrix: os: [ubuntu-latest, macos-latest] node: [18, 20] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }}
Opsi Matrix
matrix:Definisikan kombinasi variabel yang akan di-expand
include:Tambah kombinasi tambahan ke matrix
exclude:Hapus kombinasi tertentu
fail-fast: falseLanjutkan job lain jika satu gagal
max-parallel: 2Batasi job matrix yang berjalan bersamaan
Caching
Cache Dependensi
- uses: actions/cache@v4 with: path: ~/.npm key: npm-${{ hashFiles('package-lock.json') }} restore-keys: npm-
Caching Bawaan
- uses: actions/setup-node@v4 with: node-version: 20 cache: npm # auto-cache for npm/yarn/pnpm - uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip # auto-cache for pip
Artifact
Upload & Download
- uses: actions/upload-artifact@v4 with: name: build-output path: dist/ retention-days: 7 - uses: actions/download-artifact@v4 with: name: build-output
Catatan Artifact
retention-daysHapus otomatis setelah N hari (default 90)
pathFile atau direktori yang diunggah (mendukung glob)
Lintas-jobUpload di satu job, download di job lain dengan needs:
compression-level0 (tidak ada) hingga 9 (maksimal), default 6
Pola Umum
Deployment Kondisional
- name: Deploy to production if: github.ref == 'refs/heads/main' run: ./deploy.sh - name: Post PR comment if: github.event_name == 'pull_request' run: gh pr comment $PR --body "Build passed"
Ekspresi Berguna
success()True jika semua step sebelumnya berhasil
failure()True jika ada step sebelumnya yang gagal
always()Jalankan terlepas dari status (cleanup)
cancelled()True jika workflow dibatalkan
contains(github.ref, 'release')Pemeriksaan contains string
startsWith(github.ref, 'refs/tags')Pemeriksaan prefix string
hashFiles('**/lock*')SHA-256 file (untuk cache key)