🤖
GitHub Actionsで別リポジトリのワークフローを呼び出す
やりたいこと
リポジトリAのワークフローからリポジトリBのワークフローを呼び出したい。
リリースフローのワークフローが複数のリポジトリに分かれている際などに使えると思います。
どうやるか
repository_dispatchというwebhookイベントをトリガーとする。
repository_dispatch
ドキュメント
GitHub APIを使って、外部からワークフローをトリガーできます。
curlでの叩き方
curl \
-X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/$OWNER/$REPO/dispatches \
-d '{"event_type":"on-demand-test","client_payload":{"unit":false,"integration":true}}'
APIの詳しい仕様はこちらを参照してください。
使ってみる
リポジトリAのワークフローでcurlでGitHub APIをを叩いてリポジトリBのワークフローを実行します。
リポジトリAのワークフロー(呼び出し元)
name: Repository dispatch run
on:
workflow_dispatch:
jobs:
run-repository-dispatch:
runs-on: ubuntu-latest
steps:
- name: Curl Api
run: |
TOKEN=${{ secrets.MY_PAT }}
OWNER=${{ secrets.OWNER }}
REPO=${{ secrets.TARGET_REPO }}
curl \
-X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/$OWNER/$REPO/dispatches \
-d '{"event_type":"on-demand-test","client_payload":{"env": "dev"}}'
リポジトリBのワークフロー(呼び出し先)
name: Repository dispatch receive
on:
repository_dispatch:
types: [on-demand-test]
jobs:
receive-repository-dispatch:
runs-on: ubuntu-latest
steps:
- name: Receive
run: |
env=${{ github.event.client_payload.env }}
echo "ENV = $env"
動作確認
- 呼び出し元ワークフローの実行
- 呼び出し先ワークフローがrepository dispatchトリガーで自動実行
client_payloadで渡したenv
を受け取って出力されたことを確認
備考
トークンについて
リポジトリデフォルトのsecrets.GITHUB_TOKEN
では、別リポジトリに対する権限が足りないので、Repo権限を持った個人アクセストークンを使用する必要があります。
個人開発なら自分のユーザの個人アクセストークンでいいですが、業務の場合は、異動や退職で、自分のユーザが無くなると動かなくなってしまうので、マシンユーザを作ってそのユーザの個人アクセストークンを使用することをおすすめします。
呼び出し先リポジトリの特定のブランチをcheckoutしたいとき
呼び出し元でclient_payloadに呼び出し先リポジトリのブランチ名を渡してcurlを叩きます。
今回の場合は"client_payload":{"ref": "develop"}
を指定します。
name: Repository dispatch run
on:
workflow_dispatch:
jobs:
run-repository-dispatch:
runs-on: ubuntu-latest
steps:
- name: Curl Api
run: |
TOKEN=${{ secrets.MY_PAT }}
OWNER=${{ secrets.OWNER }}
REPO=${{ secrets.TARGET_REPO }}
curl \
-X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/$OWNER/$REPO/dispatches \
-d '{"event_type":"on-demand-test","client_payload":{"ref": "develop"}}'
呼び出し先でgithub.event.client_payload.ref
を受け取ってcheckoutされます。
name: Repository dispatch receive
on:
repository_dispatch:
types: [on-demand-test]
jobs:
receive-repository-dispatch:
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@master
with:
ref: ${{ github.event.client_payload.ref }}
Discussion