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

## はじめに

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

## 実行結果

![multi-line-comments.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32736/a982afc8-8f62-ebd2-3772-0cd45ca4f0c7.png)

## ワークフローのサンプル

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

``` yml:.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 月の初回投稿時当初のサンプルはもう古くなったので以下に折りたたんでおきます。

<details><summary>2019 年 9月に投稿した時のサンプル</summary><div>

``` yaml:.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}
```
</div></details>


## ポイントの紹介

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

``` yml
on:
  pull_request:
    types: synchronize
```

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

- [events-that-trigger-workflows#pull-request-event-pull_request](https://help.github.com/en/articles/events-that-trigger-workflows#pull-request-event-pull_request)

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

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

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

- [virtual-environments-for-github-actions#token-permissions](https://help.github.com/en/articles/virtual-environments-for-github-actions#token-permissions)

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

- [creating-and-using-secrets-encrypted-variables](https://help.github.com/en/articles/virtual-environments-for-github-actions#creating-and-using-secrets-encrypted-variables) 

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

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

# GITHUB_TOKEN is ***.
```

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

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

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

- [contexts-and-expression-syntax-for-github-actions#github-context](https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions#github-context)

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

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

どのホストからでも [jq](https://stedolan.github.io/jq) が使えるようでした。

[Preinstalled software](https://docs.github.com/ja/actions/using-github-hosted-runners/about-github-hosted-runners#preinstalled-software) >> [Ubuntu2004-Readme.md](https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md)

> jq 1.6 

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

- [About environment variables](https://docs.github.com/en/actions/learn-github-actions/environment-variables)

## おわり

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

- [GitHub ActionsにCI/CD機能を搭載〜パブリックリポジトリでは無料で利用可能](https://github.blog/jp/2019-08-21-github-actions-now-supports-ci-cd/)