Quick reference GitHub Actions. Workflow syntax, common triggers, jobs, steps, secrets, caching, dan CI/CD best practices.
Struktur dasar workflow GitHub Actions yang terdiri dari nama, trigger, jobs, dan steps untuk menjalankan automasi.
name: Workflow Name
on: [push, pull_request]
jobs:
job-name:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- run: echo "Hello World"Berbagai cara untuk memicu workflow berjalan, seperti push, pull request, schedule, atau manual trigger.
# Push to branches
on:
push:
branches: [ main, develop ]
tags: [ 'v*' ]
paths:
- 'src/**'
- '!docs/**'
# Pull requests
on:
pull_request:
types: [opened, synchronize, reopened]
branches: [ main ]
# Schedule (cron)
on:
schedule:
- cron: '0 0 * * *' # Daily at midnight UTC
- cron: '0 */6 * * *' # Every 6 hours
# Manual trigger
on:
workflow_dispatch:
inputs:
environment:
description: 'Deploy environment'
required: true
type: choice
options: [staging, production]
# Multiple events
on: [push, pull_request, workflow_dispatch]
# Workflow call (reusable)
on:
workflow_call:
inputs:
config-path:
required: true
type: stringRunner adalah mesin tempat workflow berjalan, bisa menggunakan GitHub-hosted atau self-hosted runner.
# GitHub-hosted
runs-on: ubuntu-latest # Ubuntu (most common)
runs-on: windows-latest # Windows
runs-on: macos-latest # macOS
runs-on: ubuntu-22.04 # Specific version
# Matrix
runs-on: ${{ matrix.os }}
# Self-hosted
runs-on: self-hosted
runs-on: [self-hosted, linux, x64]Environment variables memungkinkan kita menyimpan konfigurasi yang bisa digunakan di berbagai level workflow.
# Workflow level
env:
NODE_ENV: production
jobs:
build:
# Job level
env:
API_URL: https://api.example.com
steps:
# Step level
- run: npm build
env:
BUILD_ENV: staging
# Use variables
- run: echo "API is $API_URL"
- run: echo "Node env is ${{ env.NODE_ENV }}"Secrets menyimpan informasi sensitif seperti API keys yang tidak boleh terlihat di kode workflow.
# Use secrets
- run: npm run deploy
env:
API_KEY: ${{ secrets.API_KEY }}
DATABASE_URL: ${{ secrets.DATABASE_URL }}
# GitHub token (auto-provided)
- run: gh api /user
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}Matrix strategy memungkinkan menjalankan workflow dengan kombinasi parameter berbeda secara paralel.
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
node-version: [18, 20, 22]
# Creates 9 jobs (3 × 3)
fail-fast: true # Stop all if one fails
max-parallel: 2 # Run max 2 jobs simultaneously
steps:
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}Actions adalah komponen reusable yang memudahkan setup environment dan melakukan tugas-tugas umum.
Action untuk mengambil kode dari repository ke dalam runner.
- uses: actions/checkout@v5
with:
fetch-depth: 0 # Full history
submodules: true # Include submodulesActions untuk setup bahasa pemrograman seperti Node.js, Python, Go, dan Java dengan versi tertentu.
# Node.js
- uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
# Python
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip'
# Go
- uses: actions/setup-go@v5
with:
go-version: '1.21'
# Java
- uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'Caching mempercepat build dengan menyimpan dependencies yang sudah di-install sebelumnya.
# Automatic (Node.js)
- uses: actions/setup-node@v6
with:
node-version: '20'
cache: 'npm'
# Manual
- uses: actions/cache@v4
with:
path: |
~/.npm
node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-Artifacts memungkinkan menyimpan dan berbagi file hasil build antar jobs atau workflow.
# Upload
- uses: actions/upload-artifact@v4
with:
name: build-files
path: dist/
retention-days: 7
# Download
- uses: actions/download-artifact@v4
with:
name: build-files
path: dist/Job dependencies mengatur urutan eksekusi jobs agar jobs tertentu menunggu jobs lain selesai.
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: npm build
test:
needs: build # Wait for build
runs-on: ubuntu-latest
steps:
- run: npm test
deploy:
needs: [build, test] # Wait for both
runs-on: ubuntu-latest
steps:
- run: npm run deployConditionals memungkinkan menjalankan jobs atau steps berdasarkan kondisi tertentu seperti branch atau event.
# Job level
jobs:
deploy:
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
# Step level
steps:
- name: Deploy to production
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
run: npm run deploy
# Common conditions
- if: success() # Previous steps succeeded
- if: failure() # Previous steps failed
- if: always() # Always run
- if: cancelled() # Workflow cancelled
# Check actor
- if: github.actor != 'dependabot[bot]'
run: npm test
# Check event
- if: github.event_name == 'pull_request'
run: echo "This is a PR"Outputs memungkinkan jobs berbagi data hasil eksekusi dengan jobs lain dalam workflow.
jobs:
build:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.get-version.outputs.version }}
steps:
- id: get-version
run: echo "version=1.2.3" >> $GITHUB_OUTPUT
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- run: echo "Deploying version ${{ needs.build.outputs.version }}"Concurrency mengatur agar workflow yang sama tidak berjalan bersamaan, membatalkan yang lama saat yang baru dimulai.
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # Cancel old runs on new pushPermissions mengatur hak akses workflow terhadap repository dan API GitHub.
permissions:
contents: write # Push to repo
pull-requests: write # Comment on PRs
issues: write # Manage issues
packages: write # Publish packages
deployments: write # Create deploymentsTimeouts membatasi waktu eksekusi jobs dan steps untuk mencegah workflow berjalan terlalu lama.
jobs:
build:
runs-on: ubuntu-latest
timeout-minutes: 10 # Job timeout
steps:
- run: npm test
timeout-minutes: 5 # Step timeoutDocker actions memungkinkan menggunakan container atau build/push Docker images dalam workflow.
# Use container
jobs:
build:
runs-on: ubuntu-latest
container:
image: node:20-alpine
env:
NODE_ENV: production
# Build & push Docker image
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- uses: docker/build-push-action@v5
with:
context: .
push: true
tags: user/app:latest
cache-from: type=gha
cache-to: type=gha,mode=maxReusable workflows memungkinkan membuat workflow yang bisa digunakan ulang di berbagai repository atau workflow lain.
# .github/workflows/reusable.yml
on:
workflow_call:
inputs:
environment:
required: true
type: string
outputs:
result:
value: ${{ jobs.deploy.outputs.result }}
jobs:
deploy:
runs-on: ubuntu-latest
outputs:
result: ${{ steps.deploy.outputs.status }}
steps:
- run: echo "Deploying to ${{ inputs.environment }}"# .github/workflows/main.yml
jobs:
call-workflow:
uses: ./.github/workflows/reusable.yml
with:
environment: productionContext variables menyediakan informasi tentang event, repository, dan environment yang bisa digunakan dalam workflow.
# GitHub context
${{ github.event_name }} # push, pull_request, etc.
${{ github.ref }} # refs/heads/main
${{ github.sha }} # Commit SHA
${{ github.actor }} # User who triggered
${{ github.repository }} # owner/repo
${{ github.workspace }} # /home/runner/work/repo/repo
# Runner context
${{ runner.os }} # Linux, Windows, macOS
${{ runner.arch }} # X64, ARM, ARM64
${{ runner.temp }} # Temp directory
# Job context
${{ job.status }} # success, failure, cancelled
# Steps context
${{ steps.step-id.outputs.value }}
${{ steps.step-id.conclusion }} # success, failureCommon patterns menunjukkan contoh workflow yang sering digunakan untuk berbagai jenis proyek.
Workflow standar untuk continuous integration aplikasi Node.js dengan testing dan linting.
name: Node.js CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18, 20, 22]
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v6
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm test
- run: npm run lintWorkflow yang otomatis deploy aplikasi ketika ada tag baru (release) dibuat.
name: Release
on:
push:
tags: ['v*']
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- run: npm ci
- run: npm run build
- run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}Workflow untuk memberikan komentar otomatis pada pull request.
- uses: actions/github-script@v7
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: 'Build successful!'
})Workflow untuk otomatis memberikan label pada pull request berdasarkan file yang diubah.
- uses: actions/labeler@v5
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}Teknik-teknik debugging untuk memecahkan masalah dalam workflow GitHub Actions.
# Debug step
- name: Debug
run: |
echo "Event: ${{ github.event_name }}"
echo "Ref: ${{ github.ref }}"
echo "SHA: ${{ github.sha }}"
env
# Enable debug logs
# Set repository secrets:
# ACTIONS_RUNNER_DEBUG = true
# ACTIONS_STEP_DEBUG = truePanduan praktik terbaik untuk membuat workflow GitHub Actions yang efisien dan aman.
@v4, not @main)Tabel daftar actions populer yang sering digunakan dalam workflow.
| Action | Purpose |
|---|---|
actions/checkout@v5 | Checkout code |
actions/setup-node@v6 | Setup Node.js |
actions/cache@v4 | Cache dependencies |
actions/upload-artifact@v4 | Save build outputs |
docker/build-push-action@v5 | Build & push Docker |
aws-actions/configure-aws-credentials@v4 | AWS auth |
google-github-actions/auth@v2 | GCP auth |
azure/login@v2 | Azure auth |
Link-link berguna untuk belajar GitHub Actions lebih dalam.
Happy automating!
Login atau daftar akun gratis untuk membaca cheat sheet ini.