• システム開発に関わる内容をざっくりと書いていく

GitHub Actions Permission denied / checkout 失敗

Actions で checkout が落ちる、スクリプトが Permission denied、成果物が書けない——権限と実行ビット、トークン権限、runner のユーザーが絡むことが多い。まず「どのステップのどのパスで拒否されたか」をログから特定する。

先に結論

  • checkout 失敗は token/permissions/リポジトリ参照の問題が多い
  • シェルの Permission denied は実行ビット無し・インタプリタ無し・ディレクトリ権限が多い
  • workflow の permissions: が最小権限すぎて API 操作に足りないことがある
  • 自作 runner はホスト側のファイル所有者ズレにも注意

checkout 周り

  • actions/checkout のログで認証エラーか、参照(ref)不存在かを分ける
  • private サブモジュールや別リポジトリは追加 token/SSH が必要なことがある
  • permissions: contents: read 等、不足していないか確認
  • fork PR では secrets が制限されるケースがある

Permission denied 定番

  • スクリプトに実行権限が無い(リポジトリ上で bit が落ちている)
  • bash script.sh ではなく直接実行して失敗している
  • shebang のインタプリタが runner に無い
  • 作業ディレクトリやキャッシュパスへの書き込み不可
  • Docker 内ユーザーとマウント先の所有者不一致

対処

  • 必要最小限で permissions を足す(contents/packages/id-token など)
  • スクリプトは chmod +x をジョブ内で行うか、bash 経由で実行
  • checkout の token 入力や ssh-key を用途に合わせて設定
  • 失敗ステップの working-directory とパスをログで再確認

ざっくりまとめ

  • 拒否の種類(git/ファイル/API)をログで分ける
  • checkout は token と permissions、スクリプトは実行ビットが本命
  • fork/自作 runner は制約が一段増える

関連記事