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存储库中的这个答案.
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)
小智 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
我正在回复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)
我们都喜欢俏皮话,所以让我在这里分享一句:
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)
看起来像 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)
| 归档时间: |
|
| 查看次数: |
19220 次 |
| 最近记录: |