我想在发布职位电子邮件中显示触发Jenkins工作的用户。这可以通过使用插件 Build User Vars Plugin 和env变量BUILD_USER
来实现。
但是,当调度程序触发作业时,此变量不会被初始化。
我们怎样才能做到这一点?我知道我们有一个名为EnvInject插件的插件,可以使用......
但我只是想知道如何使用它并实现解决方案......
答案 0 :(得分:8)
构建用户变量插件对我来说不起作用所以我做了一个快速而肮脏的黑客攻击:
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}')
答案 1 :(得分:4)
无插件->
def cause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')
echo "userName: ${cause.userName}"
答案 2 :(得分:3)
我正在使用'执行Shell'和' Env Inject'插件如下:
答案 3 :(得分:3)
简单的解决方案(无插件)!
方法1:通过外壳
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和用户名
答案 4 :(得分:2)
email-ext plugin中的令牌 $ BUILD_CAUSE 正是您要找的。
在电子邮件内容配置中附加构建日志组合框之后单击?时,您可以看到完整内容令牌引用。
某些令牌会被插件添加,但默认情况下这个令牌应该是可用的。
编辑:正如评论中主教所指出的那样,当使用EnvInject plugin时,$ BUILD_CAUSE标记会改变为不同的行为。
答案 5 :(得分:2)
安装'Build User Vars Plugin'并使用如下所示: - [见https://plugins.jenkins.io/build-user-vars-plugin]
请务必选中Set jenkins user build variables
下的Build Environment
复选框,以获取Jenkins作业的配置。
答案 6 :(得分:2)
我发现了类似但确实在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
}
您可以在此构造中使用here中所述的任何类。 它们将是具有可用值的返回映射。
答案 7 :(得分:1)
我想将构建启动器信息触发到我的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)'
}
}
}
答案 8 :(得分:1)
这将获得在Jenkins管道作业中单击“立即构建”的用户名。
@NonCPS
def getBuildUser() {
return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}
答案 9 :(得分:1)
我创建了一个返回触发作业名称的函数:
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
答案 10 :(得分:0)
只需详细说明Musaffir Lp's answer。 Conditional Build Step plugin现在直接支持生成原因-它也需要Run Condition Plugin。
如果您想检测计时器何时开始构建,可以选择 Build Cause 的 Run?值,并选择 Build Cause > of: TimerTrigger
这比使用正则表达式更简单,更强大。您还可以检测其他触发器,例如,当构建是源代码管理管理提交的结果时,可以选择: SCMTrigger 。
答案 11 :(得分:0)
对于声明性管道语法,这是基于@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简短说明的松弛通知发送到您的松弛通道
答案 12 :(得分:0)
答案 13 :(得分:0)
我编写了一个时髦的脚本来提取None
,无论用户,scm还是计时器(可以添加更多内容),它都可以正确获取源代码。它将以递归方式浏览构建树,以获取“原始”“由……开始”的原因https://github.com/Me-ion/jenkins_build_trigger_cause_extractor