Github Actions merupakan layanan CI/CD yang disediakan oleh Github. Github Actions memungkinkan kita untuk membuat workflow yang dapat dijalankan ketika terjadi perubahan pada repository. Dokumentasi dari Github Actions dapat diakses di sini.
Github Actions terdiri dari beberapa komponen sebagai berikut.
-
Workflows Workflow adalah kumpulan dari beberapa job yang dijalankan secara bersamaan atau berurutan. Workflow disimpan dalam file YAML pada direktori
.github/workflows/
di repository. -
Events Events adalah trigger yang menyebabkan workflow dijalankan. Beberapa contoh events adalah push, pull request, dan issue.
-
Jobs Jobs adalah kumpulan dari beberapa step yang dijalankan secara bersamaan pada runner yang sama. Jobs dapat dijalankan secara bersamaan atau berurutan.
-
Actions Actions adalah perintah yang dijalankan pada runner. Actions dapat berupa perintah bash, perintah npm, atau action yang telah dibuat oleh pengguna. Actions dapat dibuat sendiri atau menggunakan action yang telah dibuat oleh pengguna lain.
-
Runners Runners adalah mesin yang menjalankan workflow. Runner dapat berupa runner yang disediakan oleh Github atau runner yang dihosting sendiri.
Bagaimana cara membuat workflow pada Github Actions?
Berikut contoh cara membuat workflow pada Github Actions.
-
Buat file
check-version.yml
pada direktori.github/workflows/
di repository. -
Isi file dengan kode berikut.
name: check-version run-name: ${{ github.actor }} is learning GitHub Actions on: [push] jobs: check-bats-version: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" - run: npm install -g bats - run: bats -v
-
Push file ke repository.
-
Buka tab Actions pada repository.
Expression adalah cara untuk mengakses konteks pada workflow. Untuk menggunakan expression diperlukan sintaks berikut ${{ <expression> }}
. Berikut adalah beberapa contoh expression yang sering digunakan.
- Literals
${{ null }}
${{ true }}
${{ 2.78 }}
- Operators
${{ 1 + 1 }}
${{ 2 > 1 }}
${{ 2 == 2 }}
- Context
${{ github.actor }}
${{ github.repository }}
${{ github.event_name }}
- Functions
${{ format('Hello, {0}', github.actor) }}
${{ toJson(github) }}
${{ steps.<step_id>.outputs.<output_name> }}
Untuk detail lebih lengkap mengenai expressions dapat dilihat di sini.
Context adalah informasi yang dapat diakses pada workflow. Context dapat berupa informasi tentang repository, event, atau runner. Context dapat diakses menggunakan expression. Detail context yang dapat digunakan dalam Github Action dapat dilihat di sini.
Variabel adalah cara untuk menyimpan nilai yang dapat digunakan pada workflow. Variabel dapat ditambahkan langsung pada file workflow atau dari Github Secrets. Berikut adalah contoh deklarasi variabel pada workflow.
name: Variabel
on: [push]
env:
DAY_OF_WEEK: Monday
jobs:
greeting_job:
runs-on: ubuntu-latest
env:
Greeting: Hello
steps:
- name: "Say Hello Mona it's Monday"
if: ${{ env.DAY_OF_WEEK == 'Monday' }}
run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
env:
First_Name: Mona
Variabel hanya dapat diakses dalam scope yang sama. Sebagai contoh, variabel Greeting
hanya dapat diakses pada job greeting_job
dan variabel First_Name
hanya dapat diakses pada step Say Hello Mona it's Monday
.
Untuk menambahkan secrets atau variabel dalam repository, dapat dilakukan dengan cara berikut.
Secrets atau variables yang ditambahkan dapat diakses seperti pada contoh berikut.
name: Variable
on: [push]
env:
DAY_OF_WEEK: ${{ secrets.DAY_OF_WEEK }}
jobs:
greeting_job:
runs-on: ubuntu-latest
env:
Greeting: Hello
steps:
- name: "Say Hello Mona it's Monday"
if: ${{ env.DAY_OF_WEEK == 'Monday' }}
run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
env:
First_Name: Mona
Untuk detail lebih lengkap mengenai variabel pada Github Actions dapat dilihat di sini.
Cache dependencies adalah cara untuk menyimpan dependencies yang telah diinstall pada runner. Cache dependencies dapat digunakan untuk mengurangi waktu yang dibutuhkan untuk menjalankan workflow. Beberapa dependencies yang tertera pada list berikut dapat langsung dikonfigurasi dengan menggunakan setup-*
action.
Package Managers | Cache Dependency Action |
---|---|
npm, yarn, pnpm | setup-node |
pip, pipenv, poetry | setup-python |
gradle, maven | setup-java |
RubyGems | setup-ruby |
go.sum | setup-go |
.NET NuGet | setup-dotnet |
Cache juga dapat dilakukan secara manual menggunakan action cache
. Berikut adalah contoh penggunaan cache dependencies.
name: Caching with npm
on: push
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Cache node modules
id: cache-npm
uses: actions/cache@v3
env:
cache-name: cache-node-modules
with:
# npm cache files are stored in `~/.npm` on Linux/macOS
path: ~/.npm
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-build-${{ env.cache-name }}-
${{ runner.os }}-build-
${{ runner.os }}-
- if: ${{ steps.cache-npm.outputs.cache-hit != 'true' }}
name: List the state of node modules
continue-on-error: true
run: npm list
- name: Install dependencies
run: npm install
- name: Build
run: npm run build
- name: Test
run: npm test
Penjelasan lebih lengkap mengenai cache dependencies dapat dilihat di sini.
File yang dihasilkan dari workflow disebut sebagai artifacts. Mirip dengan cache, artifact juga dapat diakses melalui beberapa jobs. Perbedaan penggunaan cache dan artifact adalah sebagai berikut.
-
Cache digunakan untuk menggunakan file yang tidak terlalu sering berubah antara jobs atau workflow runs yang berbeda, seperti hasil dependencies build dari package management system.
-
Artifact digunakan untuk menyimpan file yang dihasilkan dari job yang akan digunakan pada job selanjutnya atau untuk diunduh oleh pengguna, seperti hasil build dari aplikasi atau log dari proses build.
Berikut adalah contoh penggunaan artifact pada workflow.
name: Node CI
on: [push]
jobs:
build_and_test:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: npm install, build, and test
run: |
npm install
npm run build --if-present
- name: Archive production artifacts
uses: actions/upload-artifact@v4
with:
name: dist-without-markdown
path: |
dist
!dist/**/*.md
Penjelasan lebih lengkap mengenai workflow artifacts dapat dilihat di sini.