【问题标题】:Jenkins: Creating Jenkins Nested/ListView Views programmaticallyJenkins:以编程方式创建 Jenkins 嵌套/ListView 视图
【发布时间】:2019-07-01 23:01:40
【问题描述】:

我正在尝试在给定的父视图下创建 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(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 类的情况下更改所有者。以上 sn-p 来自 jenkins.model.Jenkins 类。请注意,在创建 ViewGrouopMixIn 对象时,会传递代表 Jenkins 对象的“this”引用。这意味着无法以编程方式创建嵌套视图。它只能通过 UI 创建。除此之外,NestedView-Plugin 的 NestedView 类不支持将所有者传递给构造函数。看起来好像不能以这种方式创建视图。不知道有没有其他办法。

【问题讨论】:

    标签: jenkins jenkins-plugins


    【解决方案1】:

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

    你可以在 Groovy 的帮助下使用类似的东西:

    listView('myJobs') {
      jobs {
        name('job1')
        name('job2')
    ....
    ....
    
    }
    
    columns {
            status()
            weather()
    .....}
    

    【讨论】:

    • 您知道是否可以选择使用 jobdsl 创建现有视图的子视图?
    【解决方案2】:

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

    我们将它用于持续交付,效果非常好!你可以开始here

    【讨论】:

      【解决方案3】:

      调用new 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
                                        }
                                 }
                            } 
                      }
          }
        }
      } 
      

      【讨论】:

        【解决方案4】:

        要在嵌套视图中创建视图,您应该使用 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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-01
          • 2017-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-21
          • 2019-10-10
          相关资源
          最近更新 更多