如何从Jenkins构建变量中获取构建时间戳?

48

我如何从Jenkins获取最新构建的构建时间戳? 我想在后续构建操作中将该值插入电子邮件主题中。

10个回答

40

构建时间戳插件将是获取构建过程中的时间戳的最佳方法。

按照以下简单步骤启用"BUILD_TIMESTAMP"变量。

步骤1:

Manage Jenkins > Plugin Manager > Available plugins (or Installed plugins)...
Search for "Build Timestamp".
Install with or without Restart.

第二步:

Manage Jenkins > Configure System.
Search for 'Build Timestamp' section, then Enable the CHECKBOX.
Select the TIMEZONE, TIME format you want to setup with..Save the Page.

使用方法:

When Configuring the Build with ANT or MAVEN, 
Please declare a Global variable as, 
E.G.  btime=${BUILD_TIMESTAMP}
(use this in your Properties box in ANT or MAVEN Build Section)

use 'btime' in your Code to any String Variables etc..

enter image description here

enter image description here


嗨,我正在使用BUILD_TIMESTAMP变量。但是我的作业在多个从机(节点)上运行。因此,不同的节点会得到不同的构建时间。有没有办法让所有运行在同一作业中的节点获得相同的时间?谢谢。 - Santosh Pillai
这太棒了。应该被接受的答案。 - fig

31
注意: 在Jenkins 1.597中发生了更改,请参见此处获取有关迁移的更多信息。

您可以通过导航到https://<your-jenkins>/env-vars.html来查看构建期间可用的所有全局环境变量。

https://<your-jenkins>/ 替换为您用于访问Jenkins网页的URL(例如,它可能是 http://localhost:8080/env-vars.html )。

其中一个环境变量是:

BUILD_ID
    The current build id, such as "2005-08-22_23-59-59" (YYYY-MM-DD_hh-mm-ss)
如果您使用Jenkins可编辑的电子邮件通知,您应该能够在电子邮件主题行中使用${ENV, var="BUILD_ID"}

谢谢Alex。我使用了$BUILD_ID和zentimestamp插件来改变格式。 - rkkreddy
24
从Jenkins v.1.597版本开始,这种技术已经无法使用。https://wiki.jenkins-ci.org/display/JENKINS/JENKINS-24380+Migration - user4580104
1
@OK。它现在与以前的版本不同,它现在包含构建编号。从env-vars.html中可以看到:“_BUILD_ID当前的构建ID与1.597+中创建的构建的BUILD_NUMBER相同,但对于旧的构建,则为YYYY-MM-DD_hh-mm-ss时间戳_”。 - FrontierPsycho
@FrontierPsycho:很有趣,你从哪里得到了这个env-vars.html输出?我的仍然显示YYYY-MM-DD_hh-mm-ss格式(在德语中,Jenkins版本为2.7)。关于env-vars及其文档似乎存在一些混淆... - OK.
@OK:如果jenkins-server.com是您的Jenkins服务器域名,您可以在http://jenkins-server.com/env-vars.html找到它。我的引用直接来自我的Jenkins服务器,版本为1.638。 - FrontierPsycho
1
@FrontierPsycho:感谢您的澄清。我能够访问该页面,但由于我的浏览器默认语言设置为德语,Jenkins向我提供了一个翻译过的页面。看起来env-vars.html页面的翻译已经过时了。如果我将浏览器默认语言设置为英语,我会得到与您相同的输出结果。 - OK.

15

一种方法是在全局环境部分使用shell脚本,这里,我使用UNIX时间戳,但您可以使用任何与shell脚本语法兼容的时间格式:

pipeline {

    agent any

    environment {
        def BUILDVERSION = sh(script: "echo `date +%s`", returnStdout: true).trim()
    }

    stages {
        stage("Awesome Stage") {
            steps {
                echo "Current build version :: $BUILDVERSION"
            }
        }
    }
}

6
尝试使用 Build Timestamp Plugin 并使用 BUILD_TIMESTAMP 变量。

5

从脚本(Unix脚本)生成环境变量:

echo "BUILD_DATE=$(date +%F-%T)"

2
我知道回答这个问题有点晚了,但我最近找到了一个更好的解决方案,而不需要安装任何插件。我们可以创建一个格式化的版本号,然后使用创建的变量来显示构建日期/时间。 创建步骤:构建环境 --> 创建格式化的版本号:
  • 环境变量名称:BUILD_DATE

  • 版本号格式化字符串:${BUILD_DATE_FORMATTED}

就是这样。只需在电子邮件主题行中使用上面创建的变量${ENV, var="BUILD_DATE"},您就可以获得当前构建的日期/时间。

8
需要使用“版本号”插件。 - John Phu Nguyen

2
您可以使用Jenkins对象直接获取开始时间。
Jenkins.getInstance().getItemByFullName(<your_job_name>).getBuildByNumber(<your_build_number>).getTime()

这里也回答了与it技术有关的问题: https://stackoverflow.com/a/63074829/1968948


1

BUILD_ID 用于提供此信息,但自 Jenkins 1.597 起,它已更改为提供构建编号。有关更多信息,请参见 this

您可以使用其他答案中指出的 Build Time Stamp 插件来实现此目的。

但是,如果您不允许或不愿意使用插件,请按照以下方法操作:

def BUILD_TIMESTAMP = null
withCredentials([usernamePassword(credentialsId: 'JenkinsCredentials', passwordVariable: 'JENKINS_PASSWORD', usernameVariable: 'JENKINS_USERNAME')]) {
   sh(script: "curl https://${JENKINS_USERNAME}:${JENKINS_PASSWORD}@<JENKINS_URL>/job/<JOB_NAME>/lastBuild/buildTimestamp", returnStdout: true).trim();
}
println BUILD_TIMESTAMP

这可能看起来有点过度,但能完成工作。
访问Jenkins的凭据应该被添加,并且id需要在withCredentials语句中传递,代替'JenkinsCredentials'。如果你的Jenkins不使用身份验证,可以随意省略此步骤。

0

0
如果您想在浏览器向Jenkins服务器发送每个请求时添加时间戳,可以参考Jenkins Crumb发行机制,并且可以修改/scripts/hudson-behavior.js文件。这样就可以将时间戳转换到服务器上了。
    /**
     * Puts a hidden input field to the form so that the form submission will have the crumb value
     */
    appendToForm : function(form) {
        // add here. ..... you code
        if(this.fieldName==null)    return; // noop
        var div = document.createElement("div");
        div.innerHTML = "<input type=hidden name='"+this.fieldName+"' value='"+this.value+"'>";
        form.appendChild(div);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接