Repository Dispatchによるワークフロー連携
GitHub Actionsの repository_dispatch イベントを使用すると、GitHub APIを通じて外部システムや他のリポジトリのワークフローから、特定のリポジトリのワークフローをトリガーすることができます。これにより、複雑なワークフローの連携や、外部イベント(CMSの更新、デプロイ完了通知など)に基づいた自動化が可能になります。
Repository Dispatchとは
repository_dispatch は、GitHub Actionsのトリガーの一つで、HTTP POSTリクエストをGitHub APIのエンドポイントに送信することで発火します。
主な特徴は以下の通りです:
- カスタムイベントタイプ:
event_typeを指定して、特定のワークフローのみを実行できます。 - ペイロードの送信:
client_payloadJSONオブジェクトを通じて、トリガー元からデータを渡すことができます。
基本的な仕組み
トリガーする側(送信側)
GitHub APIの Create a repository dispatch event エンドポイントに対してPOSTリクエストを送信します。
curl -L \
-X POST \
-H "Accept: application/vnd.github+json" \
-H "Authorization: Bearer <YOUR_TOKEN>" \
-H "X-GitHub-Api-Version: 2022-11-28" \
https://api.github.com/repos/OWNER/REPO/dispatches \
-d '{"event_type":"my-event-type","client_payload":{"unit":false,"integration":true}}'
トリガーされる側(受信側)
ワークフローファイルの on セクションで repository_dispatch を指定し、必要に応じて types でイベントタイプをフィルタリングします。
name: Repository Dispatch Workflow
on:
repository_dispatch:
types: [my-event-type]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run script
run: echo "Received payload: ${{ github.event.client_payload.integration }}"
使用例: CIパイプラインからCDパイプラインをトリガーする
モノレポ構成や、ビルドとデプロイのリポジトリが分かれている場合など、CI(ビルド・テスト)の完了をトリガーとしてCD(デプロイ)を開始したいケースがあります。
シナリオ
- CIワークフロー: アプリケーションをビルドし、Dockerイメージをレジストリにプッシュする。
- CDワークフロー: 新しいイメージタグ情報を受け取り、デプロイ処理を実行する。
1. 送信側: CIワークフロー (ci.yml)
peter-evans/repository-dispatch アクションを使用すると、簡単にディスパッチイベントを送信できます。
name: CI Pipeline
on:
push:
branches: [ "main" ]
jobs:
build-and-push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# ... ビルドとDockerイメージのプッシュ処理 ...
# ここで image_tag を生成したと仮定 (例: sha-1234567)
- name: Trigger CD Pipeline
uses: peter-evans/repository-dispatch@v3
with:
token: ${{ secrets.PAT_TOKEN }}
repository: my-org/my-deploy-repo # デプロイ用リポジトリ(同一リポジトリなら省略可)
event-type: trigger-deploy
client-payload: '{"image_tag": "sha-1234567", "environment": "production"}'
Personal Access Token (PAT) について
他のリポジトリをトリガーする場合や、同一リポジトリでもデフォルトの GITHUB_TOKEN では権限が不足する場合(または再帰的なトリガーを防ぐため)、適切なスコープ(通常は contents: write や metadata: read)を持つPATを作成し、Secretsに登録する必要があります。
2. 受信側: CDワークフロー (cd.yml)
name: CD Pipeline
on:
repository_dispatch:
types: [trigger-deploy]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy Application
run: |
echo "Deploying image tag: ${{ github.event.client_payload.image_tag }}"
echo "Target environment: ${{ github.event.client_payload.environment }}"
# 実際のデプロイコマンド (例: helm upgrade, kubectl set image, etc.)
# ./deploy.sh ${{ github.event.client_payload.image_tag }}
セキュリティと制限事項
- 認証: ディスパッチイベントを送信するには、リポジトリへの書き込み権限が必要です。
- デフォルトブランチ:
repository_dispatchイベントは、デフォルトブランチ(通常はmain)にあるワークフローファイルでのみトリガーされます。 - レート制限: GitHub APIのレート制限が適用されます。
まとめ
Repository Dispatchを使用することで、GitHub Actionsの枠を超えた柔軟なワークフロー連携が可能になります。マイクロサービスアーキテクチャにおけるサービス間の連携や、外部システムからのイベント駆動な自動化において非常に強力なツールです。