Pendahuluan
Salah satu fitur kunci dari GitHub Actions adalah dukungannya untuk eksekusi kondisional, yang memungkinkan Anda mengontrol kapan langkah-langkah atau pekerjaan tertentu dalam alur kerja harus dijalankan. Fitur ini sangat berguna saat mengelola alur kerja kompleks dengan banyak pekerjaan, langkah-langkah, dan konfigurasi.
Ekspresi Kondisional
Ekspresi kondisional menjadi dasar dari eksekusi kondisional di GitHub Actions. Pada bab ini, saya akan membahas dasar-dasar ekspresi kondisional, operator yang dapat Anda gunakan, dan cara bekerja dengan konteks dan fungsi.
Dasar-Dasar Ekspresi Kondisional
Ekspresi kondisional di GitHub Actions ditulis menggunakan sintaks ekspresi GitHub Actions, yang didasarkan pada JavaScript. Ekspresi ini biasanya digunakan dengan kata kunci if
untuk menentukan apakah suatu langkah atau pekerjaan harus dijalankan. Hasil dari ekspresi harus berupa nilai boolean, baik true
atau false
.
Contoh sederhana dari ekspresi kondisional adalah:
if: success()
Dalam contoh ini, ekspresi memeriksa apakah langkah-langkah sebelumnya berhasil menggunakan fungsi success()
. Jika berhasil, langkah atau pekerjaan akan dijalankan; jika tidak, akan dilewati.
Operator dalam Ekspresi Kondisional
Ekspresi GitHub Actions mendukung berbagai operator, yang dapat digunakan untuk membuat ekspresi yang lebih kompleks. Operator-operator ini meliputi:
- Operator logika
&&
(dan),||
(atau),!
(bukan) - Operator kesetaraan
==
(sama dengan),!=
(tidak sama dengan) - Operator perbandingan
<
(kurang dari),>
(lebih besar dari),<=
(kurang dari atau sama dengan),>=
(lebih besar dari atau sama dengan)
Berikut adalah contoh yang menggabungkan beberapa operator:
if: github.event_name == 'pull_request' && github.event.action == 'opened'
Ekspresi ini memeriksa apakah acara saat ini adalah pull request yang dibuka.
Menggunakan Konteks dan Fungsi dalam Ekspresi
Ekspresi GitHub Actions dapat mengakses berbagai objek konteks dan fungsi bawaan, yang menyediakan informasi dan fungsionalitas yang berguna. Beberapa di antaranya meliputi:
github
: Menyediakan informasi tentang repositori saat ini, acara, jalankan alur kerja, dan lain-lain.env
: Berisi variabel lingkungan.secrets
: Menyimpan rahasia repositori.steps
: Memberikan akses ke output dari langkah-langkah sebelumnya.needs
: Memungkinkan Anda mengakses output dari pekerjaan yang bergantung padanya.
Fungsi seperti success()
, failure()
, cancelled()
, always()
, dan lain-lain.
Berikut adalah contoh yang menggunakan objek konteks github
:
if: github.ref == 'refs/heads/main' && success()
Ekspresi ini memeriksa apakah cabang saat ini adalah cabang main dan jika langkah-langkah sebelumnya berhasil. Jika kedua kondisi terpenuhi, langkah atau pekerjaan akan dijalankan.
Melewati Tindakan
Dalam beberapa skenario, Anda mungkin ingin melewati langkah atau pekerjaan tertentu dalam alur kerja Anda. Hal ini dapat dicapai dengan menggunakan ekspresi kondisional dalam kombinasi dengan kata kunci if
. Pada bab ini, saya akan menjelajahi berbagai kasus penggunaan untuk melewati tindakan dan bagaimana mengimplementasikannya.
Memanfaatkan Kata Kunci if
Kata kunci if
memungkinkan Anda menjalankan langkah atau pekerjaan secara kondisional berdasarkan hasil dari ekspresi kondisional. Jika ekspresi yang ditentukan dengan if
dievaluasi menjadi true
, langkah atau pekerjaan akan dijalankan. Jika ekspresi dievaluasi menjadi false
, langkah atau pekerjaan akan dilewati.
Berikut adalah contoh yang menunjukkan penggunaan kata kunci if
:
steps:
- name: Run tests
run: npm test
if: success()
Dalam contoh ini, langkah "Run tests" hanya akan dieksekusi jika langkah-langkah sebelumnya berhasil.
Melewati Langkah Berdasarkan Cabang atau Tag
Anda dapat menggunakan ekspresi kondisional untuk menjalankan langkah hanya untuk cabang atau tag tertentu. Ini dapat membantu saat langkah tertentu hanya harus dieksekusi untuk rilis atau cabang tertentu. Berikut adalah contoh:
steps:
- name: Deploy to production
run: npm run deploy
if: github.ref == 'refs/heads/main'
Dalam contoh ini, langkah "Deploy to production" hanya akan dieksekusi jika cabang saat ini adalah main
.
Melewati Langkah Berdasarkan Berkas yang Diubah
Kasus penggunaan lain untuk eksekusi kondisional adalah menjalankan langkah hanya ketika beberapa berkas telah diubah. Ini dapat berguna ketika Anda ingin memicu langkah atau pekerjaan hanya jika berkas tertentu telah diubah dalam komit atau pull request.
Anda dapat mencapainya dengan menggunakan fungsi contains()
dan fromJson()
, bersama dengan tindakan kustom yang mencantumkan berkas yang telah diubah. Berikut adalah contoh:
steps:
- name: Get changed files
id: changes
uses: trilom/file-changes-action@v1
with:
output: 'json'
- name: Run tests for important files
run: npm run test:important
if: contains(fromJson(steps.changes.outputs.files), 'path/to/important/file')
Dalam contoh ini, langkah "Jalankan pengujian untuk berkas penting" hanya akan dieksekusi jika berkas yang ditentukan (path/to/important/file
) telah diubah.
Bangun Matriks
Bangun matriks adalah fitur kuat dari GitHub Actions yang memungkinkan Anda menjalankan pekerjaan yang sama dengan konfigurasi yang berbeda. Ini sangat berguna saat Anda ingin menguji kode Anda pada platform yang berbeda atau dengan berbagai versi bahasa pemrograman atau dependensi. Pada bab ini, saya akan menjelajahi konsep bangun matriks, cara menggunakan bangun matriks kondisional, dan cara menggabungkan bangun matriks dengan kata kunci if
untuk skenario yang lebih canggih.
Memahami Bangun Matriks
Bangun matriks di GitHub Actions memungkinkan Anda mendefinisikan satu set konfigurasi yang harus dijalankan oleh pekerjaan Anda. Ini dilakukan dengan menentukan kunci matrix
dalam definisi pekerjaan, diikuti oleh daftar variabel dan nilai yang mungkin. GitHub Actions akan menjalankan pekerjaan untuk setiap kombinasi nilai-nilai ini.
Berikut adalah contoh dasar dari bangun matriks:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node-version: [12, 14, 16]
steps:
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
Dalam contoh ini, pekerjaan test
akan dijalankan pada tiga sistem operasi yang berbeda (Ubuntu, macOS, dan Windows) dan dengan tiga versi Node.js yang berbeda (12, 14, dan 16), menghasilkan total sembilan jalankan pekerjaan.
Menggunakan Bangun Matriks Kondisional
Terkadang, Anda mungkin ingin menggunakan ekspresi kondisional dalam bangun matriks untuk menyertakan atau mengecualikan konfigurasi tertentu berdasarkan kondisi tertentu. Ini dapat dilakukan dengan menggunakan kunci include
dan exclude
dalam definisi matrix
.
Berikut adalah contoh yang menunjukkan penggunaan bangun matriks kondisional:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node-version: [12, 14, 16]
include:
- os: ubuntu-latest
node-version: 18
if: github.ref == 'refs/heads/main'
Dalam contoh ini, konfigurasi tambahan (versi Node.js 18 di Ubuntu) akan dimasukkan dalam matriks hanya jika cabang saat ini adalah main
.
Menggabungkan Bangun Matriks dengan if untuk Skenario yang Lebih Canggih
Untuk skenario yang lebih canggih, Anda dapat menggunakan kata kunci if
dalam pekerjaan atau langkah untuk lebih mengontrol eksekusi bangun matriks Anda. Dengan menggabungkan ekspresi kondisional dengan objek konteks matrix
, Anda dapat membuat alur kerja yang kompleks dan fleksibel.
Berikut adalah contoh yang menunjukkan penggunaan kata kunci if
dengan bangun matriks:
jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
node-version: [12, 14, 16]
steps:
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies
run: npm ci
- name: Run tests
run: npm test
- name: Publish coverage report
run: npm run coverage
if: matrix.os == 'ubuntu-latest' && matrix.node-version == 14
Dalam contoh ini, langkah "Terbitkan laporan cakupan" hanya akan dieksekusi jika konfigurasi saat ini berjalan di Ubuntu dengan versi Node.js 14. Ini dapat berguna saat Anda ingin melakukan tugas tertentu, seperti menerbitkan laporan cakupan atau mendeploy aplikasi Anda, hanya sekali dalam bangun matriks atau untuk konfigurasi tertentu.