我想在发布工作电子邮件中显示触发 Jenkins 工作的用户。这可以通过使用插件Build User Vars Plugin和 env 变量来实现BUILD_USER
。但是当作业被调度程序触发时,这个变量不会被初始化。
我们怎样才能做到这一点?我知道我们有一个名为 EnvInject Plugin 的插件,可以使用它...
但我只想知道我们如何使用它并实现解决方案......
我想在发布工作电子邮件中显示触发 Jenkins 工作的用户。这可以通过使用插件Build User Vars Plugin和 env 变量来实现BUILD_USER
。但是当作业被调度程序触发时,这个变量不会被初始化。
我们怎样才能做到这一点?我知道我们有一个名为 EnvInject Plugin 的插件,可以使用它...
但我只想知道我们如何使用它并实现解决方案......
构建用户 vars 插件对我不起作用,所以我做了一个快速而肮脏的 hack:
BUILD_CAUSE_JSON=$(curl --silent ${BUILD_URL}/api/json | tr "{}" "\n" | grep "Started by")
BUILD_USER_ID=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userId" | awk -F\" '{print $4}')
BUILD_USER_NAME=$(echo $BUILD_CAUSE_JSON | tr "," "\n" | grep "userName" | awk -F\" '{print $4}')
这可以使用 Jenkins 来完成,Build User Vars Plugin
它公开了一组环境变量,包括启动构建的用户。它提供了 BUILD_USER_ID、EMAIL 等环境变量。
当登录用户手动触发构建时,该用户的用户 ID 在BUILD_USER_ID
环境变量中可用。
但是,当构建由 Jenkins 计时器/调度程序自动触发时,不会替换/初始化此环境变量。
这可以通过使用条件构建步骤插件/运行条件插件向作业注入条件来解决,在每个作业中,我们可以添加一个条件来初始化变量 BUILD_USER_ID 仅当构建由计时器或调度程序引起或触发时, 通过使用正则表达式设置条件..
简单的解决方案(无插件)!
方法1:通过Shell
BUILD_TRIGGER_BY=$(curl -k --silent ${BUILD_URL}/api/xml | tr '<' '\n' | egrep '^userId>|^userName>' | sed 's/.*>//g' | sed -e '1s/$/ \//g' | tr '\n' ' ')
echo "BUILD_TRIGGER_BY: ${BUILD_TRIGGER_BY}"
方法 2:通过 Groovy
node('master') {
BUILD_TRIGGER_BY = sh ( script: "BUILD_BY=\$(curl -k --silent ${BUILD_URL}/api/xml | tr '<' '\n' | egrep '^userId>|^userName>' | sed 's/.*>//g' | sed -e '1s/\$/ \\/ /g'); if [[ -z \${BUILD_BY} ]]; then BUILD_BY=\$(curl -k --silent ${BUILD_URL}/api/xml | tr '<' '\n' | grep '^shortDescription>' | sed 's/.*user //g;s/.*by //g'); fi; echo \${BUILD_BY}", returnStdout: true ).trim()
echo "BUILD_TRIGGER_BY: ${BUILD_TRIGGER_BY}"
}
方法 3:通过 Groovy
BUILD_TRIGGER_BY = "${currentBuild.getBuildCauses()[0].shortDescription} / ${currentBuild.getBuildCauses()[0].userId}"
echo "BUILD_TRIGGER_BY: ${BUILD_TRIGGER_BY}"
输出:
Started by user Admin / user@example.com
注意:输出将是用户 ID 和用户名
安装“构建用户变量插件”并使用如下:- [参见https://plugins.jenkins.io/build-user-vars-plugin ]
请务必选中您的 Jenkins 作业配置Set jenkins user build variables
下的复选框。Build Environment
没有插件->
def cause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')
echo "userName: ${cause.userName}"
我发现类似但确实在 Jenkins 2.1.x 上工作,并且易于理解。它无需任何插件即可工作。
if (currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')['userId']){
// Will be run only if someone user triggers build
// Because in other cases this contructions returns null
}
您可以在此构造中使用此处描述的任何类。它们将返回具有可用值的映射。
这将获取在 Jenkins 管道作业中单击“立即构建”的用户名。
@NonCPS
def getBuildUser() {
return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}
来自email-ext 插件的令牌$BUILD_CAUSE就是您要寻找的。
单击?时,您可以看到完整的内容令牌参考。就在电子邮件内容配置中的附加构建日志组合框之后。
插件会添加一些令牌,但默认情况下应该可以使用这个令牌。
编辑:正如 bishop 在评论中指出的那样,当使用EnvInject 插件时, $BUILD_CAUSE 令牌会改变为不同的行为。
我创建了一个返回触发的作业名称的函数:
String getTriggeredJob(CURRENT_BUILD) {
if (CURRENT_BUILD.upstreamBuilds.size() > 0) {
TRIGGERED_JOB = CURRENT_BUILD.upstreamBuilds[0].projectName
if (!TRIGGERED_JOB.isEmpty()) {
return TRIGGERED_JOB
}
}
return "Self"
}
CURRENT_BUILD
是环境变量currentBuild
我想将构建发起者信息触发到我的一个 slack/flock 组,因此我使用以下方式通过以声明方式编写来获取构建发起者电子邮件和名称。
我只是在这里打印,您可以根据自己的方便使用存储在某个环境变量中或写入一个文件给出文件路径..
pipeline {
environment {
BRANCH_NAME = "${env.BRANCH_NAME}"
}
agent any
stages{
stage('Build-Initiator-Info'){
sh 'echo $(git show -s --pretty=%ae)'
sh 'echo $(git show -s --pretty=%an)'
}
}
}
如何返回用户名和用户 ID:
用户名:currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserName()
用户身份:currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
只是为了详细说明Musaffir Lp 的回答。条件构建步骤插件现在直接支持构建原因- 它还需要运行条件插件。
如果您想检测计时器何时开始构建,您可以选择Run? Build Cause的值,其中Build Cause为:TimerTrigger
这比使用正则表达式更简单、更健壮。您还可以检测到其他触发器,例如,当构建是源代码管理管理提交的结果时,您可以选择:SCMTrigger。
我编写了一个 groovy 脚本来提取started by
可以正确获取源的脚本,无论是用户、单片机还是计时器(可以添加更多)。它将递归地导航构建树以获取“原始”“开始于”原因https://github.com/Me-ion/jenkins_build_trigger_cause_extractor
对于声明性管道语法,这是基于@Kevin 回答的快速破解。对于声明性管道,您需要将它们包含在一个节点中,否则您将收到错误/构建失败
node {
def BUILD_FULL = sh (
script: 'curl --silent '+buildURL+' | tr "{}" "\\n" | grep -Po \'"shortDescription":.*?[^\\\\]"\' | cut -d ":" -f2',
returnStdout: true
)
slackSend channel: '#ci-cd',
color: '#000000',
message: "The pipeline was ${BUILD_FULL} ${GIT_COMMIT_MSG} "
}
输出将是带有 git 简短描述的 slack 通知发送到您的 slack 频道