Jenkins: Создание вложенных представлений Jenkins/ListView

Я пытаюсь создать представления jenkins (ListView) в рамках данного родительского представления. Я могу создать представление на верхнем уровне, но не могу найти способ создать представление для данного родительского представления. Я использую groovy для достижения этой цели. Ниже приведен пример использования: 1. Я использую плагин Nested View для организации заданий. 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) должен быть вызван для создания представления. Этот метод inturn вызывает метод addView() класса ViewGroupMixIn.

addView из класса Дженкинс

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

addView от ViewGroupMixIn

public void addView(View v) throws IOException {
   v.owner = owner;
   views().add(v);
   owner.save();
}

Обратите внимание, что владелец представления переопределяется методом addView. Таким образом, даже если мы передадим владельцу представления, будет принято значение по умолчанию. Экземпляр viewGroupMixIn объявлен как final в классе Jenkins, вот объявление для 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.model.jenkins. Обратите внимание, что при создании объекта ViewGrouopMixIn передается ссылка "this", представляющая объект Jenkins. Это означает, что нет способа создать вложенные представления программным способом. Он должен быть создан только через пользовательский интерфейс. Кроме этого, класс NestedView в NestedView-Plugin не поддерживает передачу владельца в конструктор. Не похоже, если представления могут быть созданы таким образом. Не уверен, есть ли другой способ сделать это.

Ответ 1

Существует отличный плагин job-dsl для автоматизации процесса создания задания и создания. Checkout пример вложенного представления dsl.

Мы использовали его для непрерывной доставки, и он работает очень хорошо! Вы можете начать здесь.

Ответ 2

Когда вы вызываете новый 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
                                  }
                           }
                      } 
                }
    }
  }
} 

Ответ 3

Я бы предложил использовать Job DSL Плагин, который очень легко организовать и контролировать вещи в Job.

Вы можете использовать что-то вроде этого с помощью Groovy:

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

}

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

Ответ 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)