🐶

Github Actions の workflow run について

2022/06/14に公開

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を利用して、他のワークフローの完了時にワークフローを実行してみました。

まずは、元となるワークフローを作成します。このワークフローの完了をトリガーに別のワークフローを実行します。

.github/workflows/hello-world.yaml
name: Hello
on: push

jobs:
  hello:
    runs-on: ubuntu-latest
    steps:
      - run: echo "Hello World!"

これは、pushした時にHello World!と出力するのみのワークフローです。
ワークフローのnameHelloとしています。

以下の.github/workflows/completed.yamlのようにすることで、Helloというワークフローが完了した時に次のワークフローを実行します。

.github/workflows/completed.yaml
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_runworkflowsを設定します。workflowsに設定したワークフローがリクエストまたは完了した時にこのワークフローを実行できます。workflowsには、.github/workflows/hello-world.yamlname で設定したHelloを設定します。
最後にworkflow_runtypesを設定します。typesにはcompletedrequestedを設定することができます。completedを設定した場合、Helloのワークフローが完了したあとにこのワークフローが実行されます。requestedを設定した場合、Helloのワークフローが開始する時にワークフローが実行されます。今回はcompletedを設定したので、Helloというワークフローが完了後にCompletedというワークフローが実行されます。

前のワークフローが成功した時と失敗した時で処理を分岐することもできます。github.event.workflow_run.conclusionsuccessが入っているか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_runtypesrequestedcompletedの両方を設定してみます。つまり、他のワークフローのリクエスト時と完了時の両方でワークフローを実行するように設定してみます。どのような挙動になるのか、requestedcompletedで処理を分岐できるのかについて調べてみました。

以下のようなコードを作成しました。

.github/workflows/requested-and-completed.yaml
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_runtypesrequestedcompletedを設定しています。
このコードを実際に動かしてみた所、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