GitHub Actions自动向上游仓库创建PR报HttpError:Not Found如何解决
错误原因
HttpError: Not Found 由多处配置错误共同导致:
- 接口请求的目标仓库参数错误:原代码从
context.repo取到的owner是fork仓库所属的组织账号,不是上游私有原始仓库的所属个人账号,同时repo字段填了完整URL占位,GitHub API的该字段仅接受仓库短名称,最终请求打到了错误的仓库地址,直接返回404 - 跨仓库PR的
head参数格式错误:跨fork创建PR时,head参数必须遵循fork所有者:分支名的格式,原代码只填了分支名main,GitHub会默认去目标上游仓库里找main分支作为PR源分支,不存在对应源分支就会报404 - 步骤ID缺失:原代码中获取npm版本的步骤没有配置
id,后续步骤无法读取到版本输出值 - 触发条件冗余:
pull_request事件会在PR发起、更新时触发,而非合并到main后触发,会导致工作流在PR未合入时就提前运行 - 权限配置问题:如果Personal Token没有勾选私有仓库访问权限、secret存错位置、组织开启SAML后未给PAT授权,也会返回404无权限错误
修正后的工作流配置
name: CI on: push: branches: [ "main" ] workflow_dispatch: jobs: create-upstream-pr: runs-on: ubuntu-latest env: # 替换成你自己的上游仓库信息,不要填完整URL UPSTREAM_OWNER: 你的个人账号ID UPSTREAM_REPO_NAME: 原始私有仓库的短名称 FORK_OWNER: ${{ github.repository_owner }} steps: - uses: actions/checkout@v3 - name: Get current package version id: get-version # 必须配置步骤ID,后续才能读取输出 uses: martinbeentjes/npm-get-version-action@v1.2.3 - name: Print release version run: echo "Preparing to create upstream PR for version v${{ steps.get-version.outputs.current-version }}" - name: Create Pull Request to upstream uses: actions/github-script@v6 with: github-token: ${{ secrets.API_GITHUB }} script: | // 先判断是否已经存在开放的同版本PR,避免重复创建 const existPr = await github.rest.pulls.list({ owner: process.env.UPSTREAM_OWNER, repo: process.env.UPSTREAM_REPO_NAME, state: 'open', head: `${process.env.FORK_OWNER}:${{ github.ref_name }}`, base: 'main' }) if (existPr.data.length > 0) { console.log("Existing open PR found, skip creation") return } const result = await github.rest.pulls.create({ title: `release v${{ steps.get-version.outputs.current-version }}`, owner: process.env.UPSTREAM_OWNER, repo: process.env.UPSTREAM_REPO_NAME, head: `${process.env.FORK_OWNER}:${{ github.ref_name }}`, base: 'main', maintainer_can_modify: true }); console.log(`PR created, address: ${result.data.html_url}`) - name: Task done run: echo "Upstream PR creation task finished"
前置检查项
- 生成Personal Token时必须勾选完整的
repo权限范围,否则无法操作私有仓库 API_GITHUB这个secret必须配置在组织账号下的fork仓库中,不要配置在个人账号或者组织全局层级- 如果组织开启了SAML单点登录,需要在Personal Token的配置页给该token授权对应组织的访问权限
- 确认fork仓库和上游原始仓库的默认分支都是
main,如果上游默认分支是master需要同步修改base参数值
内容的提问来源于stack exchange,提问作者Adrián
相关产品推荐
相关产品推荐

