[裏技]トリガーに関係なくPRにコメントしよう@github-action
はじめに
例えば、github-actionではpushトリガーの時にPRにコメントできるようにissue番号を取得することはできません。context.issue.number
がundefiend
になるからです。
困った経験ないでしょうか?
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を使います。
(開かれている)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にコメントしたい」 時などに役に立ちます。
- windowsでクロスブラウザテストに成功 (e2e-windows)
- macOSでクロスブラウザテストに失敗 (e2e-macos)
- 1と2のレポート結果をまとめてPRにコメント
こんな流れです。
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
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点あります。
動かして確認したい
サンプルを作りました。
まとめ
github-actionのトリガーに関係なく、PRにコメントしましょう。
役に立つ情報だったら幸いです。
参考
Discussion