2017-05-25 49 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

这是一个很好的答案。 –