尝试使用 groovy 查询构建时,我调用
myBuild.getCauses()
我可以在 Jenkins 的界面(构建屏幕)中看到此构建有两个原因,一个 UserIdCause 和一个 UpstreamCause。但是,当我使用上面的 groovy 询问相同的构建时,我只得到一个原因,即 UserIdCause。必须有某种从构建中获取 UpstreamCause 的方法,否则它不会出现在用户界面中。
我正在使用 Build Pipeline 插件手动触发构建。
尝试使用 groovy 查询构建时,我调用
myBuild.getCauses()
我可以在 Jenkins 的界面(构建屏幕)中看到此构建有两个原因,一个 UserIdCause 和一个 UpstreamCause。但是,当我使用上面的 groovy 询问相同的构建时,我只得到一个原因,即 UserIdCause。必须有某种从构建中获取 UpstreamCause 的方法,否则它不会出现在用户界面中。
我正在使用 Build Pipeline 插件手动触发构建。
这是使用的 groovy 代码(我在 jenkins 脚本控制台中尝试过)build.getAction
job = hudson.model.Hudson.instance.getItem("demo-job")
build = job.getLastBuild()
// get action first
def action = build.getAction(hudson.model.CauseAction.class)
// get the list of causes
for (cause in action.getCauses()) {
println cause.getShortDescription()
}
// another way to find specific UpsteamCause directly
cause = action.findCause(hudson.model.Cause.UpstreamCause.class)
println cause.getUpstreamRun()
见参考
似乎build.getCauses()
没有得到所有原因,而只有第一个的原因causeAction
,build.getActions(hudson.model.CauseAction.class)
可能是通过调用build.getAction(hudson.model.CauseAction.class)
可以通过以下方式找到具有自身原因的其他操作:
def actions = build.getActions(hudson.model.CauseAction.class)
所以我们需要回顾每一个动作的原因,所以def causes = build.causes()
我们有
def causes = build.getActions(hudson.model.CauseAction.class)
.collect{ it.getCauses() }.flatten()
在我的情况下,这将返回一个类似的列表:
[ 05b8ef62-d071-11e8-b9db-9fd4e0aedf12/job/MyView/1238[11ef1ed2-d071-11e8-8c81-b71616102fe9/job/MyJob/4250[hudson.model.Cause$UserIdCause@2ddf7e3e]],
hudson.model.Cause$UserIdCause@3337c79c ]
其中第一个成员代表构建管道插件upstreamCause
,第二个成员代表手动触发此构建的用户。
当然,我希望Build User Vars 插件使用最浅的 hudson.model.Cause$UserIdCause
,而不是来自任何上游原因!
同样,简单地遍历链是没有意义的,cause.upstreamCauses
因为每个上游可能有多个原因。
代替递归cause.upstreamCauses
,访问upstreamRun
的原因操作使用:
cause.upstreamRun.getActions(hudson.model.CauseAction.class).collect{ it.getCauses() }.flatten()
笔记:
build.getCause(hudson.model.Cause$UserIdCause)
可能返回NULL
wherebuild.getCause(hudson.model.Cause$UpstreamCause)
会成功,即使存在一个动作,getActions()
其原因是Cause$UserIdCause
,所以大概getCause
也调用getAction()
而不是getActions()