如何采集GitHub Actions作业各步骤的运行时长数据
有两类成熟可落地的方案,都能准确获取单个GitHub Actions作业下每个执行步骤的具体运行耗时,不管是离线批量统计还是运行时实时采集都能覆盖:
方案1:调用GitHub官方REST API采集
这是准确性最高、适配场景最广的方案,不需要修改现有工作流配置:
- 先通过工作流运行列表接口拿到目标作业对应的
job_id,注意不要和工作流运行ID(workflow run id)混淆,单次工作流运行通常会关联多个独立作业。 - 拿到
job_id后调用单作业详情接口,返回结构中的steps字段就是该作业下所有执行步骤的结构化数组:每个步骤对象包含步骤名称、执行序号、运行状态(成功/失败/跳过)、started_at(启动时间)、completed_at(结束时间)字段,两个时间做差值就能得到单步骤的精确运行耗时,时间戳是GitHub后端记录的调度时间,没有日志解析带来的误差。 - 接口认证非常简单,如果是在工作流内部调用,直接用内置的
GITHUB_TOKEN即可,只需要给工作流配置actions: read权限;如果是本地/外部服务调用,生成一个具备actions: read权限的个人访问令牌(PAT)放在请求头里就行。 - 最简调用示例:
# 替换OWNER、REPO、JOB_ID为实际的仓库所有者、仓库名、目标作业ID curl -L \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer $GITHUB_TOKEN" \ https://api.github.com/repos/OWNER/REPO/actions/jobs/JOB_ID
- 这个方案支持批量拉取历史作业数据做离线统计,不需要重新触发工作流运行,适合做长期的耗时趋势分析。
方案2:基于现成Action在工作流运行时自动采集
如果不想自己写API调用、数据解析的逻辑,可以直接在现有工作流里加一个收尾步骤实现自动采集:
- 这类现成的步骤统计Action只需要放在作业的最后一个步骤位置,运行时会自动读取当前作业的上下文,拉取本次作业的所有步骤运行数据,自动计算每个步骤的耗时,支持输出JSON、CSV等结构化格式,你可以直接把结果输出到日志,也可以对接自己的存储、监控看板。
- 最简配置示例:
jobs: your-target-job: runs-on: ubuntu-latest permissions: actions: read # 必须开通Actions读权限,否则无法拉取作业详情 steps: - name: 检出代码 uses: actions/checkout@v4 # 下方放置你原有的所有业务步骤 - name: 执行构建 run: npm run build - name: 运行测试 run: npm run test # 最后放置采集步骤 - name: 采集步骤耗时统计 uses: 通用步骤耗时统计Action with: output_format: json
- 这个方案适合每次工作流运行时实时上报数据,比如耗时超阈值自动发告警,不需要额外部署定时任务拉取API。
避坑提示
- 不要靠解析工作流运行日志里的时间戳算耗时,日志时间受日志上传延迟、运行器时区配置、日志截断规则影响,误差通常在数秒到数十秒不等,远不如API返回的后端记录时间准确。
- 如果你的工作流用到了复用工作流(reusable workflow),调用API的时候注意要拉取对应子作业的
job_id,不要用主工作流的作业ID,否则拿不到子作业里的步骤数据。 - 公开仓库的作业数据不需要认证也能拉取,但是会有接口频率限制,生产环境使用建议还是带上认证token。
内容的提问来源于stack exchange,提问作者Felipe Plets
相关产品推荐
相关产品推荐

