以前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
)
あとはexecute
Jobのstrategy.matrix
で参照する設定を書く
実行結果
- push時
- workflow_dispatch時
無事イベントによって切り分けることに成功した
まとめと感想
actions/script
を用いてActionsのイベントによってmatrixの値を動的に変えた- ShellScriptで表現しにくい処理などの代替として使えそうだと感じた
- 今回のケース以外(matrixの値を生成する)でも色々な場面で有用な場合がありそうだと感じた
- とはいえ設定ファイル中にコードをガッツリ書くのは抵抗があるので実際に使うかどうかは人によって意見が分かれそう