Traffine I/O

Bahasa Indonesia

2023-03-05

Eksekusi Kondisional di GitHub Actions

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.

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!