GHA工作流重跑后,如何获取至指定步骤的准确运行时长?
核心问题根因
- 原有逻辑取工作流API返回的
created_at字段,记录的是该工作流运行实例首次创建的固定时间,后续无论触发多少次整体重跑、单个Job/步骤重试,这个值都不会更新,因此计算的时长会混入首次运行到重跑之间的等待时间,和预期的「本次重跑的实际运行时长」不符。
可落地的解决方案
方案1:直接替换API返回的计时字段
将原计算逻辑中使用的created_at,替换为同一API返回的run_started_at字段即可。
- 字段特性:
run_started_at记录工作流运行实例实际进入执行阶段的时间,每次重跑、重试触发新的执行时,该字段都会重置为本次执行的启动时间,完全匹配计时起点需求。 - 仅需修改原YAML中差值计算的取数部分即可:
DIFF=`ddiff -i "%Y-%m-%dT%H:%M:%SZ" "${{ fromJson(steps.workflowRunId.outputs.data).run_started_at }}" $NOW -f "%H°%M'%S\" to complete."`
方案2:使用GHA内置上下文简化流程(更推荐)
无需额外调用API、也无需安装第三方dateutils依赖,直接通过GHA内置的github.run_started_at上下文变量获取计时起点,适配所有运行环境:
- name: 计算当前步骤累计运行耗时 id: workflowDuration run: | # 将当前时间、运行启动时间都转为秒级时间戳计算差值 NOW_EPOCH=$(date -u +%s) START_EPOCH=$(date -u -d "${{ github.run_started_at }}" +%s) DIFF_SEC=$((NOW_EPOCH - START_EPOCH)) # 格式化为时分秒的展示格式 HOURS=$((DIFF_SEC / 3600)) MINS=$(( (DIFF_SEC % 3600) / 60 )) SECS=$((DIFF_SEC % 60)) echo "本次运行已耗时:${HOURS}°${MINS}'${SECS}\" to complete."
- 方案优势:
- 无外部依赖,不受RHEL/Ubuntu/Debian等不同 runner 系统版本的限制,不会出现原逻辑中rpm安装在非RHEL环境执行失败的问题
- 减少一次API调用开销,无需额外配置请求权限
- 内置变量的时间值和重跑实际启动时间完全同步,无时间偏差
灵活选型提示
- 如果需要将计时起点对齐到「用户点击重跑按钮的触发时间」,而非「工作流排队后开始执行的时间」,可以将取数来源替换为
github.event.created_at字段,该字段记录重跑事件本身的生成时间,会比run_started_at早几秒到几十秒的排队等待时长,可根据实际统计需求选择。 - 始终不要使用
created_at作为重跑场景下的计时起点,该值为工作流运行实例的首次创建固定时间,跨重跑不会更新。
内容的提问来源于stack exchange,提问作者dimisjim
相关产品推荐
相关产品推荐

