2017-05-25 42 views
1

我寫過大部分項目的工作/管道在DSL沒有任何以前的常規體驗,但現在我卡在更高級的問題,我無法弄清楚。Jenkins DSL通用多重促銷

我試圖實施一種方法,將1,2,n促銷活動添加到工作。 下面你可以看到一個可以添加一個促銷的完整工作方法,我期望它能夠以這樣的方式工作,如果我需要另一個促銷,我只需調用該方法兩次,但是然後我遇到了我的問題 - 只有提升被創建的最新版本將生成。

/** 
    * @param job   DSL job object 
    * @param promotionName Name of the promotion 
    * @param nextJobs  Comma seperated string of jobs to trigger when promotion is executed 
    * @param deployers  Comma seperated string IDs that can execute promotion 
    * @param params  Array of parameters to pass to the next job [0] = key, [1] = value. 
*/ 
static void addPromotion(def job, String promotionName, String nextJobs, String deployers, String[][] params){ 
     job.properties { 
      promotions { 
       promotion { 
        name(promotionName) 
        icon("star-gold") 
        conditions { 
         manual(deployers) 
        } 
        actions { 
         downstreamParameterized { 
          trigger(nextJobs) { 
           parameters { 
            for (String[] param : params){ 
             predefinedProp(param[0]+"=",param[1]) 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

它的工作,但是,如果我說這樣的另一個「促銷」關閉,然而,這個例子將產生幾乎相同(名稱和名稱-1)促銷方式:

static void addPromotion(def job, String promotionName, String nextJobs, String deployers, String[][] params){ 
     job.properties { 
      promotions { 
       promotion { 
        name(promotionName) 
        icon("star-gold") 
        conditions { 
         manual(deployers) 
        } 
        actions { 
         downstreamParameterized { 
          trigger(nextJobs) { 
           parameters { 
            for (String[] param : params){ 
             predefinedProp(param[0]+"=",param[1]) 
            } 
           } 
          } 
         } 
        } 
       } 
       promotion { 
        name("${promotionName}-1") 
        icon("star-gold") 
        conditions { 
         manual(deployers) 
        } 
        actions { 
         downstreamParameterized { 
          trigger(nextJobs) { 
           parameters { 
            for (String[] param : params){ 
             predefinedProp(param[0]+"=",param[1]) 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

是否有可能以某種方式重新使用閉包,並從不同的方法填充變量?還是其他想法?

+0

是的,有可能,Groovy的做法是將您的促銷活動添加到列表中,並在該列表中迭代調用必要的工作 - dsl,您需要運行。我會在週末提供完整的答案。 –

+0

我設法想出了一個與您所說的類似的解決方案,但我使用的是對象。但是,請隨時提供Groovy的審美和學習方法。 – matijasx

+0

去過一個瘋狂的一週! Apols尚未回答。 –

回答

1

這就是我解決它的方法。

一般性宣傳對象部分:

/** 
* Adds 'promoted-builds' plugin configuration to job 
**/ 
class Promotions { 


    public def job 
    public String promotionName 
    public String nextJobs 
    public String deployers 
    public String [][] params 

    /** 
    * @param job   DSL job object 
    * @param promotionName Name of the promotion 
    * @param nextJobs  Comma seperated string of jobs to trigger when promotion is executed 
    * @param deployers  Comma seperated string IDs that can execute promotion 
    * @param params  Array of parameters to pass to the next job [0] = key, [1] = value. 
    */ 

    public Promotions(Object jobName, String promotionName, String nextJobs, String deployers, String[][] params){ 
     this.job = jobName 
     this.promotionName = promotionName 
     this.nextJobs = nextJobs 
     this.deployers = deployers 
     this.params = params 
    } 

    static void addPromotions(Promotions ... jobPromotions){ 
     // Assuming the same job is provided as arguments 
     jobPromotions[0].job.properties { 
      promotions { 
       for (Promotions jobPromotion : jobPromotions){ 
        promotion { 
         name(jobPromotion.promotionName) 
         // star-gold, star-silver 
         icon("star-gold") 
         conditions { 
          manual(jobPromotion.deployers) 
         } 
         actions { 
          downstreamParameterized { 
           trigger(jobPromotion.nextJobs) { 
            parameters { 
             for (String[] param : jobPromotion.params){ 
              predefinedProp(param[0],param[1]) 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

然後,我準備我的PARAMS,並通過他們促進構造,並且在最後,我呼籲addPromotions()和我的所有構造的對象傳遞給它:

def nextJobs = "${Configuration.repoName}-${branchName}-deploy-to-perf"   
    def deployers = "developer" 
    def params  = [["VERSION", "\${VERSION}"], 
        ["SOURCE_GIT_COMMIT", "\${SOURCE_GIT_COMMIT}"]] as String[][] 
    def promo1 = new Promotions(job, "Promote to PERF", nextJobs, deployers, params) 


    def nextJobs2 = "../master/${Configuration.repoName}-${branchName}-to-prod-dtr"   
    def deployers2 = "admin" 
    def params2  = [["VERSION", "\${VERSION}"], 
         ["SOURCE_GIT_COMMIT", "\${SOURCE_GIT_COMMIT}"]] as String[][] 
    def promo2 = new Promotions(job, "Promote to PROD", nextJobs2, deployers2, params2) 

    Promotions.addPromotions(promo1, promo2) 
+0

這是一個很好的答案。 –