如何显示在Jenkins中运行构建所花费的时间?

时间:2016-10-13 13:24:56

标签: jenkins build jenkins-pipeline

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

在构建的开始和结束时,会向相关的Slack通道发送一条消息。

Jenkinsfile的相关部分如下:

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/ ")

除了上述信息之外,我还想包括构建运行到该消息所花费的时间,该消息通知了构建的结束。

这可以不添加任何外部插件吗?如果有一个包含这些信息的环境变量,它将是完美的,但我找不到这样的变量。

5 个答案:

答案 0 :(得分:5)

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

注意:如果您使用的是HipChat plugin,则可以在${BUILD_DURATION}命令中使用${DURATION}(以前的hipchatSend)变量(它由插件传播一些其他变量)。

示例:

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>.'
  }
}

以下是可以在作业配置中使用的更多info on Jenkins environment variables

答案 1 :(得分:2)

由于此 jenkins-pipeline 脚本位于 Groovy 中,因此您只需使用new Date()即可。 "Current time ${new Date()}"参数上的这个message必须有效:

slackSend (channel: '#slack-test', color: 'warning', message: "Current time ${new Date()}")

这将在您的频道中生成以下消息:

Current time: Thu Oct 13 17:25:12 CEST 2016

如果您想要特定的日期格式,可以使用format(String format)方法,例如"${new Date().format('dd/MM/yyyy')}"

slackSend (channel: '#slack-test', color: 'warning', message: "Current time ${new Date().format('dd/MM/yyyy')}")

这将产生以下消息:

Current time: 13/10/2016

<强>更新

由于您不想使用任何外部插件,因此可能会这样做(这有点棘手),您可以使用以下脚本将开始时间保存在文件中詹金斯流水线:

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}"

答案 2 :(得分:0)

您可以使用${currentBuild.durationString}将其格式化为易于理解的格式(n分钟n秒)。 但是,它的前缀为and counting,有点奇怪。

所以我关注了this ${currentBuild.durationString.replace(' and counting', '')}

答案 3 :(得分:0)

要从字符串中删除“计数”部分,您可以执行以下操作:

atexit()

答案 4 :(得分:-1)

@Evan的答案对我来说非常适合查找/显示Jenkins工作的建立时间。

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