Github Actions の workflow run について
GitHub Actions の workflow_run について
GitHub Actionsには、ワークフローのトリガーとなるworkflow_runという機能があります。
今回はworkflow_runの使い方を説明しようと思います。
実際にworkflow_runを動かしたrepositoryはこちらです。
repository
GitHub Actions の workflow_runとは
ドキュメントにはworkflow_runについて以下のように記載されていました。
This event occurs when a workflow run is requested or completed. It allows you to execute a workflow based on execution or completion of another workflow.
workflow_runは、他のワークフローのリクエストや完了時をトリガーにワークフローを実行することができます。
例えば、Aというワークフローが完了した後にBというワークフローを実行することができます。

他のワークフロー完了時にワークフローを実行する例
実際にworkflow_runを利用して、他のワークフローの完了時にワークフローを実行してみました。
まずは、元となるワークフローを作成します。このワークフローの完了をトリガーに別のワークフローを実行します。
name: Hello
on: push
jobs:
hello:
runs-on: ubuntu-latest
steps:
- run: echo "Hello World!"
これは、pushした時にHello World!と出力するのみのワークフローです。
ワークフローのnameをHelloとしています。
以下の.github/workflows/completed.yamlのようにすることで、Helloというワークフローが完了した時に次のワークフローを実行します。
name: Completed
on:
workflow_run:
workflows:
- Hello
types:
- completed
jobs:
on-success:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- run: echo 'success'
on-failure:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
steps:
- run: echo 'failure'
on:workflow_runをトリガーとして設定します。
次にworkflow_runにworkflowsを設定します。workflowsに設定したワークフローがリクエストまたは完了した時にこのワークフローを実行できます。workflowsには、.github/workflows/hello-world.yamlのname で設定したHelloを設定します。
最後にworkflow_runにtypesを設定します。typesにはcompletedとrequestedを設定することができます。completedを設定した場合、Helloのワークフローが完了したあとにこのワークフローが実行されます。requestedを設定した場合、Helloのワークフローが開始する時にワークフローが実行されます。今回はcompletedを設定したので、Helloというワークフローが完了後にCompletedというワークフローが実行されます。

前のワークフローが成功した時と失敗した時で処理を分岐することもできます。github.event.workflow_run.conclusionにsuccessが入っているかfailureが入っているかで判定することが可能です。
.github/workflows/completed.yamlでは以下のようにすることで、前のワークフローが成功した時と失敗した時で処理を分岐しています。
if: ${{ github.event.workflow_run.conclusion == 'success' }}
...
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
...
workflow_runのtypesにrequestedとcompletedの両方を設定してみる
今回はworkflow_runのtypesにrequestedとcompletedの両方を設定してみます。つまり、他のワークフローのリクエスト時と完了時の両方でワークフローを実行するように設定してみます。どのような挙動になるのか、requestedとcompletedで処理を分岐できるのかについて調べてみました。
以下のようなコードを作成しました。
name: RequestedAndCompleted
on:
workflow_run:
workflows:
- Hello
types:
- requested
- completed
jobs:
on-requested:
name: On Requested
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == '' }}
steps:
- run: echo 'The triggering requested'
on-success:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
steps:
- run: echo 'The triggering workflow passed'
on-failure:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
steps:
- run: echo 'The triggering workflow failed'
workflow_runのtypesにrequestedとcompletedを設定しています。
このコードを実際に動かしてみた所、Helloというワークフローの実行をリクエストした時にこのワークフローが実行され、Helloというワークフローが完了した時にもこのワークフローが実行されました。つまり、2回実行されることがわかりました。
また、requestedのときはgithub.event.workflow_run.conclusionが空であることで処理を分岐することができます。
if: ${{ github.event.workflow_run.conclusion == '' }}
//requestedの時に実行される
...
if: ${{ github.event.workflow_run.conclusion == 'success' }}
//completedの時かつ前のワークフローが成功している時に実行される
...
if: ${{ github.event.workflow_run.conclusion == 'failure' }}
//completedの時かつ前のワークフローが失敗している時に実行される
...
最後に
workflow_runを利用することで他のワークフローをトリガーにワークフローを実行できることについて説明しました。
Discussion