10

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

myBuild.getCauses()

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

我正在使用 Build Pipeline 插件手动触发构建。

4

2 回答 2

6

这是使用的 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() 

见参考

  1. 请参阅 build-pipeline-plugin 如何在代码BuildPipelineView.java中添加原因
  2. 请参阅hudson.model.Cause API
于 2015-06-27T14:34:04.243 回答
5

似乎build.getCauses()没有得到所有原因,而只有第一个的原因causeActionbuild.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)可能返回NULLwherebuild.getCause(hudson.model.Cause$UpstreamCause)会成功,即使存在一个动作,getActions()其原因是Cause$UserIdCause,所以大概getCause也调用getAction()而不是getActions()

于 2018-10-15T12:14:57.030 回答