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