41

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

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

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

4

16 回答 16

31

构建用户 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}')
于 2018-04-30T21:25:16.047 回答
25

这可以使用 Jenkins 来完成,Build User Vars Plugin它公开了一组环境变量,包括启动构建的用户。它提供了 BUILD_USER_ID、EMAIL 等环境变量。

当登录用户手动触发构建时,该用户的用户 ID 在BUILD_USER_ID环境变量中可用。

但是,当构建由 Jenkins 计时器/调度程序自动触发时,不会替换/初始化此环境变量。

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

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

于 2016-04-11T09:55:24.483 回答
19

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

方法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 和用户名

于 2020-02-27T19:39:37.993 回答
10

安装“构建用户变量插件”并使用如下:- [参见https://plugins.jenkins.io/build-user-vars-plugin ]

在此处输入图像描述

请务必选中您的 Jenkins 作业配置Set jenkins user build variables下的复选框。Build Environment

在此处输入图像描述

于 2018-05-14T14:44:10.293 回答
7

没有插件->

def cause = currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')
echo "userName: ${cause.userName}"
于 2020-08-22T18:57:13.910 回答
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
}

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

于 2019-08-20T15:33:31.603 回答
5

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

@NonCPS
def getBuildUser() {
    return currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()
}
于 2019-08-15T21:50:40.910 回答
3

来自email-ext 插件的令牌$BUILD_CAUSE就是您要寻找的。

单击?时,您可以看到完整的内容令牌参考。就在电子邮件内容配置中的附加构建日志组合框之后。

插件会添加一些令牌,但默认情况下应该可以使用这个令牌。

编辑:正如 bishop 在评论中指出的那样,当使用EnvInject 插件时, $BUILD_CAUSE 令牌会改变为不同的行为。

于 2016-03-25T03:19:50.680 回答
3

我正在使用“Execute Shell”和“Env Inject”插件的组合,如下所示:

  1. 创建一个“执行外壳”构建步骤,该步骤使用外壳参数替换来写入默认值并将该值回显到文件中。下面的屏幕截图中突出显示的示例。
  2. 使用“Env Inject”文件将该文件作为要设置的属性读取。

Jenkins 构建默认变量的步骤

于 2016-10-21T15:03:51.423 回答
2

我创建了一个返回触发的作业名称的函数:

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

于 2021-04-06T10:14:15.497 回答
2

我想将构建发起者信息触发到我的一个 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)'
        }
           }
}
于 2019-01-24T08:04:15.657 回答
2

如何返回用户名和用户 ID:

用户名:currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserName()

用户身份:currentBuild.rawBuild.getCause(Cause.UserIdCause).getUserId()

于 2022-02-07T08:57:15.723 回答
1

只是为了详细说明Musaffir Lp 的回答条件构建步骤插件现在直接支持构建原因- 它还需要运行条件插件

如果您想检测计时器何时开始构建,您可以选择Run? Build Cause的值,其中Build Cause为:TimerTrigger

在此处输入图像描述

这比使用正则表达式更简单、更健壮。您还可以检测到其他触发器,例如,当构建是源代码管理管理提交的结果时,您可以选择:SCMTrigger

于 2019-02-08T10:28:52.323 回答
1

下面这对我有用。

安装“用户构建 vars 插件”

Build Name  =   ${BUILD_NUMBER}_${TICKET}_${ENV,var="BUILD_USER_ID"}

在此处输入图像描述

于 2020-02-05T10:16:46.143 回答
1

我编写了一个 groovy 脚本来提取started by可以正确获取源的脚本,无论是用户、单片机还是计时器(可以添加更多)。它将递归地导航构建树以获取“原始”“开始于”原因https://github.com/Me-ion/jenkins_build_trigger_cause_extractor

于 2020-11-25T21:56:56.837 回答
-1

对于声明性管道语法,这是基于@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 频道

于 2019-10-13T11:09:15.310 回答