概要
GitHub Actionsのトリガーにworkflow_run
というものがあります。
workflow_runはあるworkflowが完了したり、呼び出されたら起動するイベントトリガーです。
問題点
workflow_runは呼び出し元の結果によって起動するかどうかをon
のパラメータ中で指定できません。
なので、呼び出し元の結果がfailureでもcancelledでも起動します。
解決方法 (呼び出し元のworkflow結果の取得方法)
workflow_runの呼び元のworkflowの結果をジョブ内で取得します。
具体的な方法としては、${{ github.event.workflow_run.conclusion }}で取得します。conclusionが呼び元の結果です。
以下の例では呼び元のworkflow名をBuildとします。
name: Workflow Run Trigger
on:
workflow_run:
workflows:
- Build
types:
- completed
jobs:
main:
name: Main job
runs-on: ubuntu-latest
# 呼び元のworkflowの結果がsuccessであればmain jobを実行
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps: ...
Use Case
スキップされるかもしれないジョブに依存しているジョブがあり、そのジョブは必ず実行したい場合に有効です。
例えば以下のように、ECSのデプロイでイメージビルドとサービスの更新のCDを分割させたいケースがあります。
ECSの1タスクで複数のイメージをビルド&プッシュケースでもneedsを多用せずにシンプルにworkflowを記述できるようになります。一つでもbuildに失敗すればデプロイは実行されませんし、あるイメージビルドがスキップしてもデプロイステージを実行できます。
終わりに
needsで複雑になったworkflowやスキップジョブにも依存しているジョブがある場合はworkflow_runで分割して、それぞれでシンプルになるように工夫してみてはいかがでしょうか