Published on

botにpushされてもGithub Actionsが動かない件

Authors

端的に言うとGithub Actionsでは、Action中にpushするパターンは無限ループが発生するリスクがあるので、実行者がボットgithub-actions[bot]の場合に限り、merge/pushした際には、その先のブランチで走るべきCIをキックしない仕様があり、対策が必要です。

経緯)自動マージの有効化を毎回するのはだるいので、Github Actionsにやらせました

こんな感じですぐ実装できます。

name: On pull requests, enable auto merge and auto-assign reviewers

on:
  pull_request:
    types: [opened, reopened, review_requested, ready_for_review]

jobs:
  enable-auto-merge:
    runs-on: ubuntu-latest
    permissions: write-all
    if: github.event.pull_request.draft == false
    steps:
      - name: Enable auto merge
        run: gh pr merge --auto --merge "$PR_URL" -t "$PR_TITLE" -b "$PR_BODY"
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          PR_URL: ${{ github.event.pull_request.html_url }}
          PR_TITLE: ${{ github.event.pull_request.title }}
          PR_BODY: ${{ github.event.pull_request.body }}

でもこれでマージしてしまうと、マージ先のCIが走らなくなります。

実行者がボットgithub-actions[bot]の場合に限り、merge/pushした際には、その先のブランチで走るべきCIをキックしない仕様があるようです。

Github ActionsでAction中にpushするパターンは無限ループが発生するリスクがあるのでこれの回避のためっぽいです。参考

対策としてはボットとしてCIを実行しないように開発者個人で使うパーソナルアクセストークンを代わりに渡してあげればよいです。

# Before
# secrets.GITHUB_TOKENは組み込み変数であり常にセットされているが、github-actions[bot]名義でghを実行してしまい不適切
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# After
# 変数名を例としてPERSONAL_ACCESS_TOKENとしているが、Organizationレベルで保存されたシークレットを参照する場合などはその変数名に書き換える必要があるし、逆にレポジトリ固有のシークレットを使う場合は別途手動で登録が必要である
GH_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}