GitHub Actions:「refusing to allow a GitHub App to create or update workflow」
.github/workflows の下のファイルを足したり変えたりするコミットの書き込みを、GitHub が断りました。トークンにワークフローのファイルを書く権利が無いからです。ほとんどは、フォークを上流に合わせ続ける定期のジョブで、上流が自分のワークフローを直した日に起きています。
見え方
git push のとき(promxy #1):
! [remote rejected] master -> master (refusing to allow a GitHub App to create or update workflow `.github/workflows/build.yml` without `workflows` permission)
gh repo sync や merge-upstream の API のとき(sparkDash #1):
gh: refusing to allow a GitHub App to create or update workflow `.github/workflows/publish-image.yml` without `workflows` permission (HTTP 422)
「refusing to allow」のあとの言葉で、トークンの種類がわかります:
- 「a GitHub App」:
GITHUB_TOKEN、または Workflows の権限を持たない GitHub App のトークン。 - 「a Personal Access Token ... without `workflow` scope」:個人アクセストークン。
- 「an OAuth App ... without `workflow` scope」:OAuth アプリを通したサインイン。たとえば自分の PC の
ghや認証情報ヘルパーです。
チェックが掛かるとき
GitHub の OAuth のスコープの一覧には、同じファイル(パスも中身も同じ)が同じリポジトリの別のブランチにあれば、このスコープなしでワークフローのファイルをコミットできる、とあります。見られるのは push するコミットの中のワークフローのファイルで、変えるつもりだったかどうかではありません:
- 上流からのマージは、上流のワークフローの変更も一緒に持ってきます。gcc-creative-studio #90 の週1回の同期は、上流が
backend-tests.ymlに Postgres のサービスを足したあと、断られるようになりました。 - 同じマージでも、コミットの前にフォーク自身のワークフローのファイルに戻せば通ります。govee-homeassistant #7 は
--no-commit --no-ffでマージし、.github/workflowsの下のファイルをすべてフォークの版に戻し、それでもマージがどれかを変えるなら push しません。毎日の同期は、それ以降の実行(10月26日〜11月2日)がすべて成功しています。 - たまたま通ることがあります。lilac-mono #90 では、別のブランチがたまたま上流のワークフローのファイルを持っていたので1回だけ通り、そのブランチが消えてからは毎回断られました。winmux #2 が「ときどき起きる」と書いているのも同じ理由です。
GITHUB_TOKEN ではけっしてできない
workflows は、ワークフローが GITHUB_TOKEN に設定できる権限に入っていないので、permissions をどう書いても助けになりません。gh repo sync が使う merge-upstream の API も、同じようにチェックされます(github-code-monkey-bot #12)。
どうするか
- 権利を持つトークンで push する:
- リポジトリの権限 Contents と Workflows を読み書きにした GitHub App。トークンはジョブの中で
actions/create-github-app-tokenで作ります。 - Contents と Workflows を読み書きにした fine-grained の個人アクセストークン。対象はそのリポジトリだけにします。
repoとworkflowのスコープを持つ classic の個人アクセストークン。
actions/checkoutのtoken:に渡します。push の URL にだけ入れたトークンは、checkout が保存したトークンに負けることがあり、そのときも断りの文は「a GitHub App」のままです(「Permission to ... denied to github-actions[bot]」の4)。 - リポジトリの権限 Contents と Workflows を読み書きにした GitHub App。トークンはジョブの中で
- フォークに上流には無い自分のワークフローがあるなら、上の govee-homeassistant のように、フォークのワークフローのファイルを残す。
- 同期をやめる。sparkDash はイメージを作るのに上流のコードが要るだけだったので、上流を直接チェックアウトするようにし、同期はやめました。
同期のジョブに強いトークンを渡す前に、何を push するかを見ます。promxy のジョブは git reset --hard upstream/master をして強制 push していました。ワークフローを書けるトークンだったら、フォーク自身の mirror-sync.yml を消し、最初に成功したあとで自分の定期実行を止めていたところでした。それまでの定期の実行はすべて失敗していて、GitHub は活動が無いとしてワークフローを止めていました。
自分の PC で出たら
- 「a Personal Access Token」:
workflowのスコープ(classic)か Workflows の権限(fine-grained)を持つトークンを作り、認証情報ヘルパーが保存しているトークンと入れ替えます。 - 「an OAuth App」:
ghを認証情報ヘルパーにしているなら、次のコマンドでスコープを足します:gh auth refresh --scopes workflow
見分け方
remote: Permission to owner/repo.git denied to github-actions[bot]と 403:トークンがリポジトリにまったく書き込めませんでした(「Permission to ... denied to github-actions[bot]」)。remote: error: GH006: Protected branch update failed:トークンは書き込めたが、ブランチの保護が push を断りました。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub と GitHub Actions は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitHub:フォークが同期できない · 「could not read Username for 'https://github.com'」 · 「Permission to ... denied to github-actions[bot]」 · 「Resource not accessible by integration」 · 「Invalid workflow file」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English