Jenkins任务自定义指标:如何获取Build任务各步骤与后置动作运行时长?
没问题,我来帮你搞定这两个需求——获取「Build」任务里每个Execute Shell和Post Build Action的运行时间,以及配置自定义指标。针对自由风格的Jenkins任务,具体方案如下:
一、获取各步骤的运行时间
1. 用插件自动拆分耗时(最省心)
推荐安装Build Duration Breakdown Plugin,它专门针对自由风格项目,能自动统计每个构建步骤(包括所有Execute Shell、Post Build Action)的具体运行时间,不需要手动修改脚本。安装完成后,构建结束页面会多出一个「Duration Breakdown」标签,里面清晰列出每个步骤的起止时间和耗时,直观又方便。
如果需要更精细的时间戳日志,搭配Timestamper Plugin使用——它会给日志的每一行加上精确到毫秒的时间戳,你可以直接在构建日志里定位每个Shell步骤或Post动作的开始/结束节点,手动计算或用日志工具提取耗时。
2. 手动给Execute Shell加时间统计脚本
要是不想依赖插件,也可以给每个Execute Shell步骤手动嵌入时间统计代码:
# 记录步骤开始时间(纳秒级) start_time=$(date +%s%N) # 这里写你的原有构建命令 echo "执行编译/打包任务..." # 计算并输出耗时(转换为毫秒) end_time=$(date +%s%N) duration=$(( (end_time - start_time) / 1000000 )) echo "当前Shell步骤耗时:${duration}ms"
这样每个Shell步骤的耗时会直接打印到构建日志里,随时可以查看。
3. 追踪Post Build Action的运行时间
对于系统自带的Post动作(比如发送邮件、归档产物),它们的运行时间会被Jenkins日志记录,结合Timestamper的时间戳就能轻松提取。如果是自定义的Post任务,建议先安装Post build task Plugin,给Post动作也加上类似的时间统计脚本,就能精准拿到耗时数据。
二、配置自定义指标
1. 用Metrics Plugin快速自定义
安装Metrics Plugin后,在任务配置页的「Metrics」板块可以直接添加自定义指标:
- 比如添加
gauge类型指标,记录每次构建中某个Shell步骤的耗时; - 或者添加
counter类型指标,统计构建成功/失败的累计次数。
你可以在Execute Shell步骤里通过脚本更新这些指标,比如调用插件提供的命令行工具,或者用Groovy脚本操作Metrics API(需要开启Jenkins脚本控制台权限)。
2. 结合Prometheus Plugin暴露监控指标
如果需要把指标同步到Prometheus这类监控系统,安装Prometheus Plugin:
- 插件会自动暴露Jenkins基础指标,同时支持读取自定义指标文件;
- 在Execute Shell或Post Build Action中,用脚本将自定义指标写入到指定文件(比如
$WORKSPACE/custom_metrics.txt),示例代码如下:
echo "# HELP build_shell_step1_duration_ms 第一个Shell步骤的耗时" > $WORKSPACE/custom_metrics.txt echo "# TYPE build_shell_step1_duration_ms gauge" >> $WORKSPACE/custom_metrics.txt echo "build_shell_step1_duration_ms $duration" >> $WORKSPACE/custom_metrics.txt
然后在插件配置里指定这个文件的路径,插件就会把这些自定义指标加入到Prometheus的暴露端点中。
3. 用Groovy脚本自定义进阶指标(适合技术栈较深的场景)
在Post Build Action中添加「Execute system Groovy script」步骤,通过Jenkins API记录自定义指标,比如将步骤耗时作为构建参数保存:
def build = Thread.currentThread().executable def stepDuration = 1234 // 替换为实际获取的步骤耗时(比如从日志提取或脚本计算) build.addAction(new hudson.model.ParametersAction( new hudson.model.StringParameterValue("shell_step1_duration", stepDuration.toString()) ))
这样每次构建的自定义指标会被持久化保存,方便后续查询、统计或对接其他系统。
内容的提问来源于stack exchange,提问作者Prasanth P

