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的输入配置,进一步简化流程。
额外排查点
- 确认你的自托管runner没有网络代理/防火墙限制,能正常访问GitHub API(虽然Postman正常,但runner的网络环境可能不同)
- 再次验证个人令牌的
repo权限(私有仓库必须要有这个权限才能访问issues接口)
内容的提问来源于stack exchange,提问作者Scott S
相关产品推荐
相关产品推荐

