GitHub Actionsでworkflowフォルダ更新を伴うPushが出来ない場合の対処

記事タイトルとURLをコピーする

はじめに

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)]の順に開く。

②各項目を埋める。権限は、repoworkflow につければ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トークンの違いについても理解が進んだので良かった。

菅谷 歩 (記事一覧)