如何在Jenkins中获得构建持续时间?

如何在Jenkins中获得构建持续时间?,jenkins,build,jenkins-pipeline,Jenkins,Build,Jenkins Pipeline,我正在使用Jenkins管道配置Android应用程序构建过程 在构建的开始和结束时,会向松弛通道发送一条消息。Jenkins文件的相关部分如下所示: slackSend (channel: '#slack-test', color: 'warning', message: "Finished: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' State: ${STATE}. Artifacts can be viewed here: ${e

我正在使用Jenkins管道配置Android应用程序构建过程

在构建的开始和结束时,会向松弛通道发送一条消息。Jenkins文件的相关部分如下所示:

slackSend (channel: '#slack-test', color: 'warning', message: "Finished: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' State: ${STATE}.   Artifacts can be viewed here: ${env.BUILD_URL}artifact/Product/build/outputs/ ")
我还希望Slack通知包括构建运行所需的时间。是否可以在不添加任何外部插件的情况下执行此操作

如果有一个环境变量可以保存这些信息,那就太完美了,但我找不到这样的变量。

由于jenkins管道脚本在Groovy中,您只需在它上面使用
new Date()
。在
消息
参数上类似这样的
“当前时间${new Date()}”
必须起作用:

slackSend (channel: '#slack-test', color: 'warning', message: "Current time ${new Date()}")
这将在您的频道中产生以下消息:

Current time: Thu Oct 13 17:25:12 CEST 2016
如果需要特定的日期格式,可以使用
格式(字符串格式)
方法,例如
“${new date().format('dd/MM/yyyy')}”

相反,这将产生以下消息:

Current time: 13/10/2016
更新

由于您不想使用任何外部插件(这有点棘手),因此在jenkins管道中使用以下脚本将开始时间保存在文件中:

def f = new File("/tmp/buildStart.txt")
def start = new Date().format('dd/MM/yyyy HH:mm:ss')
f.text = start
slackSend color: 'red', message: "Build start at ${start}"
然后在构建完成的另一个jenkins管道中,解析文件中的日期并获得与当前时间的差异:

def f = new File("/tmp/buildStart.txt")
def startDate = new Date().parse('dd/MM/yyyy HH:mm:ss',f.text)
def endDate = new Date()
def tookTime = groovy.time.TimeCategory.minus(endDate,startDate).toString()
slackSend color: 'red', message: "Total time: ${tookTime}"

您可以使用
${currentBuild.durationString}
获取生成持续时间。我在声明性管道脚本中使用它

注意:如果您正在使用,
hipchatSend
命令中可以使用
${BUILD\u DURATION}
(以前的
${DURATION}
)变量(它由插件与其他一些变量一起传播)

例如:

post {
  success {
    hipchatSend color: 'GREEN', room: 'My room', failOnError: true, notify: false, 
      message: 'Build <a href=\'${BUILD_URL}\'>${JOB_DISPLAY_NAME} #${BUILD_NUMBER}</a> has been built. Took ${BUILD_DURATION}. See the <a href=\'${BUILD_URL}/console\'>output</a>.'
  }
}
post{
成功{
hipchatSend颜色:'绿色',房间:'我的房间',失败者错误:真,通知:假,
消息:“已生成生成。已花费${Build\u DURATION}。请参阅。”
}
}

这里还有一些可以在作业配置中使用的方法。

您可以使用
${currentBuild.durationString}
将其格式化为人类可读的格式(n分钟n秒)。 然而,它的前缀是
和counting
,这有点奇怪

所以我跟着
${currentBuild.durationString.replace('and counting','')}

要从字符串中删除'and counting'部分,可以执行以下操作:


“${currentBuild.durationString.minus('and counting')}”

以上@Evan的答案对我来说非常适合找出/显示Jenkins作业的构建时间持续时间


echo${currentBuild.durationString.replace('and counting','')}

我想显示运行生成而不是“当前时间”所花的时间,可能吗?@ItaiGanot ouch,对不起,我误解了您的要求。。。这是我第一次使用jenkins管道,但我认为这必须能够在一些上下文变量中保存开始时间,然后从结束时间中减去。我会给你一种方法。我相信詹金斯可能提供了一种更优雅的方法,但我自己找不到。@ItaiGanot-如果你可以列出所有构建时间,可以使用“${env.build\u URL}/job/BranchBuild/buildTimeTrend”我得到了以下错误:
groovy.lang.MissingPropertyException:没有这样的属性:类的持续时间:groovy.lang.Binding
${DURATION}
是在哪里定义的?@eighty恐怕是特定于。我在其他类型的任务中使用了
${currentBuild.durationString}
。我想我应该在我的答案中反映这一点。如果您需要使用${currentBuild.duration},将在毫秒内返回。
post {
  success {
    hipchatSend color: 'GREEN', room: 'My room', failOnError: true, notify: false, 
      message: 'Build <a href=\'${BUILD_URL}\'>${JOB_DISPLAY_NAME} #${BUILD_NUMBER}</a> has been built. Took ${BUILD_DURATION}. See the <a href=\'${BUILD_URL}/console\'>output</a>.'
  }
}