如何在工作流程中获得$ CAUSE

soo*_*ncj 20 jenkins jenkins-workflow jenkins-pipeline

Jenkins有一个$ CAUSE变量可用于自由式构建作业.

如何在工作流程中访问此类似内容?

我的团队在现有ad-hoc构建的电子邮件输出中使用它.我们希望在基于工作流程的新工作中继续这样做.

izz*_*kil 22

看起来Workflow构建没有注入此变量.但是,您可以currentBuild.rawBuild使用hudson.model.Run.getCause()hudson.model.Run.getCauses()方法从对象中检索所需的信息.

例:

工作流脚本:

println "CAUSE ${currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause).properties}"
Run Code Online (Sandbox Code Playgroud)

这个输出的结果:

Running: Print Message
CAUSE [userName:John Smith, userId:jsmith, class:class hudson.model.Cause$UserIdCause, shortDescription:Started by user John Smith]
Run Code Online (Sandbox Code Playgroud)

其他原因子类型可以在javadoc中找到.

还有一个很好的get-build-cause示例,它基于jenkins Pipeline Examples存储库中的这个答案.

  • 不要**批准`getRawBuild`方法.它被列入黑名单是有原因的.在支持的功能之前,您可以定义一个(可信的)全局库,它以安全的方法包装功能. (4认同)
  • 这真的不应该被要求。提交问题:https://issues.jenkins-ci.org/browse/JENKINS-41272 (2认同)

Aar*_*sco 11

随着2018年初,它看起来像该信息现在可以JENKINS-31576被关闭:

def manualTrigger = true
currentBuild.upstreamBuilds?.each { b ->
  echo "Upstream build: ${b.getFullDisplayName()}"
  manualTrigger = false
}
Run Code Online (Sandbox Code Playgroud)

  • 他们只花了三年时间就解决了这个问题——这是一个重大的进步!:D (2认同)

小智 6

如果构建是由用户、SCM 或拉取请求触发的,要获取原因,您可以使用以下命令:

def SCMTriggerCause
def UserIdCause
def GitHubPRCause
def PRCause = currentBuild.rawBuild.getCause(org.jenkinsci.plugins.github.pullrequest.GitHubPRCause)
def SCMCause = currentBuild.rawBuild.getCause(hudson.triggers.SCMTrigger$SCMTriggerCause)
def UserCause = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause)

if (PRCause) {
    println PRCause.getShortDescription()
} else if (SCMCause) {
    println SCMCause.getShortDescription()
} else if (UserCause) {
    println UserCause.getShortDescription()
}else {
   println "unknown cause"
}
Run Code Online (Sandbox Code Playgroud)

注意:您必须在脚本部分运行

归功于此 github:https : //github.com/benwtr/jenkins_experiment/blob/master/Jenkinsfile


rei*_*ist 5

我正在回复Jazzschmidt的回答,因为我没有足够的代表... previousBuild做错了,因为它获得了相同类型的先前启动的作业,而不是启动当前作业的作业.如果这项工作是由某人首次推出的,那就是你会得到的.否则,响应将为NULL,这将导致尝试获取其userId的异常.

要获得"原始"原因,您必须使用UpstreamCause遍历原因.这就是我最终做的事情,尽管可能还有其他方法:

@NonCPS
def getCauser() {
  def build = currentBuild.rawBuild
  def upstreamCause
  while(upstreamCause = build.getCause(hudson.model.Cause$UpstreamCause)) {
    build = upstreamCause.upstreamRun
  }
  return build.getCause(hudson.model.Cause$UserIdCause).userId
}
Run Code Online (Sandbox Code Playgroud)


Eni*_*igo 5

我们都喜欢俏皮话,所以让我在这里分享一句:

env.STARTED_BY = currentBuild.getBuildCauses().iterator().next().userId ?: "SYSTEM"

为了打破它,在 2.22 管道插件发布之后,添加了一个很好的getBuildCauses方法来访问构建原因。

如果你像这样运行你的工作:

def causes = currentBuild.getBuildCauses()
causes.each {
    echo "$it"
}
echo "${causes.iterator().next().userId}"
Run Code Online (Sandbox Code Playgroud)

你会看见:

[Pipeline] echo
[_class:hudson.model.Cause$UserIdCause, shortDescription:Started by user User Name (user.name), userId:user.name, userName:User Name (user.name)]
[Pipeline] echo
user.name
Run Code Online (Sandbox Code Playgroud)

如果它是由 cron 启动的,那么你会看到:

[Pipeline] echo
[_class:hudson.triggers.TimerTrigger$TimerTriggerCause, shortDescription:Started by timer]
[Pipeline] echo
null
Run Code Online (Sandbox Code Playgroud)


Her*_*oCC 5

看起来像 Jenkins 2.22 ( JENKINS-41272 ),您可以访问该currentBuild.getBuildCauses()方法以获取构建原因数组。例如:

environment {
  CAUSE = "${currentBuild.getBuildCauses()[0].shortDescription}"
}

steps {
  echo "Build caused by ${env.CAUSE}"
}
Run Code Online (Sandbox Code Playgroud)