GitHub Actions:如何通过GitHub API下载工作流日志及解决“Not Found”错误?
搞定GitHub Action日志获取的404错误!
嘿,看你的错误信息和配置,问题其实很明显——你调用的API路径写错啦!GitHub的日志API端点是复数的/logs,不是你写的/log,这就是为啥返回Not Found。
下面给你两种靠谱的解决办法,选哪种都行:
方法一:修正curl请求(快速改好你的现有代码)
把curl里的URL改成正确的复数路径,顺便优化下请求(GET请求不需要content-type头,还可以直接把日志ZIP包存下来):
- name: create log if: always() id: createlog run: | curl --request GET \ -H "Accept: application/vnd.github.v3+json" \ --header 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' \ https://api.github.com/repos/${{github.repository_owner}}/${{github.repository}}/actions/runs/${{ github.run_id }}/logs \ -o workflow-logs.zip
这里提两个小细节:
- 用
github.repository_owner替代你原来的github.owner,这个是GitHub官方推荐的上下文变量,更稳妥 - 加了
-o workflow-logs.zip是因为GitHub返回的日志是压缩包,直接存成文件方便你后续查看或者上传为产物
方法二:用官方Action更省心(推荐)
没必要自己写curl折腾,GitHub官方的github-script已经帮你封装好了API调用,代码更简洁还不容易出错:
- name: Download workflow logs if: always() uses: actions/github-script@v6 with: script: | const fs = require('fs'); const response = await github.rest.actions.downloadWorkflowRunLogs({ owner: context.repo.owner, repo: context.repo.repo, run_id: context.runId }); fs.writeFileSync('workflow-logs.zip', Buffer.from(response.data)); github-token: ${{ secrets.GITHUB_TOKEN }}
这个脚本会自动帮你调用API,把日志ZIP包保存到工作目录里,完全不用你管HTTP请求的细节。
最后再提几点注意事项
- GitHub的日志API返回的是ZIP压缩包,里面每个步骤的日志都是单独的文件,需要解压才能看具体内容
- 你配置的
if: always()很到位,不管工作流成功还是失败,都会执行日志下载步骤,这点没问题 - 如果你是私有仓库,只要你已经配置了
actions: read权限(你的job里已经加了),GITHUB_TOKEN就有足够权限获取日志
内容的提问来源于stack exchange,提问作者Ojer_Dev
相关产品推荐
相关产品推荐

