2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【GitHub Actions】APIで呼び出した別リポジトリのWorkflow Run URLを呼び出し元に表示する

Posted at

はじめに

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などの情報をうまく活用する必要があります。

最後までお読みいただきありがとうございました。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?