Jenkins:以编程方式创建Jenkins嵌套/ ListView视图

时间:2013-08-05 21:46:19

标签: jenkins jenkins-plugins

我正在尝试在给定的父视图下创建jenkins视图(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(视图视图)方法才能创建视图。此方法调用ViewGroupMixIn类的addView()方法。

来自Jenkins类的addView

public void addView(View v) throws IOException {
    viewGroupMixIn.addView(v);
}
从ViewGroupMixIn

addView
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对象时,&#34;这个&#34;传递了代表Jenkins对象的引用。这意味着无法以编程方式创建嵌套视图。它必须仅通过UI创建。除此之外,NestedView-Plugin的NestedView类不支持将所有者传递给构造函数。如果可以通过这种方式创建视图,那么看起来不像。不确定是否有其他方法可以这样做。

4 个答案:

答案 0 :(得分:0)

有一个很棒的job-dsl plugin可以自动完成作业和视图创建过程。 Checkout嵌套视图dsl。

的示例

我们将它用于持续交付,它运作良好!你可以开始here

答案 1 :(得分:0)

当您调用新的ListView时,您可以直接传递它,不要在其上调用getOwner

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))
                                  it.getOwner().getViews().each{
                                    println "print view Name: " + it.name
                                  }
                           }
                      } 
                }
    }
  }
} 

答案 2 :(得分:0)

我建议使用Job DSL插件,它非常容易组织和控制Job的内容。

你可以在Groovy的帮助下使用这样的东西:

listView('myJobs') {
  jobs {
    name('job1')
    name('job2')
....
....

}

columns {
        status()
        weather()
.....}

答案 3 :(得分:0)

要在嵌套视图中创建视图,您应该使用NestedView对象的方法而不是Jenkins.instance.addView。

def name = 'Top_Level_View'
def viewObj = Jenkins.instance.getView(name)
def parentObj = viewObj.getOwner()

def newListViewObj = new ListView('Hello', viewObj)   
viewObj.addView(newObj)