GitHub:フォークからのプルリクのチェックが失敗する
フォークしたリポジトリからワークフローが起きたときは、GITHUB_TOKEN を除いてシークレットはランナーに渡されず、フォークからのプルリクでは GITHUB_TOKEN は読み取り専用です(GitHub の ワークフローをトリガーするイベント・2026年10月27日に確認)。pull_request のイベントはプルリクのマージコミットにあるワークフローのファイルを動かし、フォークからのプルリクではそのコミットを決めるのはマージ先に書き込み権限の無い人です。そのため、シークレットを使う手順やリポジトリに書き込む手順はそこで失敗します(GitHub の pull_request_target を安全に使う)。
フォークからのプルリク pull_request はマージコミットから動く GITHUB_TOKEN 読み取り専用 ほかのシークレット 渡らない 非公開リポジトリ Fork pull request workflows の設定 pull_request_target 既定のブランチのコード・シークレット・書き込みできるトークン
なぜ失敗するか
- シークレットが空になる:渡るのは
GITHUB_TOKENだけなので、シークレットを読むレジストリへのログインやデプロイは何も受け取れません。 - 書き込みが断られる:
GITHUB_TOKENでコメント・ラベル付け・プッシュをする手順のトークンは読み取り専用です。pull_request_reviewとpull_request_review_commentも、Dependabot が開いたプルリクも同じ制限を受けます(Dependabot のプルリクのチェック)。 - チェックはマージ先のリポジトリから来る:フォークからのプルリクのイベントは GitHub がマージ先のリポジトリに送り、フォークの側では起きません(GitHub の フォークしたリポジトリのプルリクのイベント)。フォークでは既定でワークフローは動かず、フォークの Actions タブで GitHub Actions を有効にする必要があります。
- まだ何も動いていない:公開リポジトリへの初めての貢献者のプルリクでは、先に書き込み権限のあるメンテナーが実行を承認する必要があることがあります(ワークフローが作ったプルリク)。
非公開リポジトリ:Fork pull request workflows
非公開リポジトリへのフォークからのプルリクでは、ワークフローは有効にしたときだけ動きます。Settings → Actions → General の Fork pull request workflows にある設定は次の4つです(GitHub の 非公開リポジトリのフォークのワークフローを有効にする)。
- Run workflows from fork pull requests:読み取り専用の
GITHUB_TOKENで、シークレットには触れずに動かします。 - Send write tokens to workflows from pull requests:フォークからのプルリクに書き込み権限のある
GITHUB_TOKENを渡します。 - Send secrets to workflows from pull requests:すべてのシークレットをプルリクに渡します。
- Require approval for fork pull request workflows:書き込み権限の無い共同作業者のプルリクの実行は、書き込み権限のある人の承認を待ちます。
この設定は組織にもリポジトリにもでき、組織で無効にした設定はリポジトリでは有効にできません。
どうするか
- ビルドとテストは pull_request のままにする:追加のシークレットが要らないなら
pull_requestを使い、複雑なワークフローではプルリクのコードを扱う部分とシークレットを使う部分を分けるよう GitHub は書いています(GitHub の pull_request_target を使うかの判断)。 - ラベル付けやコメントは pull_request_target で:マージ先のリポジトリの既定のブランチの文脈で動き、その
GITHUB_TOKENとシークレットを受け取るので、フォークからのプルリクにラベルを付けたりコメントしたりできます。プルリクのコードをビルドしたり動かしたりするなら使わないよう GitHub は書いています(GitHub の pull_request_target)。 - フォークのコードをシークレットつきで動かさない:
pull_request_targetでプルリクの head をチェックアウトしてビルドやテストをすると、フォークのコードがシークレットつきで動きます。そこでactions/checkoutがフォークのプルリクの head をチェックアウトするのはallow-unsafe-pr-checkout: trueのときだけで、GitHub はチェックアウトしたコードが決して実行されないと確かめてから設定するよう書いています(GitHub の 組み込みの保護を外す)。 - 公開リポジトリ:当てはまる Actions のイベントのポリシーが無いと、GitHub は
pull_request_targetで起きるワークフローを止める既定のポリシーを足します。今は評価のモードで実行は続き、影響を受けるリポジトリには2026年12月2日に適用すると GitHub は書いています。このイベントを使い続けるなら、それを許すイベントのポリシーを作ります(GitHub の pull_request_target の既定のポリシー)。 - キャッシュの保存が警告になる:
pull_request_targetで起きたワークフローは既定のブランチのキャッシュを戻せますが保存はできず、保存はログの警告になってジョブは続きます。キャッシュはpushのような信頼できるトリガーから保存します(GitHub の pull_request_target のワークフローを固める)。
IntelliJ IDEA で GitHub のプルリクを見るなら
Lesstep の Pull Request Inbox for GitHub は、JetBrains IDE(2024.1 以降)のプラグインです。プルリクのレビュー・チェック・会話を差分の隣に出し、対象のブランチが許す方法でマージします。GitHub が先頭のコミットに報告したチェックをそれぞれの実行へのリンクつきで並べるので、フォークからのプルリクで失敗したジョブは GitHub でログごと開けます。フォークからのプルリクは、GitHub がどのプルリクにも保っている head をプルリクの名前のブランチにフェッチしてチェックアウトし、マージの後にフォークのブランチを消す選択は出しません。ワークフロー・シークレット・リポジトリの設定は変えません。受信箱・差分・会話は無料、承認・コメント・解決・マージは Pro(月 US$1.50・30日間の無料試用つき)です。画面は日本語です。
GitHub は GitHub, Inc. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:GitHub のマージの断り(405・409) · GitHub のレビューの断り(422) · GitHub の検索の 422「Validation Failed」 · 「Resource not accessible by personal access token」 · 401「Bad credentials」 · 「Resource protected by organization SAML enforcement」 · 「API rate limit exceeded」 · GitHub の差分の 406「too_large」・3,000件 · GitHub の行のコメントの 422「must be part of the diff」 · GitHub のブランチの更新の断り(422) · GitHub のプルリクが作れない(422・403) · GitHub の自動マージの断り · GitHub の下書き・レビュー準備完了・閉じるの断り · GitHub の会話の解決の断り · GitHub のチェックが出ない(check runs の 403) · GitHub のファイルの中身が読めない · GitHub の比較の断り(404・422) · GitHub のコメント・返信の断り(ロック・アーカイブの 403) · GitHub のマージの方法の断り(405) · GitHub のブランチが見つからない(404・301) · GitHub Enterprise Server につながらない · GitHub のレビューの依頼が出ない · GitHub のプルリクの一覧が足りない · GitHub の 404・名前を変えたリポジトリ(301・307) · GitHub の行のコメントが outdated・差分に無い · GitHub のプルリクの更新・通知が遅い · GitHub の変更の提案が適用できない · GitHub の必須チェックが Expected のまま · GitHub でコードオーナーのレビューが要る · GitHub で未解決の会話がマージを止める · GitHub で署名の無いコミットがマージを止める · GitHub のマージキューでマージするブランチ · GitHub でマージが最後の push の承認を待っている · GitHub でマージがコードスキャンの結果を待っている · GitHub でマージがコード品質の結果を待っている · GitHub でコードのカバレッジの水準がマージを止める · GitHub でライセンスの適合の結果がマージを止める · GitHub でブランチのロックや更新の制限がマージを止める · GitHub でマージの後にブランチが消えない · GitHub でチームの承認(Required reviewers)がマージを止める · GitHub でシークレットスキャンのアラートがマージを止める · GitHub でスタックしたプルリクがマージできない · GitHub で push の規則が push を止める · GitHub でコミットのメタデータの規則がマージを止める · GitHub で強制 push が止められる · GitHub でプルリクをマージしても issue が閉じない · GitHub のプルリクを手元にチェックアウトできない · GitHub のプルリクがマージ先と衝突している · GitHub で変更を依頼された・レビューを取り消す · GitHub で共同作者がコミットに数えられない · GitHub で依存関係のレビューのチェックが失敗する · GitHub で Dependabot がプルリクをリベースしない · GitHub でフォークが同期できない · GitHub でプルリクのベースのブランチを変えられない · GitHub でプルリクを取り消せない · GitHub でプルリクのテンプレートが出ない · GitHub でプルリクにラベルや担当者が付かない · GitHub でプルリクを閉じられない・開き直せない · GitHub でプッシュ保護にプッシュを止められた · GitHub でプルリクのコメントが隠された · GitHub でデプロイが成功するまでプルリクをマージできない · GitHub でチームに頼んだレビューがメンバーに置き換わった · GitHub でプルリクのファイルの Viewed が外れた · GitHub でマージしていないプルリクがマージ済みになった · GitHub で Copilot のレビューが承認に数えられない · GitHub でワークフローが作ったプルリクのチェックが動かない · GitHub でプルリクに Update branch のボタンが出ない · GitHub で Dependabot のプルリクのチェックが失敗する · GitHub でコミットメッセージの [skip ci] でチェックが動かない · GitHub で保存期間を過ぎてチェックが消えた · GitHub の公開リポジトリのコードレビューの制限 · GitHub でリポジトリのプルリクがオフ・制限されている · GitHub でスタックのプルリクごとにチェックが走る · GitHub でスカッシュでマージ済みのコミットが次のプルリクに出る · GitHub のプルリクでファイルの差分が出ない · GitHub でフォークのプルリクのブランチに push できない · GitHub のプルリクのチェックが取り消された · GitHub で Rebase and merge が使えない · GitHub のマージのコミットメッセージが思った形にならない · GitHub のプルリクでファイルの全行が変わったと出る · GitHub の API がタイムアウトした · GitHub のプルリクで画像や文書の差分が見た目で出ない · GitHub のレビューの依頼が断られる(422) · GitHub で Copilot が作ったプルリクのチェックが動かない・承認が数えられない · GitHub の push が GH006・GH013 で断られる · GitHub で承認が足りずマージできない・数に入らない承認 · JetBrains の IDE で GitHub のプルリクを扱う · English