Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Github Actionsで他のリポジトリのIssueにコメントを残すにはOrganizationレベルのPersonal Access Tokenが必要になる

やりたいこと

GithubのPull-Reqに特定のラベルをつけたとき、別のリポジトリにあるIssueにその旨コメントしたい。

前提知識

我らがチームでは、Pull-Request機能を使って、stagingブランチからmasterまたはmainブランチにマージすることでリリースフローが回る。これまでは、リリースが完了したとき、その旨をダッシュボード的なIssue(別のリポジトリにある)に書き込んでいた。これをより自動化して、人間がリリース済みタグを貼り付けるだけで済ませたい。

やったこと

転記元のリポジトリにGithub Actions Workflowを追加した。コメント追加には、peter-evans/create-or-update-commentを使った。

↓このコードは動作しません。動作するコードはあとで貼ります。

name: Add comment when release completes to <repo url>
on:
  pull_request:
    types:
      - labeled
jobs:
  add-comment:
    if: github.event.label.name == 'リリース済み' 
    runs-on: ubuntu-latest
    permissions:
      issues: write
    steps:
      - name: Add comment
        uses: peter-evans/create-or-update-comment@v1
        with:
          repository: <org>/<thatrepo>
          issue-number: <issuenumber>
          body: |
            ## リリース ${{ github.repository }}
            :sparkles: ${{ github.server_url }}/${{ github.repository }}/pull/${{github.event.pull_request.number}} :sparkles:

動かない

Not Foundとだけ表示され動作しない。

仮説: Actionの指定に失敗している

Actionsの指定がNot Foundなのかな?と思ってuses:の部分をいじったりしたけど変化はなかった。ログを見るとActionをダウンロードしている様子が含まれていたので棄却された。

仮説: permissionsの指定が過剰になっている

ActionのREADMEにはこんな項目ない。本当は指定しなくても良いのではないか。

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#env によれば

You can use permissions to modify the default permissions granted to the GITHUB_TOKEN, adding or removing access as required, so that you only allow the minimum required access

とのことであった。つまり、GithubのSettingsで許可していたら全スコープにWrite permissionがつくので問題ないはず。

permissionsはそこからさらにfine-grainedな調整を行ってセキュリティを確保するための機能であることがわかったから、いったんpermissonsを解除した。

ログを見ても全ての項目にwriteがついていることが確認できた。

仮説: Workflowを走らせているリポジトリから、書き込み先のリポジトリが見えていない

☆これだった

同じorganizationに入っているから見えるはずなんだけど・・・と思っていたら違った様子。

Workflowを起動したときに自動的にもらえるトークンは、実行リポジトリにかんする権限しか得られないので、他のリポジトリに対して書き込みたいときはOrganizationレベルでPATPersonal Access Tokenを発行してもらってそれを渡す必要があった。したがって動作するコードは次のようになる。

name: Add comment when release completes to <repo url>
on:
  pull_request:
    types:
      - labeled
jobs:
  add-comment:
    if: github.event.label.name == 'リリース済み'
    runs-on: ubuntu-latest
    steps:
      - name: Add comment
        uses: peter-evans/create-or-update-comment@v1
        with:
          repository: <org>/<thatrepo>
          token: ${{ secrets.SUPER_ORGANIZATION_WIDE_GITHUB_PAT }}
          issue-number: <issuenumber>
          body: |
            ## リリース ${{ github.repository }}
            :sparkles: ${{ github.server_url }}/${{ github.repository }}/pull/${{github.event.pull_request.number}} :sparkles:
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?