🤖

GitHub Actionsで別リポジトリのワークフローを呼び出す

2022/05/17に公開

やりたいこと

リポジトリ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"

動作確認

  1. 呼び出し元ワークフローの実行
  2. 呼び出し先ワークフローが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