jenkins插件學習之BuildUserVars和BuildNameDescriptionSetter插件

jenkins插件學習之BuildUserVars和BuildNameDescriptionSetter插件執行順序

之前一直在使用 BuildUserVars 和 BuildNameDescriptionSetter 這2個插件, 
通過 BuildUserVars 能夠獲取到是哪個人觸發了構建.這個插件會設置個類似的環境變量 BUILD_USER. 
然後 通過 BuildNameDescriptionSetter 插件 把這個環境變量 BUILD_USER 設置到 構建的 name 上.
方便一眼看出來構建歷史中哪個構建是哪個人觸發的/或者哪個構建是定時器觸發的等等.

BuildNameDescriptionSetter 插件有個 " Set build name before build starts	" 和 " Set build name after build ends	" 選項
發現 只有在  " Set build name after build ends	" 的時候 才能獲取到 BUILD_USER 這個變量. 爲什麼這樣的???

通過研究發現 是 因爲 BuildUserVars 在 BuildNameDescriptionSetter 之後執行了.
執行順序 類似 下面這樣
①先 BuildNameDescriptionSetter的  " Set build name before build starts	"
②然後是 BuildUserVars 插件設置用戶相關的環境變量
③最後 BuildNameDescriptionSetter的  " Set build name after build ends	"

在job的配置界面 "Build Environment" 地方也可以看到 BuildNameDescriptionSetter 插件 在 BuildUserVars 插件上面的.
爲什麼這麼個排序呢?

通過搜索發現 插件 Extension 的排序是 有個 ordinal 值提供排序的. 值越大 越靠前. 默認這2個插件的這個值都是0.
都是0的話 就會按照 插件的 displayName 排序了.

修改的話 可以 把 BuildUserVars 插件的 ordinal 值 設置 大於0.  
第二種修改方法 就是 修改 displayName,讓排序 換一下位置.
    @Extension(ordinal = 1) //  ordinal 值 設置 大於0
    public static class DescriptorImpl extends BuildWrapperDescriptor {


        @Override
        public boolean isApplicable(AbstractProject<?, ?> item) {
            return true;
        }

        @Override
        public String getDisplayName() {
            return EXTENSION_DISPLAY_NAME;
        }
    }
	
    private static final String EXTENSION_DISPLAY_NAME = "Set jenkins user build variables";

	/**
     * Returns all the registered {@link BuildWrapper} descriptors.
     */
    // for compatibility we can't use BuildWrapperDescriptor
    public static DescriptorExtensionList<BuildWrapper,Descriptor<BuildWrapper>> all() {
        // use getDescriptorList and not getExtensionList to pick up legacy instances
        return Jenkins.getInstance().<BuildWrapper,Descriptor<BuildWrapper>>getDescriptorList(BuildWrapper.class);
    }

    public  DescriptorExtensionList<T,D> getDescriptorList(Class<T> type) { //type = BuildWrapper.class hudson.tasks.BuildWrapper
        return descriptorLists.computeIfAbsent(type, key -> DescriptorExtensionList.createDescriptorList(this, key));
        //descriptorLists 中有key對應的值直接就獲取到了. 如果沒用通過 DescriptorExtensionList.createDescriptorList(this, key) 新建了.

    }

descriptorLists 這個裏面初始了很多的DescriptorExtensionList, 而我們要找的是 {Class@10416} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@13112}  size = 2 這個對應的.
descriptorLists = {ConcurrentHashMap@13015}  size = 14
 {Class@10349} "class hudson.views.ListViewColumn" -> {DescriptorExtensionList@13102}  size = 8
 {Class@8034} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@13103}  size = 22
 {Class@10272} "class hudson.model.JobProperty" -> {DescriptorExtensionList@13104}  size = 3
 {Class@10289} "class hudson.scm.SCM" -> {DescriptorExtensionList@13105}  size = 1
 {Class@8453} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@13106}  size = 8
 {Class@10312} "class hudson.tasks.Publisher" -> {Publisher$DescriptorExtensionListImpl@13107}  size = 6
 {Class@10253} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@13108}  size = 7
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@13109}  size = 6
 {Class@10370} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@13110}  size = 1
 {Class@7731} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@13111}  size = 4
 {Class@10416} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@13112}  size = 2
 {Class@8443} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@13113}  size = 3
 {Class@10323} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@13114}  size = 1
 {Class@10317} "class hudson.tasks.Builder" -> {DescriptorExtensionList@13115}  size = 6

