我正在尝试在给定的父视图下创建詹金斯视图(ListView)。我能够在顶层创建视图,但无法找到在给定父视图下创建视图的方法。我正在使用 groovy 来实现这一点。下面是用例: 1. 我正在使用嵌套视图插件来组织作业。2. 叶级视图是 Jenkins ListView,所有作业都放在叶级视图下。
为了使视图创建过程自动化,我需要能够在视图层次结构中的给定级别(或给定父视图下)创建视图。我能够创建视图,但它总是被创建为顶级视图。下面是我正在编写的脚本。使用此脚本,即使我传递父视图,它也会在顶层创建。
import jenkins.model.*
import hudson.model.ListView
import hudson.model.*
def name = 'Top_Level_View'
def viewObj = Jenkins.instance.getView(name)
def parentObj = viewObj.getOwner()
parentObj.getViews().each {
if( it.name == 'Top_Level_View'){
it.getViews().each{
if( it.name == "DevTools_View"){
it.getViews().each{
println "Views under DevTools_View: " + it.name
if(it.name == "1_Build_Triggers"){
println "Parent Name: " + it.getOwner().name
//Create a view under a given parent.
Jenkins.instance.addView(new ListView('Hello',it.getOwner()))
it.getOwner().getViews().each{
println "print view Name: " + it.name
}
}
}
}
}
}
}
这是进一步的分析。有两个主要的类参与视图创建过程:hudson.model.ViewGroupMixIn 和 jenkins.model.Jenkins。必须调用 Jenkins.addView(View view) 方法才能创建视图。该方法又调用 ViewGroupMixIn 类的 addView() 方法。
来自 Jenkins 类的 addView
public void addView(View v) throws IOException {
viewGroupMixIn.addView(v);
}
从 ViewGroupMixIn 添加视图
public void addView(View v) throws IOException {
v.owner = owner;
views().add(v);
owner.save();
}
请注意,视图的所有者会被 addView 方法覆盖。因此,即使我们传递视图的所有者,也会采用默认值。viewGroupMixIn 实例在 Jenkins 类中被声明为 final,这里是 viewGroupMixIn 的声明:
private transient final ViewGroupMixIn viewGroupMixIn = new ViewGroupMixIn(this) {
protected List<View> views() { return views; }
protected String primaryView() { return primaryView; }
protected void primaryView(String name) { primaryView=name; }
};
ViewGroupMixIn 的构造函数:
public abstract class ViewGroupMixIn {
private final ViewGroup owner;
/**
* Returns all the views. This list must be concurrently iterable.
*/
protected abstract List<View> views();
protected abstract String primaryView();
protected abstract void primaryView(String newName);
protected ViewGroupMixIn(ViewGroup owner) {
this.owner = owner;
}
如果不修改 Jenkins 类,我们就无法更改所有者。上面的片段来自 jenkins.model.Jenkins 类。请注意,在创建 ViewGrouopMixIn 对象时,会传递代表 Jenkins 对象的“this”引用。这意味着无法以编程方式创建嵌套视图。它只能通过 UI 创建。除此之外,NestedView-Plugin 的 NestedView 类不支持将所有者传递给构造函数。看起来好像不能以这种方式创建视图。不确定是否有其他方法可以做到这一点。