GitHub: checks fail on a pull request from a fork
With the exception of GITHUB_TOKEN, secrets are not passed to the runner when a workflow is triggered from a forked repository, and the GITHUB_TOKEN has read-only permissions in pull requests from forked repositories (GitHub's events that trigger workflows, checked October 27, 2026). The pull_request event runs the workflow file from the merge commit of the pull request, and for a pull request from a fork that commit is controlled by someone without write access to the base repository, so a step that needs a secret or writes to the repository fails there (GitHub's securely using pull_request_target).
pull request from a fork pull_request runs from the merge commit GITHUB_TOKEN read-only other secrets not passed private repository Fork pull request workflows settings pull_request_target default branch code, secrets, write token
Why it fails
- The secret is empty: a login to a registry or a deploy that reads a secret gets nothing, because only
GITHUB_TOKENis passed. - The write is refused: a step that comments, labels or pushes with
GITHUB_TOKENhas a read-only token. The same limits apply topull_request_reviewandpull_request_review_comment, and to pull requests Dependabot opened (see Dependabot pull request checks). - The checks come from the base repository: GitHub sends the pull request events of a pull request from a fork to the base repository, and none occur on the fork (GitHub's pull request events for forked repositories). Workflows do not run in a fork by default; Actions has to be turned on in the fork's Actions tab.
- Nothing ran yet: for a first-time contributor to a public repository, a maintainer may need to approve the runs first (see workflow-created pull requests).
Private repositories: Fork pull request workflows
For a pull request from a fork to a private repository, workflows run only when they are turned on. Under Settings, Actions, General, Fork pull request workflows, the policies are (GitHub's enabling workflows for forks of private repositories):
- Run workflows from fork pull requests: runs them with a read-only
GITHUB_TOKENand no access to secrets. - Send write tokens to workflows from pull requests: gives pull requests from forks a
GITHUB_TOKENwith write permission. - Send secrets to workflows from pull requests: makes all secrets available to the pull request.
- Require approval for fork pull request workflows: runs on pull requests from collaborators without write permission wait for approval from someone with write permission.
The policies can be set for an organization or a repository; a policy turned off for the organization cannot be turned on for a repository.
What to do
- Keep building and testing on pull_request: GitHub says to use
pull_requestif additional secret access is not needed, and to separate handling of the pull request code from accessing secrets in more complex workflows (GitHub's deciding whether to use pull_request_target). - Label or comment with pull_request_target: it runs in the context of the default branch of the base repository and gets its
GITHUB_TOKENand secrets, which lets a workflow label or comment on pull requests from forks. GitHub says to avoid it if you need to build or run code from the pull request (GitHub's pull_request_target). - Do not run the fork's code with secrets: checking out the pull request head under
pull_request_targetand then building or testing it runs the fork's code with the secrets.actions/checkoutchecks out pull request head refs from forks there only withallow-unsafe-pr-checkout: true, which GitHub says to set only after confirming the checked-out code is never executed (GitHub's opting out of built-in protections). - Public repositories: where no applicable Actions event policy exists, GitHub adds a default policy that blocks workflows triggered by
pull_request_target. It runs in evaluate mode for now, so runs continue, and GitHub says it will enforce it on December 2, 2026 for affected repositories. To keep the event, create an event policy that allows it (GitHub's default policy for pull_request_target). - A cache save warns: workflows triggered by
pull_request_targetcan restore caches of the default branch but cannot save them; the save fails with a warning in the log and the job continues. Save the cache from a trusted trigger such aspush(GitHub's hardening a pull_request_target workflow).
GitHub pull requests in IntelliJ IDEA
Pull Request Inbox for GitHub, a plugin by Lesstep for JetBrains IDEs 2024.1 or later, shows a pull request's reviews, checks and conversations next to the diff, and merges it with the methods the target branch allows. It lists the checks GitHub reports on the head commit, each with a link to its run, so a failed job on a pull request from a fork opens on GitHub with its log. It checks out a pull request from a fork by fetching the head GitHub keeps for every pull request into a branch named after the pull request, and after a merge it does not offer to delete the fork's branch. It does not change workflows, secrets or repository settings. The review inbox, diffs and conversations are free; approving, commenting, resolving and merging are Pro (US$1.50 a month, with a 30-day trial).
GitHub is a trademark of GitHub, Inc.; IntelliJ IDEA is a trademark of JetBrains s.r.o. This page is not affiliated with or endorsed by GitHub, Inc. or JetBrains.
More: GitHub merge refused (405, 409) · GitHub review refused (422) · GitHub search 422 "Validation Failed" · "Resource not accessible by personal access token" · 401 "Bad credentials" · "Resource protected by organization SAML enforcement" · "API rate limit exceeded" · GitHub diff 406 "too_large", 3,000 files · GitHub line comment 422 "must be part of the diff" · GitHub branch update refused (422) · GitHub pull request not created (422, 403) · GitHub auto-merge refused · GitHub draft, ready for review or close refused · GitHub conversation not resolved · GitHub checks not shown (check runs 403) · GitHub file contents not read · GitHub compare refused (404, 422) · GitHub comment or reply refused (403 locked, archived) · GitHub merge method not allowed (405) · GitHub branch not found (404, 301) · GitHub Enterprise Server not reached · GitHub review request not shown · GitHub pull request list incomplete · GitHub 404 Not Found, renamed repositories (301, 307) · GitHub line comment outdated or not on the diff · GitHub pull requests not updating, notifications late · GitHub suggested change cannot be applied · GitHub required check stuck at "Expected" · GitHub code owner review required · GitHub merge blocked by unresolved conversations · GitHub merge blocked by unsigned commits · GitHub branch that merges through a merge queue · GitHub merge waiting for an approval of the most recent push · GitHub merge waiting for code scanning results · GitHub merge waiting for code quality results · GitHub merge blocked by a code coverage threshold · GitHub merge blocked by license compliance results · GitHub branch locked or its updates restricted · GitHub branch not deleted after merging · GitHub merge waiting for a team's approval (Required reviewers) · GitHub merge blocked by secret scanning alerts · GitHub stacked pull request not merging · GitHub push blocked by push rules · GitHub merge blocked by commit metadata rules · GitHub force push blocked · GitHub issue not closed by a merged pull request · GitHub pull request not checked out locally · GitHub pull request has merge conflicts · GitHub changes requested and dismissing a review · GitHub co-author not credited for a commit · GitHub dependency review check failed · GitHub Dependabot not rebasing its pull request · GitHub fork not syncing with upstream · GitHub pull request base branch not changing · GitHub pull request not reverting · GitHub pull request template not showing · GitHub pull request labels or assignees not added · GitHub pull request not closing or reopening · GitHub push blocked by push protection · GitHub pull request comment hidden · GitHub pull request blocked until deployments succeed · GitHub team review request replaced by members · GitHub pull request file no longer marked Viewed · GitHub pull request marked merged without being merged · GitHub Copilot review does not count as an approval · GitHub checks not running on a pull request a workflow created · GitHub Update branch button not shown on a pull request · GitHub checks failing on a Dependabot pull request · GitHub checks skipped by [skip ci] in a commit message · GitHub checks gone after the retention period · GitHub code review limits in a public repository · GitHub pull requests turned off or limited in a repository · GitHub checks run on every pull request in a stack · GitHub pull request showing commits already squash merged · GitHub pull request not showing a file diff · GitHub push to a pull request branch from a fork refused · GitHub check cancelled on a pull request · GitHub Rebase and merge not available · GitHub merge commit message not what you expected · GitHub pull request shows every line changed · GitHub API request timed out · GitHub pull request image or document diff not shown · GitHub review request refused (422) · GitHub pull request from Copilot: checks not running, approval not counted · GitHub push refused: GH006 and GH013 on a protected branch · GitHub "At least 1 approving review is required", approvals that do not count · GitHub pull request plugins for IntelliJ IDEA, compared · 日本語