public static DescriptorExtensionList<T,D> createDescriptorList(Jenkins jenkins, Class<T> describableType) {
    if (describableType == (Class) Publisher.class) {
        return (DescriptorExtensionList) new Publisher.DescriptorExtensionListImpl(jenkins);
    }
    return new DescriptorExtensionList<>(jenkins, describableType);
}


@Deprecated  這個方法已經不用了. 傳入的參數是hudson 實例而已. 我們看到裏面也是強制的把 hudson 轉換爲 jenkins 實例了.public class Hudson extends Jenkins
public static DescriptorExtensionList<T,D> createDescriptorList(Hudson hudson, Class<T> describableType) {
    return (DescriptorExtensionList)createDescriptorList((Jenkins)hudson,describableType);
}

通過在 return descriptorLists.computeIfAbsent(type, key -> DescriptorExtensionList.createDescriptorList(this, key)); 加上斷點 調試發現 如下

懶加載啊!

首先重啓 debug. 也就是重啓了jenkins.
descriptorLists = {ConcurrentHashMap@10542}  size = 0  第1次 實例化這個 class hudson.node_monitors.NodeMonitor

descriptorLists = {ConcurrentHashMap@10541}  size = 1 第2次. 準備實例化這個 class jenkins.model.GlobalConfiguration
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@10741}  size = 6
到這個時候 jenkins 已經啓動起來了. 後續 點擊了job的話還會繼續實例化 下面的.

descriptorLists = {ConcurrentHashMap@10541}  size = 2   第3次 class hudson.model.PageDecorator
 {Class@8034} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11557}  size = 22
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@10741}  size = 6

descriptorLists = {ConcurrentHashMap@10541}  size = 3
 {Class@8034} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11557}  size = 22
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@10741}  size = 6
 {Class@8454} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11911}  size = 8

descriptorLists = {ConcurrentHashMap@10541}  size = 3  第4次 class jenkins.model.GlobalConfiguration
 {Class@8034} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11557}  size = 22
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@10741}  size = 6
 {Class@8454} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11911}  size = 8
到這時 是 點擊 job 後 又加載的幾個實例.

descriptorLists = {ConcurrentHashMap@10541}  size = 4    第5次 interface hudson.model.TopLevelItem
 {Class@8034} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11557}  size = 22
 {Class@8698} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@10741}  size = 6
 {Class@8440} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12854}  size = 3
 {Class@8454} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11911}  size = 8

懶加載啊!
descriptorLists = {ConcurrentHashMap@10542}  size = 5   第6次     class jenkins.model.BuildDiscarder
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個.class jenkins.model.BuildDiscarder!!!
descriptorLists = {ConcurrentHashMap@10542}  size = 6
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個.class hudson.model.ParameterDefinition!!! 參數階段
descriptorLists = {ConcurrentHashMap@10542}  size = 7
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個.class hudson.scm.SCM!!
descriptorLists = {ConcurrentHashMap@10542}  size = 8
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個.class jenkins.scm.SCMCheckoutStrategy!!!! 這個基本上就是 job 配置 頁面 從上到下 各個階段的配置了. 代碼檢出階段.
descriptorLists = {ConcurrentHashMap@10542}  size = 9
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個class hudson.triggers.Trigger!!!這個基本上就是 job 配置 頁面 從上到下 各個階段的配置了. 觸發階段了.
descriptorLists = {ConcurrentHashMap@10542}  size = 10
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@7733} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@12770}  size = 4
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22



又增加了一個class hudson.tasks.BuildWrapper, !!!! BuildWrapper 階段了.構建環境設置.那一塊了.
descriptorLists = {ConcurrentHashMap@10542}  size = 11
 {Class@10417} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@12804}  size = 2
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@7733} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@12770}  size = 4
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22

