🥴

GitHub Actions で Pull Request に動的なコメントを追加する

2022/12/28に公開

はじめに

以下の機能をもつGitHub Actions のワークフローを書きました。

  1. Pull-Requestがオープン(作成)される時、ブランチ名に基づいてAPIを動的に呼び出す
  2. その返り値に含まれるタスクチケットの内容をコメントで追加する

実行結果

ワークフローのサンプル

実装は以下の通り

.github/workflows/pr_manager.yml
name: pr manager

on:
  pull_request:
    types: [opened]
    branches-ignore:
      - 'production'

jobs:
  add-comment:
    runs-on: ubuntu-latest
    env:
      GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: get issue summary, post comment
        run: |
	  # branch名が指定の様式であるときのみワークフローを実行
          issue_id=$(echo ${{ github.head_ref }} | sed -E 's/^.*(Proj-[0-9]+).*$/\1/')
          if ! [[ $issue_id =~ ^Proj-[0-9]+$ ]]; then
            exit 0
          fi
                    
	    # APIを叩いてタスクチケットの詳細を取得
          issue=$(curl -X GET "https://project-4iF48QPqM2Fa.myjetbrains.com/api/issues/$issue_id?fields=idReadable,summary" \
                       -H 'Accept: application/json' \
                       -H 'Authorization: Bearer ${{ secrets.YOUTRACK_TOKEN }}')

          cat << EOF > comments
            $(echo $issue | jq -r .summary)
            https://project-4iF48QPqM2Fa.myjetbrains.com/youtrack/issue/$(echo $issue | jq -r .idReadable)
          EOF
                    # Github CLIでタスクチケットの詳細をコメントに追加
          gh pr comment -F ./comments ${{ github.event.pull_request.html_url }}

ポイントの紹介

ブランチ名を切り出して変数に格納

# branch名が指定の様式であるときのみワークフローを実行
issue_id=$(echo ${{ github.head_ref }} | sed -E 's/^.*(Proj-[0-9]+).*$/\1/')
if ! [[ $issue_id =~ ^Proj-[0-9]+$ ]]; then
  exit 0
fi

ブランチ名がtopic/Proj-1923-next-featureのような時だけ処理が進むようにしています。
exitしているのはネストを浅くするためと、後述されているヒアドキュメントがうまく動かなくなった回避策です。

APIを叩く

 # APIを叩いてタスクチケットの詳細を取得
issue=$(curl -X GET "https://project-4iF48QPqM2Fa.myjetbrains.com/api/issues/$issue_id?fields=idReadable,summary" \
             -H 'Accept: application/json' \
             -H 'Authorization: Bearer ${{ secrets.YOUTRACK_TOKEN }}')

ここではブランチ名から切り出したチケットIDを使って、タスクチケットの詳細を取得しています。jsonで返ってきた値が二つあるのでここではparseする前に変数に入れています。

コメントを作成しPOSTする

cat << EOF > comments
  $(echo $issue | jq -r .summary)
  https://project-4iF48QPqM2Fa.myjetbrains.com/youtrack/issue/$(echo $issue | jq -r .idReadable)
EOF
# Github CLIでタスクチケットの詳細をコメントに追加
gh pr comment -F ./comments ${{ github.event.pull_request.html_url 

ここでコメントの内容を作成し、POSTしています。

以下では先ほど取得したAPI jsonをparseしています。

echo $issue | jq -r .idReadable

また、次のように環境変数を設定することでGithub cliが使えるようになります

env:
  GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

参考

https://qiita.com/osakiy/items/df80db383ce33b82c797

Discussion