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 は制約が一段増える
関連記事