又增加了一個 class hudson.tasks.Builder  !!! 構建階段
descriptorLists = {ConcurrentHashMap@10542}  size = 12
 {Class@10417} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@12804}  size = 2
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10318} "class hudson.tasks.Builder" -> {DescriptorExtensionList@12845}  size = 6
 {Class@7733} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@12770}  size = 4
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1

又增加了一個class hudson.tasks.Publisher
descriptorLists = {ConcurrentHashMap@10542}  size = 13
 {Class@10417} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@12804}  size = 2
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10318} "class hudson.tasks.Builder" -> {DescriptorExtensionList@12845}  size = 6
 {Class@7733} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@12770}  size = 4
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22
 {Class@10313} "class hudson.tasks.Publisher" -> {Publisher$DescriptorExtensionListImpl@13032}  size = 6
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1



descriptorLists = {ConcurrentHashMap@10542}  size = 14
 {Class@10417} "class hudson.tasks.BuildWrapper" -> {DescriptorExtensionList@12804}  size = 2
 {Class@10324} "class jenkins.model.BuildDiscarder" -> {DescriptorExtensionList@12637}  size = 1
 {Class@10318} "class hudson.tasks.Builder" -> {DescriptorExtensionList@12845}  size = 6
 {Class@7733} "class hudson.triggers.Trigger" -> {DescriptorExtensionList@12770}  size = 4
 {Class@8035} "class jenkins.model.GlobalConfiguration" -> {DescriptorExtensionList@11528}  size = 22
 {Class@10313} "class hudson.tasks.Publisher" -> {Publisher$DescriptorExtensionListImpl@13032}  size = 6
 {Class@10273} "class hudson.model.JobProperty" -> {DescriptorExtensionList@12571}  size = 3
 {Class@8699} "class hudson.node_monitors.NodeMonitor" -> {DescriptorExtensionList@11527}  size = 6
 {Class@10371} "class jenkins.scm.SCMCheckoutStrategy" -> {DescriptorExtensionList@12722}  size = 1
 {Class@8455} "class hudson.model.PageDecorator" -> {DescriptorExtensionList@11546}  size = 8
 {Class@10251} "class hudson.model.ParameterDefinition" -> {DescriptorExtensionList@12672}  size = 7
 {Class@8441} "interface hudson.model.TopLevelItem" -> {DescriptorExtensionList@12401}  size = 3
 {Class@10350} "class hudson.views.ListViewColumn" -> {DescriptorExtensionList@13278}  size = 8
 {Class@10290} "class hudson.scm.SCM" -> {DescriptorExtensionList@12696}  size = 1

