28
Help us understand the problem. What are the problem?

posted at

updated at

GitHub Actions を用いて bot から Pull-Request にコメントをする方法

はじめに

Pull-Request にコミットが追加されると bot がコメントをする という GitHub Actions のワークフローを書きました。

実行結果

multi-line-comments.png

ワークフローのサンプル

次のように記述しました。
:warning: 2022 年 1 月 24 日追記:https://cli.github.comgh コマンド)を用いたシンプルな実装に置き換えました。

.github/workflows/comment_on_pr.yml
name: comment_on_pr

on:
  pull_request:
    types: synchronize

jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Create comments
      run: |
        cat << EOF > comments
        1st
        2nd
        3rd
        EOF

    - name: Post comments
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        URL: ${{ github.event.pull_request.html_url }}
      run:
        gh pr comment -F ./comments "${URL}"

2019 年 9 月の初回投稿時当初のサンプルはもう古くなったので以下に折りたたんでおきます。

2019 年 9月に投稿した時のサンプル
.github/workflows/comment_on_pr.yml
name: comment_on_pr

on:
  pull_request:
    types: synchronize

jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Create comments
      run: |
        echo "1st" >> comments
        echo "2nd" >> comments
        echo "3rd" >> comments
        sed -i -z 's/\n/\\n/g' comments

    - name: Post multi-line comments
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        URL: ${{ github.event.pull_request.comments_url }}
      run: |
        curl -X POST \
             -H "Authorization: token ${GITHUB_TOKEN}" \
             -d "{\"body\": \"$(cat comments)\"}" \
             ${URL}

ポイントの紹介

types でワークフローのトリガーを細かく制御する

on:
  pull_request:
    types: synchronize

pull_request がトリガーをかけるデフォルトのアクティビティタイプは、[opened, synchronize, reopened] に制限されていることが以下からわかります。今回のサンプルでは、起票済みの Pull-Request にコミットが push された時だけトリガーをかけたかったので synchronize アクティビティタイプに変更しました。

secrets 変数として GitHub Token が使える

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

これは GitHub 側で提供されている Actions 用 bot アカウントの認証トークンです。このトークンを利用することで GitHub を API で操作することができるようになります。トークンに割り当てられた権限については以下にまとめられています。

また、便利なことに ${{ secrets.GITHUB_TOKEN }} は利用者が登録しなくても最初から使えるようになっています。他の secrets 変数の登録と利用方法については以下が参考になります。

なお、Actions のログに secrets 変数が表示されていないことは以下のように確認しました。

env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run:
  echo GITHUB_TOKEN is ${GITHUB_TOKEN}.

# GITHUB_TOKEN is ***.

コンテキストへの参照ができる

env:
  URL: ${{ github.event.pull_request.html_url }}

${{ <context> }} という式から、コンテキストを参照することができます。今回は Pull-Request の URL が必要だったので、${{ github.event.pull_request.html_url }} から URL を参照しました。

なお、${{ github.event }} はワークフローをトリガーした webhook のペイロードで、 ${GITHUB_EVENT_PATH} にも同じものが json ファイルとして保存されています。したがって、このコンテキストへの参照をする代わりに、直接 webhook のペイロードをパースすることもできます。

デフォルトで jq が使える(おまけ)

jq -r '.pull_request.comments_url' ${GITHUB_EVENT_PATH}

どのホストからでも jq が使えるようでした。

Preinstalled software >> Ubuntu2004-Readme.md

jq 1.6

なお ${GITHUB_EVENT_PATH} 以外の環境変数は、以下が参考になります。

おわり

2019 年 9 月現在、GitHub Actions はベータ版という位置づけで、申し込みをすることで誰でも無料で利用できるようになっています。今後 2019 年 11 月 13 日に正式バージョンがリリースされる予定なので、それまでに更に便利になると良いと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
28
Help us understand the problem. What are the problem?