はじめに
GitHub Actionsでは、APIを使ってリポジトリAのワークフローから別のリポジトリBのワークフローをトリガーすることができます。
しかし、Create a workflow dispatch event APIのレスポンスには、トリガーされたリポジトリBのワークフローに関する情報は含まれず、リポジトリAからすぐに該当のワークフローを見つけることができません。
この記事では、トリガーされたワークフローのURLをリポジトリA側で取得する方法を紹介します。
サンプルコード
呼び出し側(リポジトリAに格納)
test.yml
name: GitHub Actions Demo
on: workflow_dispatch
env:
repo_owner: xxxxxx
repo_name: target
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Trigger workflow in another repository
run: |
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/$repo_owner/$repo_name/actions/workflows/target.yml/dispatches \
-d '{
"ref":"main",
"inputs":{
"name":"hoge"
}
}'
- name: Sleep for 5 seconds
run: sleep 5s
- name: Get the triggered workflow
run: |
workflows_list=`curl -L \
-X GET \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer ${{ secrets.PAT }}" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/$repo_owner/$repo_name/actions/runs`
latest_workflow=$(echo $workflows_list | jq -r '.workflow_runs[0].html_url')
echo $latest_workflow >> $GITHUB_STEP_SUMMARY
呼び出される側(リポジトリBに格納)
今回はinputs
を定義してみましたが、呼び出される側のコードはどんなものでも構いません。
target.yml
name: Target Workflow
on:
workflow_dispatch:
inputs:
name:
description: 'name'
required: true
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: ${{ inputs.name }}
run: echo "My name is ${{ inputs.name }}"
説明
-
Trigger workflow in another repository
ステップでは、Create a workflow dispatch event APIを用いてリポジトリBのワークフローをトリガーしています。リポジトリBの入力に合わせて、inputs
を渡しています。 -
Get the triggered workflow
ステップでは、List workflow runs for a repository APIを用いてリポジトリBの全てのworkflow runを取得しています。続いて、そのレスポンスのリストの中で、最新のworkflow runである0番目のhtml_url
を抽出しています。最後に抽出したhtml_url
をgithub step summaryに表示しています。 - 上記2つのステップの間にある
Sleep for 5 seconds
ステップは、Trigger workflow in another repository
ステップの直後にGet the triggered workflow
ステップを実行すると、最新のworkflow runが反映されなかったため、付け足しています。
おわりに
今回はシンプルな実装を試しましたが、この実装では、ほとんど同時に複数回トリガーされた場合に、呼び出したworkflow runのURLを正しく取得できないことが考えられます。
これを解消するには、List workflow runs for a repository APIのレスポンスに含まれるnameやactorなどの情報をうまく活用する必要があります。
最後までお読みいただきありがとうございました。