GitHub ActionsでPRのコメントに返事を返すbotを動かす

github

APIトークン

コメントを投稿するAPIを呼ぶためにトークンが必要だが、GitHub Actionsのジョブの実行中有効なGitHub Appトークンが自動生成され、${{secrets.GITHUB_TOKEN}}で参照できるのでこれを使う。 このトークンによるイベントではワークフローが発火しないので無限ループの心配がない。

AWS SAMとGoでPRのコメントに対して返事を返すGitHub Appを作る - sambaiz-net

リポジトリに対して大方の権限は付いているが、フォークしたリポジトリからはreadしかできないようになっている。

actions/github-script

octokit/core.jsを用いたGitHub APIを呼ぶスクリプトを実行できるAction。 直接ワークフローファイルに書くこともできるが、別のファイルに分けている。

containshey botという文字列が含まれるときのみジョブを実行するようにしている。

name: echo-bot

on:
  issue_comment:
    types: [created]

jobs:
  echo-bot:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/github-script@v2
        if: ${{ contains(github.event.comment.body, 'hey bot') }}
        with:
          github-token: ${{secrets.GITHUB_TOKEN}}
          script: |
            const script = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/script.js`)
            script({github, context})            
$ cat .github/workflows/script.js
module.exports = ({github, context}) => {
  github.issues.createComment({
    issue_number: context.payload.issue.number,
    owner: context.payload.repository.owner.login,
    repo: context.payload.repository.name,
    body: `You said ${context.payload.comment.body}`
  })
}

実行

issue_commentイベントはデフォルトブランチにワークフローファイルがないと発火しないので置く。PRを作成して条件を満たすコメントをすると返事が返ってきた。 このbotの投稿自体もワークフロー発火の条件を満たしているが、発火せず無限ループしない。

botによるコメントの投稿