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

时间:2015-11-07 21:22:09

标签: jenkins jenkins-pipeline jenkins-workflow

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

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

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

9 个答案:

答案 0 :(得分:21)

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

示例:

工作流程脚本:

println "CAUSE ${currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause).properties}"

结果输出:

Running: Print Message
CAUSE [userName:John Smith, userId:jsmith, class:class hudson.model.Cause$UserIdCause, shortDescription:Started by user John Smith]

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

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

答案 1 :(得分:10)

截至2018年初,看来该信息now available已关闭JENKINS-31576

/assets/data.json

答案 2 :(得分: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
}

答案 3 :(得分:2)

如果构建是由上游构建触发的,则必须遍历currentBuild层次结构。

例如:

println getCauser(currentBuild).userId

@NonCPS
def getCauser(def build) {
    while(build.previousBuild) {
        build = build.previousBuild
    }

    return build.rawBuild.getCause(hudson.model.Cause$UserIdCause)
}

这将返回原始用户原因的用户ID。

答案 4 :(得分:2)

如果构建是由用户,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"
}

注意:您必须在脚本部分

中运行

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

答案 5 :(得分:2)

我们都喜欢单线,所以我在这里分享一个:

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}"

您将看到:

[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

如果它是由cron启动的,那么您将看到:

[Pipeline] echo
[_class:hudson.triggers.TimerTrigger$TimerTriggerCause, shortDescription:Started by timer]
[Pipeline] echo
null

答案 6 :(得分:2)

自Jenkins 2.22(JENKINS-41272)起,您可以访问currentBuild.getBuildCauses()方法以获取一系列构建原因。例如:

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

steps {
  echo "Build caused by ${env.CAUSE}"
}

答案 7 :(得分:1)

我猜你在谈论Email Ext plugin中定义的宏。有ongoing work使该插件直接支持Workflow。我不确定这个特定宏的状态。

答案 8 :(得分:1)

$ BUILD_CAUSE env不适用于管道,甚至也不适用于多分支管道 currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) 如果由SCM更改或计时器触发构建,则会失败。 所以,我实现了以下解决方法..

    def manualTrigger = false
    node('master'){
       def causes = currentBuild.rawBuild.getCauses()
       for(cause in causes) {
          if(cause.properties.shortDescription =~ 'Started by user') {
             manualTrigger = true
             break
          }
      }
  }

我的工作流程的其余部分位于另一个节点

   node('nodefarm') {
       if(manualTrigger) {
         // do build stuff here
       } else {
         //build not triggered by user.
       }
   }