タダです.
GitHub Actions を使っていると,「ビルドが完了したら別の処理を開始したい」といったワークフロー間の連携が必要になることがあります.GitHub Actions には workflow を連携させる方法として workflow_call と workflow_run という2つの仕組みが用意されています。これらの違いをまとめつつ,使い方をメモしていきます.
workflow_run と workflow_call の違いを理解する
まず最初に自分も混同していたのですが, workflow_run と workflow_call の違いを整理します.
workflow_call
workflow_call は reusable workflow を定義し.他のワークフローから直接呼び出すための仕組みです.以下は定義例ですが特徴として呼び出し元のワークフローと同じ実行コンテキストで動作し,入力パラメータとシークレットを直接渡せる事が挙げられます.
呼び出し元の workflow の定義サンプル
# .github/workflows/main-workflow.yml name: Main Workflow on: push jobs: call-reusable: uses: ./.github/workflows/reusable-workflow.yml with: environment: develop
呼び出し先の reusable workflow の定義サンプル
# .github/workflows/reusable-workflow.yml name: Reusable Workflow on: workflow_call: inputs: environment: required: true type: string jobs: deploy: runs-on: ubuntu-latest steps: - name: Deploy to ${{ inputs.environment }} run: echo "Deploying to ${{ inputs.environment }}"
関連情報
workflow_run
workflow_run は独立した workflow を別の workflow の完了をトリガーとして起動します.自分がやりたかった処理がこちらなので自分は workflow_run でフローを構築しました.以下がテストの処理が完了したらデプロイを行う場合の実行例です.
呼び出し元の workflow の定義サンプル
# .github/workflows/test.yml name: Run test on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run test run: npm test
呼び出し先の workflow の定義サンプル
# .github/workflows/deploy.yml name: Deploy on: workflow_run: workflows: [Run test] types: - completed jobs: deploy: if: ${{ github.event.workflow_run.conclusion == 'success' }} runs-on: ubuntu-latest steps: - name: Deploy application run: echo "Deploying application"
関連情報
使い分けの判断ポイント
2つのトリガーの使い分けの観点もまとめます.
workflow_call:共通の処理を複数の workflow で再利用したいworkflow_run:独立性を保って前の workflow の結果に応じて処理を実行したい
まとめ
workflow_run は GitHub Actions において独立した workflow を連携させるトリガーです.workflow_call との違いを理解し適切に使い分けていければと思います.