完成后获取 Jenkins 构建作业持续时间

Get Jenkins build job duration once finished

我正在为我的 CI/CD 使用 Jenkins 集成服务器。 我正在从事自由式项目。 我想使用 RESTFUL API (JSON).

获得构建持续时间(以秒为单位)

这是我尝试过的:

"duration=$(curl -g -u login:token--silent "$BUILD_URL/api/json?pretty=true&tree=duration" | jq -r '.duration')" 

即使我在 post 构建任务中执行此 shell 脚本,持续时间始终等于 0。

这可能对您不起作用有几个原因,但最可能的原因是当您进行 API 调用时构建尚未完成。

我在我们的实例上试过了,对于完成的作业它工作正常,对于 运行 作业它总是 returns 0。如果你的 post 构建任务作为作业,那么作业可能还没有完成执行,这就是为什么你总是得到 0.

只要构建是 运行ning,构建的 Api 调用就不会包含持续时间属性,因此您不能在构建期间使用该机制。
但是,使用 Freestyle jobs.

,你有一个很好的选择来实现你想要的

仍然使用 Api 方法的解决方案是创建一个单独的通用作业,用于使用结果更新数据库,该作业将接收项目名称和内部版本号作为参数,运行 用于接收持续时间的 curl 命令,更新您的数据库和 运行 您需要的任何其他逻辑。
现在可以使用具有相关构建环境参数的 Parameterized Trigger 插件 post 任务从任何自由式作业调用此作业。
这有一个额外的好处,即持续时间更新机制在单个作业中控制,如果需要更新,它们可以在单个位置进行,避免需要更新所有单独的作业。
假设您的作业名为 Update-Duration 并且它接收两个参数 ProjectBuild post 触发器可以如下所示:

就是这样,只需将此跳跳机添加到任何需要它的作业中,将来您可以在不更改调用作业的情况下更新逻辑。
小事,为了避免调用者作业尚未完成执行时可能导致的竞争条件,您可以增加数据库更新程序作业的等待时间,以便有足够的时间让调用者作业完成,因此持续时间将被填充。