notebook

都内でWEB系エンジニアやってます。

GitHub Actionsでactions/scriptを用いてイベントの種類によってmatrixの値を変える

以前matrixを動的に設定する記事(GitHubActionsでmatrixの値を動的に扱う - notebook)を書いたがそのときは固定値だったので、今回はイベント内容によってセットするmatrixを変えてみる

actions/scriptを使うとJavaScriptを書けるのでShellScriptやActionsの設定ファイルで分岐を表現するより楽かもしれない

今回だとイベントの情報はcontextを用いてイベントの内容を参照する

そして、条件を踏まえて最終的に出力するmatrixをコードで表現できるのでシェルスクリプトより使いやすそう

ということでactions/scriptを使っている

YAMLの中にコードを書くのはどうなの?という思いもあるがやってみたらまぁこのくらいであれば便利という感想になった

設定ファイルのサンプル

name: dynamic matrix

on:
  push:
  schedule:
    - cron: '0 0 1 * *'
  workflow_dispatch:

jobs:
  set-matrix:
    runs-on: ubuntu-latest
    outputs:
      tags: ${{ steps.set-matrix.outputs.result }}
    steps:
      - uses: actions/github-script@v6
        id: set-matrix
        with:
          script: |
            const eventName = context.eventName;
            const tags = ['a','b'];
            return (eventName === 'workflow_dispatch' || eventName === 'schedule') ? [...tags, 'all'] : tags;

  execute:
    needs: set-matrix
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        hoge: ${{fromJson(needs.set-matrix.outputs.tags)}}
    steps:
      - run: echo ${{ matrix.hoge }}

actions/scriptのコードでは

  • イベントがworkflow_dispatch,scheduleだったらtagリストは['a','b','all']
  • イベントがworkflow_dispatch,schedule以外だったらtagリストは['a','b']

というのを表現している

actions/scriptではコードの中でreturnを書くとsteps.{{ステップのid}}.outputs.resultという場所に結果が保存される

それを他のJobから参照できるようにjobs.set-matrix.outputsで指定する(今回はtags

あとはexecuteJobのstrategy.matrixで参照する設定を書く

実行結果

  • push時

  • workflow_dispatch時

無事イベントによって切り分けることに成功した

まとめと感想

  • actions/scriptを用いてActionsのイベントによってmatrixの値を動的に変えた
  • ShellScriptで表現しにくい処理などの代替として使えそうだと感じた
  • 今回のケース以外(matrixの値を生成する)でも色々な場面で有用な場合がありそうだと感じた
  • とはいえ設定ファイル中にコードをガッツリ書くのは抵抗があるので実際に使うかどうかは人によって意見が分かれそう