如何发现 Jenkins 构建的其他原因?

问题描述 投票:0回答:3

当尝试使用 groovy 查询构建时,我调用

myBuild.getCauses()

我可以在 Jenkins 界面(构建屏幕)中看到此构建有两个原因,一个 UserIdCause 和一个 UpstreamCause。然而,当我使用上面的 groovy 询问相同的构建时,我只得到一个原因,即 UserIdCause。必须有某种方法从构建中获取 UpstreamCause,否则它不会出现在用户界面中。

我正在使用构建管道插件手动触发构建。

jenkins groovy build-pipeline-plugin
3个回答
7
投票

这是使用的工作常规代码(我在詹金斯脚本控制台中尝试过)

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() 

参见参考资料

  1. 参见 build-pipeline-plugin 如何在代码中添加原因 BuildPipelineView.java
  2. 参见 hudson.model.Cause API

7
投票

看来

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()


0
投票

currentBuild
是一个 RunWrapper,它有
getUpstreamBuilds()
来获取用于上游构建的
RunWrapper
。因此,您可以迭代它们并调用
getBuildCauses()
来获取它们的原因。

请参阅此答案,了解查找触发构建的用户的示例。

我不完全确定这与

build.getCause(hudson.model.Cause$UpstreamCause)
相比如何,但我认为它只给出了父构建的原因,而不给出了祖父母构建的原因?

© www.soinside.com 2019 - 2024. All rights reserved.