当计时器触发作业时,如何在Jenkins中获取BUILD_USER?

Mus*_* Lp 20 jenkins jenkins-plugins jenkins-pipeline

我想在发布职位电子邮件中显示触发Jenkins工作的用户.这可以通过使用插件Build User Vars Plugin和env变量来实现BUILD_USER.但是,当调度程序触发作业时,此变量不会被初始化.

我们怎样才能做到这一点?我知道我们有一个名为EnvInject插件的插件,可以使用...

但我只是想知道我们如何使用它并实现解决方案......

Mus*_* Lp 15

这在Jenkins中非常有可能Jenkins有一个名为-Build User Vars Plugin的插件,它公开了一组描述启动构建的用户的环境变量.它给出了env变量,如BUILD_USER_ID,EMAIL等.

当登录用户手动触发构建并为BUILD_USER_ID提供登录的用户名时,这将很有效

当Jenkins定时器/调度程序自动触发构建时,这个env变量怎么不会被替换/初始化

附上截图了解详情在此输入图像描述

这可以通过使用条件构建步骤插件/运行条件插件向作业注入一个条件来解决,其中我们可以添加一个条件来初始化变量BUILD_USER_ID只有当构建是由Timer或调度程序引起或触发时,通过使用正则表达式设置条件..


Kev*_*cke 14

构建用户vars插件对我不起作用,因此我进行了快速而又简单的修改:

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}')
Run Code Online (Sandbox Code Playgroud)

  • 如果您不能使用任何插件(例如“ inject env”或“ Build User Vars插件”),则实际上这是最佳答案。 (3认同)
  • 我实际上会认为这是更好的方法,因为在我作为Jenkins运算符的经验中,插件是*最大的复杂因素,从而使Jenkins保持最新。 (3认同)
  • 即使我在脚本部分执行此操作,这对我不起作用 (2认同)
  • 我需要 groovy 中的变量,因此基于此我想出了以下 hack: `BUILD_CAUSE_JSON = sh ( script: "curl --silent ${BUILD_URL}/api/json | tr '{}' '\n' | grep '启动者'", returnStdout: true ).trim() echo "BUILD_CAUSE_JSON: ${BUILD_CAUSE_JSON}" BUILD_USER_ID=new groovy.json.JsonSlurper().parseText("{${BUILD_CAUSE_JSON}}").userId echo "BUILD_USER_ID : ${BUILD_USER_ID}"` (2认同)

M.S*_*run 14

简单的解决方案(无插件)!

方法一:通过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}"
Run Code Online (Sandbox Code Playgroud)

方法 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}"
}
Run Code Online (Sandbox Code Playgroud)

方法 3:通过 Groovy

BUILD_TRIGGER_BY = "${currentBuild.getBuildCauses()[0].shortDescription} / ${currentBuild.getBuildCauses()[0].userId}"
echo "BUILD_TRIGGER_BY: ${BUILD_TRIGGER_BY}"
Run Code Online (Sandbox Code Playgroud)

输出:

Started by user Admin / user@example.com
Run Code Online (Sandbox Code Playgroud)

注意:输出将是用户 ID 和用户名

  • 谢谢,方法3非常适合我! (7认同)

小智 7

无插件 ->

def cause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')
echo "userName: ${cause.userName}"
Run Code Online (Sandbox Code Playgroud)


小智 6

我发现类似但确实在 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
}
Run Code Online (Sandbox Code Playgroud)

您可以在此构造中使用此处描述的任何类。它们将返回具有可用值的映射。

  • 仅供任何可能尝试此操作的人参考 - 在较新的版本中, `getBuildCauses()` 实际上是一个数组,因此您可能需要执行 `currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')[0]['userId ']` 代替。答案+1!:) (3认同)

Par*_*wal 5

安装“ Build User Vars插件”并按以下方式使用:-[请参阅https://plugins.jenkins.io/build-user-vars-plugin ]

在此处输入图片说明

确保Set jenkins user build variables选中Build Environment您的Jenkins作业的配置下面的复选框。

在此处输入图片说明


小智 5

这将获取在 Jenkins 管道作业中单击“立即构建”的用户名。

@NonCPS
def getBuildUser() {
    return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}
Run Code Online (Sandbox Code Playgroud)

  • 两个注意事项: 1. 需要管理员权限才能允许该调用。2. 我在最后一个点之前添加了一个“?”,以便得到“null”而不是异常。 (4认同)