💪

[裏技]トリガーに関係なくPRにコメントしよう@github-action

5 min read

はじめに

例えば、github-actionではpushトリガーの時にPRにコメントできるようにissue番号を取得することはできません。context.issue.numberundefiendになるからです。

困った経験ないでしょうか?

on:
  push:
    branches:
      - "**"
    tags:
      - "!*"
 
jobs:
  notify:
    steps:
      - name: notify
        uses: actions/github-script@v5
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
        script: |
            await github.issues.createComment({
              issue_number: context.issue.number,   // undefined
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'pushトリガーだとPRにコメントできないぞ'
            })

しかし、この記事で紹介する方法を使えばできるようになります。

以下のような事ができるようになります

  • 開かれた状態のPRに対してpush(forcepush)した時、PRにコメント
  • 開かれた状態のPRに対してpushトリガーに限らず、例えばworkflow_runトリガーのjobでもPRに結果をコメント

全部試したわけではないですが、github-actionのトリガーに関係なく、PRのissue番号を取得できるようになります。

どうやるのか

こちらのgithub-actionを使います。

https://github.com/jwalton/gh-find-current-pr

(開かれている)PRをSHAで絞り込み取得してきて、最初に見つかったPRの情報を取得してきてissue番号・タイトル・ボディーをアウトプットに設定してくれます。

具体的な使い方

最初に紹介したpushトリガーでのPRへのコメントはこんな風にかけます。

on:
  push:
    branches:
      - "**"
    tags:
      - "!*"

jobs:
  notify:
    runs-on: 
    steps:
      - uses: actions/checkout@v2
      - uses: jwalton/gh-find-current-pr@v1
          id: findPr
          with:
            state: open
      - name: notify
        uses: actions/github-script@v5
        with:
          env:
            GITHUB_ISSUE_NUMBER: ${{ steps.findPr.outputs.pr }}
        script: |
            await github.issues.createComment({
              issue_number: process.env.GITHUB_ISSUE_NUMBER,   // ちゃんと取得できる
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'pushトリガーでもPRにコメントできるぞ'
            })

これだけの修正でトリガーに関係なくPRにコメントできるなら結構便利かと思います。

より実用的な使い方

今、CI/CDというワークフローの成功・失敗にかかわらず、PRに結果をコメントしたいとしましょう。詳しい事は割愛しますが、ワークフローの結果に限らずだとか、テスト結果を一通り出して後からまとめてコメントするためには、workflow_runトリガーを使います。

イメージがピンときてない人のためにより具体的な言葉を使って例を説明すると、「macOSとwindowsでtestcafeのクロスブラウザテストを行って生成されたレポートを各OS・Browser毎に表形式にまとめてまとめてPRにコメントしたい」 時などに役に立ちます。

  1. windowsでクロスブラウザテストに成功 (e2e-windows)
  2. macOSでクロスブラウザテストに失敗 (e2e-macos)
  3. 1と2のレポート結果をまとめてPRにコメント

こんな流れです。

.github/workflows/cicd.yml
name: CI/CD

on:
  push:
    branches:
      - "**"
    tags:
      - "!*"

jobs:
  e2e-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v2
      - name: test successed
        run: exit 0
  e2e-macos:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v2
      - name: test failed
        run: exit 1
.github/workflows/notify.yml
name: Notify

on:
  workflow_run:
    workflows:
      - CI/CD
    types:
      - completed

jobs:
  notify:
    name: Notify
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: ${{ github.event.workflow_run.head_branch }}
      - name: Get PR number when push event
        uses: jwalton/gh-find-current-pr@v1
        id: findPr
        with:
          sha: ${{ github.event.workflow_run.head_sha }}
          state: open
      - name: Notify
        if: success() && steps.findPr.outputs.number
        uses: actions/github-script@v5
        env:
          GITHUB_ISSUE_NUMBER: ${{ steps.findPr.outputs.pr }}
        with:
          script: |
            await github.issues.createComment({
	      // ここを環境変数で渡すようにする。
	      // PRが見つからない場合は、「''」が設定されるらしいので適宜場合分けする。
              issue_number: process.env.GITHUB_ISSUE_NUMBER
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: 'トリガーに関係なくPRにコメントできるぜ'
            })

軽く説明すると、CI/CDという名前のワークフローが完了したらNotifyというワークフローが走るようになります。

workflow_runトリガーでPRにコメントしたい時に気をつける点は3点あります。

  • デフォルトブランチにworkflow_runを使ってるymlファイルが存在してないと全てのワークフローに表示されず機能しないです。
    • github-actionの仕様です。気をつけましょう。
  • checkout時にrefでbranchを指定してあげないとデフォルトブランチに移動してしまいます。
    • PRのブランチ or タグ or SHAをrefを使って指定してやる必要があります。
    • ref: ${{ github.event.workflow_run.head_branch }} の指定が必要です。
  • shaも ${{ github.sha }}ではデフォルトブランチのものを指してしまいます。
    • PRのHEADコミットのSHAを指定する必要があります。
    • sha: ${{ github.event.workflow_run.head_sha }}の指定が必要です。

動かして確認したい

サンプルを作りました。

https://github.com/yukihirop/example-notify-github-action-when-workflow_run

まとめ

github-actionのトリガーに関係なく、PRにコメントしましょう。
役に立つ情報だったら幸いです。

これを使った際のセキュリティーの問題とかに関してはわかりません。

参考

https://docs.github.com/ja/actions/learn-github-actions/events-that-trigger-workflows#release

https://stackoverflow.com/a/65081720

Discussion

ログインするとコメントできます