You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Action调用GitHub API返回404错误,求排查方案

GitHub Action调用GitHub API返回HTTP Not Found,但Postman正常的问题排查与解决

嘿,我仔细看了你的问题和代码,发现问题大概率出在GitHub API请求的参数配置上——虽然你看到的请求URL和Postman里的一样,但Octokit Request的内部处理逻辑和直接调用URL是不一样的。

核心原因分析

你在代码里用了这样的请求配置:

let req = {
  method: 'GET',
  url: '/repos/:repo/issues/:issueNumber',
  headers: { authorization: `token ${myToken}` },
  repo: myRepo, // myRepo的值是RobotOpsPlayground/scottTest5
  issueNumber: myIssueNumber,
  log: "debug"
};

GitHub API的issues接口标准路径是/repos/:owner/:repo/issues/:issueNumber,需要分别传入owner和repo两个参数。但你的代码里只写了:repo一个占位符,还把包含owner的完整仓库路径(RobotOpsPlayground/scottTest5)传给了它。这会导致Octokit把整个字符串当作单一的repo名称去查找,而不是正确拆分owner和repo,GitHub自然找不到对应的仓库,返回404。

具体修复方案

方案一:修正请求路径与参数拆分

修改你的index.js代码,拆分完整仓库路径为owner和repo,并使用正确的API路径:

async function run() {
  const myToken = core.getInput('myToken');
  const myOwner = core.getInput('myOwner');
  const myRepoFull = core.getInput('myRepo');
  // 从完整仓库路径中拆分出单独的repo名称
  const myRepo = myRepoFull.split('/')[1];
  const myIssueNumber = github.context.issue.number;

  console.log(`getting /repos/${myOwner}/${myRepo}/issues/${myIssueNumber} details from github `);
  
  let req = {
    method: 'GET',
    // 修改为包含:owner和:repo的标准API路径
    url: '/repos/:owner/:repo/issues/:issueNumber',
    headers: { authorization: `token ${myToken}` },
    owner: myOwner,
    repo: myRepo,
    issueNumber: myIssueNumber,
    log: "debug"
  };
  // 修正语法错误:request需要传入req参数
  const result = await request(req);
  
  console.log("past getting issue")
  issue = result['data'];
  console.log(`my issue ${issue}`)
  if (issue.state !== 'open') {
    console.log("issue was not open")
  } else {
    console.log("processing issue");
  }
}

方案二:直接使用GitHub Context(更简洁可靠)

在GitHub Actions环境中,你可以直接从github.context获取仓库的owner和repo信息,不需要从外部传入,避免路径拆分的麻烦:

async function run() {
  const myToken = core.getInput('myToken');
  // 直接从context获取owner和repo,无需手动传参
  const { owner, repo } = github.context.repo;
  const myIssueNumber = github.context.issue.number;

  console.log(`getting /repos/${owner}/${repo}/issues/${myIssueNumber} details from github `);
  
  let req = {
    method: 'GET',
    url: '/repos/:owner/:repo/issues/:issueNumber',
    headers: { authorization: `token ${myToken}` },
    owner,
    repo,
    issueNumber: myIssueNumber,
    log: "debug"
  };
  const result = await request(req);
  
  console.log("past getting issue")
  issue = result['data'];
  console.log(`my issue ${issue}`)
  if (issue.state !== 'open') {
    console.log("issue was not open")
  } else {
    console.log("processing issue");
  }
}

用这个方案的话,你还可以在action.yaml里移除myOwner和myRepo的输入配置,进一步简化流程。

额外排查点

  1. 确认你的自托管runner没有网络代理/防火墙限制,能正常访问GitHub API(虽然Postman正常,但runner的网络环境可能不同)
  2. 再次验证个人令牌的repo权限(私有仓库必须要有这个权限才能访问issues接口)

内容的提问来源于stack exchange,提问作者Scott S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 15:32:53