当尝试使用 groovy 查询构建时,我调用
myBuild.getCauses()
我可以在 Jenkins 界面(构建屏幕)中看到此构建有两个原因,一个 UserIdCause 和一个 UpstreamCause。然而,当我使用上面的 groovy 询问相同的构建时,我只得到一个原因,即 UserIdCause。必须有某种方法从构建中获取 UpstreamCause,否则它不会出现在用户界面中。
我正在使用构建管道插件手动触发构建。
这是使用的工作常规代码(我在詹金斯脚本控制台中尝试过)
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
,其中 build.getCause(hudson.model.Cause$UpstreamCause)
会成功,即使存在来自 getActions()
且其原因为 Cause$UserIdCause
的操作,因此大概 getCause
也会调用 getAction()
而不是 getActions()
currentBuild
是一个 RunWrapper,它有 getUpstreamBuilds()
来获取用于上游构建的 RunWrapper
。因此,您可以迭代它们并调用 getBuildCauses()
来获取它们的原因。
请参阅此答案,了解查找触发构建的用户的示例。
我不完全确定这与
build.getCause(hudson.model.Cause$UpstreamCause)
相比如何,但我认为它只给出了父构建的原因,而不给出了祖父母构建的原因?