LoginSignup
47
31

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-09-26

はじめに

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 日に正式バージョンがリリースされる予定なので、それまでに更に便利になると良いと思います。

47
31
1

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
47
31