はじめに
Github Actionsでワークフローを実装していたところ、git pushコマンド実行時に以下エラーに遭遇したので備忘録。
! [remote rejected] upstream-release/v4.3.2-16279331410 -> upstream-release/v4.3.2-16279331410 (refusing to allow a GitHub App to create or update workflow `.github/workflows/browser-extension.yml` without `workflows` permission) error: failed to push some refs to 'https://github.com/<リポジトリ名>' Error: Process completed with exit code 1.
なお、Github Actionsで実行したエラーに対応するコマンドは以下だった。
git push origin upstream-release/v4.3.2-16279331410
解説
原因
Github Actions がデフォルトで利用する GITHUB_TOKEN では、 workflow フォルダ への更新が禁止されているため、エラーが発生した。
Github Actions が 自身の定義を含む workflow フォルダを更新するのは、セキュリティ上よろしくないので禁止されているらしい。(公式ドキュメントでは未確認のため推測)
解決方針
wokflowフォルダの更新を許可するトークンを払い出し、Github Actions 内で代わりに参照させることで解決する。
デフォルトのGITHUB_TOKENでは workflow フォルダの権限を許可する制御ができないので、新しいトークンを払い出す必要がある。
AIに尋ねると permissions セクションに以下コード追記するよう提案された。がこれは間違っているので注意(※)
"permissions": {
"workflows": "write"
}
※ AIの回答が間違っていた根拠
- そもそも workflows というキーは提供されていない ref
- また、
write-allで全ての権限を許可してもエラーが解消しなかった。
解決手順
今回は PAT(classic) による解決方法を紹介する。 PATとは Personal access tokensの略。
なお、PAT(classic)はセキュリティ上推奨されないが、今回はミニマムにできる解決方法として紹介する。(この方法が分かっていれば、あとはGithub Appによる一時トークンやFine-grained tokensに置き換えるだけでOKなはず)
STEP1. PATの発行
①Githubにて、 [Settings > Developer Settings > Pesonal access tokens > Token(classic)] の順にページを開く
さらに、[Generate new token > Generate new token(classic)]の順に開く。

②各項目を埋める。権限は、repo と workflow につければOK。それ以外の項目は適当でOK。
その後、[Generate token]を押し、トークンを生成する

③トークン生成後はその値をコピーできるので控えておく。
STEP2. (任意)PAT権限の確認
発行したPATが正しく動作するかローカル環境でgit push コマンドで確認してみるとよい。
①対象リポジトリの workflow に適当なファイルを作成し、コミットする。
②以下コマンドを実行し、pushが出来るか確認してみる
git push https://x-access-token:<控えたトークンの値>@github.com/<リポジトリ名>.git <Push先のブランチ名>
PATの権限が上手くついていないと下記の403エラーが発生する
fatal: unable to access 'https://github.com/<リポジトリ名>/': The requested URL returned error: 403
STEP3. Github ActionsでPATを参照させる
Github Actions の定義ファイル上では、git push コマンド自体ではなく、`actions/checkout を更新する。
actions/checkout 時は、Git の認証情報(クレデンシャル)ヘルパーがセットされる。
すなわち、アクション内の token の値として セットしたトークンの権限下でその後のGit操作が行われるようになるので、上記の改修方針となる。
①先ほど控えたトークン値を対象のリポジトリの secrets に格納する
②チェックアウトステップの定義を更新し、secretsに格納したPATを参照させる
- name: Checkout FORK Repository uses: actions/checkout@v4 with: repository: hoge/hogehoge fetch-depth: 0 # ★ここを修正★ GITHUB_TOKEN の代わりに PAT を渡す token: ${{ secrets.MY_PAT}}
③更新後のファイルをプッシュ→Github Actionsを動かし、エラーが解消されたことを確認する。
終わりに
Github Actionsの権限は初見でつまづくポイントだなと思った。
このトラシュにかなり苦しんだが、おかげで GITHUBトークンの違いについても理解が進んだので良かった。
菅谷 歩 (記事一覧)