public abstract class Project<P extends Project<P,B>,B extends Build<P,B>>
    extends AbstractProject<P,B> implements SCMTriggerItem, Saveable, ProjectWithMaven, BuildableItemWithBuildWrappers {
    @Override
    protected void submit( StaplerRequest req, StaplerResponse rsp ) throws IOException, ServletException, FormException {
        super.submit(req,rsp);

        JSONObject json = req.getSubmittedForm();

        getBuildWrappersList().rebuild(req,json, BuildWrappers.getFor(this));
        getBuildersList().rebuildHetero(req,json, Builder.all(), "builder");
        getPublishersList().rebuildHetero(req, json, Publisher.all(), "publisher");
    }
在 Project 類中的 submit()方法中會調用到 BuildWrappers.getFor(this) 方法. submit()方法 方法就是點了job配置裏面的save按鈕觸發的.


public class BuildWrappers {
    /**
     * List up all {@link BuildWrapperDescriptor}s that are applicable for the given project.
     *
     * @return
     *      The signature doesn't use {@link BuildWrapperDescriptor} to maintain compatibility
     *      with {@link BuildWrapper} implementations before 1.150.
     */
    public static List<Descriptor<BuildWrapper>> getFor(AbstractProject<?, ?> project) {
        List<Descriptor<BuildWrapper>> result = new ArrayList<>();
        Descriptor pd = Jenkins.getInstance().getDescriptor((Class)project.getClass());

        for (Descriptor<BuildWrapper> w : BuildWrapper.all()) {
            if (pd instanceof AbstractProjectDescriptor && !((AbstractProjectDescriptor)pd).isApplicable(w))
                continue;
            if (w instanceof BuildWrapperDescriptor) {
                BuildWrapperDescriptor bwd = (BuildWrapperDescriptor) w;
                if(bwd.isApplicable(project))
                    result.add(bwd);
            } else {
                // old BuildWrapper that doesn't implement BuildWrapperDescriptor
                result.add(w);
            }
        }
        return result;
    }
}

通過 調用 BuildWrappers 中的 getFor()方法.
調用到 for (Descriptor<BuildWrapper> w : BuildWrapper.all()) { 時候會 執行到  public @Nonnull Iterator<T> iterator() { 裏面

    @Override
    public @Nonnull Iterator<T> iterator() {
        // we need to intercept mutation, so for now don't allow Iterator.remove
        return new AdaptedIterator<ExtensionComponent<T>,T>(Iterators.readOnly(ensureLoaded().iterator())) {
            protected T adapt(ExtensionComponent<T> item) {
                return item.getInstance();
            }
        };
    }
然後iterator() 方法裏面會調用ensureLoaded() 方法

    private List<ExtensionComponent<T>> ensureLoaded() {
        if(extensions!=null)
            return extensions; // already loaded
        if (jenkins.getInitLevel().compareTo(InitMilestone.PLUGINS_PREPARED)<0)
            return legacyInstances; // can't perform the auto discovery until all plugins are loaded, so just make the legacy instances visible

        synchronized (getLoadLock()) {
            if(extensions==null) {
                List<ExtensionComponent<T>> r = load();
                r.addAll(legacyInstances);
                extensions = sort(r);
            }
            return extensions;
        }
    }
最後 ensureLoaded() 裏面會對 List 進行 排序. 
    /**
     * If the {@link ExtensionList} implementation requires sorting extensions,
     * override this method to do so.
     *
     * <p>
     * The implementation should copy a list, do a sort, and return the new instance.
     */
    protected List<ExtensionComponent<T>> sort(List<ExtensionComponent<T>> r) {
        r = new ArrayList<>(r);
        Collections.sort(r);
        return r;
    }

排序的時候會調用到 ExtensionComponent 裏面的 compareTo(ExtensionComponent<T> that) 方法.


DescriptorExtensionList 中有存放的 ExtensionComponent 的一個集合. 然後 ExtensionComponent 中會有個 compareTo 比較順序的方法.
然後比較出來的順序就是 BuildWrapper 類型插件 的執行的先後順序.
如果設置了 ordinal 值. 值越大 越先執行的(也就是job設置界面裏面越靠上)沒有設置ordinal就比較 displayname. 按照字符串比較的.
如果比較displayname失敗會比較getClass().getName(),也是按照字符串比較。

this = {DescriptorExtensionList@12209}  size = 2
 0 = {BuildNameSetter$DescriptorImpl@12212}
 1 = {BuildUser$DescriptorImpl@12213}
    /**
     * Sort {@link ExtensionComponent}s in the descending order of {@link #ordinal()}.
     */
    public int compareTo(ExtensionComponent<T> that) {
        double a = this.ordinal();
        double b = that.ordinal();
        if (a>b)    return -1;
        if (a<b)    return 1;

        // make the order bit more deterministic among extensions of the same ordinal
        if (this.instance instanceof Descriptor && that.instance instanceof Descriptor) {
            try {
                return Util.fixNull(((Descriptor)this.instance).getDisplayName()).compareTo(Util.fixNull(((Descriptor)that.instance).getDisplayName()));
            } catch (RuntimeException | LinkageError x) {
                LOG.log(Level.WARNING, null, x);
            }
        }
        return this.instance.getClass().getName().compareTo(that.instance.getClass().getName());
    }


這裏我採用了修改build-user-vars-plugin插件的display的方法,本來就覺得他設置的displayname看着不爽。

    private static final String EXTENSION_DISPLAY_NAME = "Set jenkins user build variables";
    private static final String EXTENSION_DISPLAY_NAME = "Set Build  User Variables";

可以參考 https://github.com/mamh-java/build-user-vars-plugin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章