Общие несколько рекламных акций Jenkins DSL

Я написал большинство заданий/конвейеров нашего проекта на DSL без какого-либо предыдущего опыта работы с groovy, но теперь я застрял на более сложной проблеме, которую не могу понять.

Я пытаюсь реализовать метод, который добавил бы 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])
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Можно ли каким-то образом повторно использовать замыкания и, возможно, заполнить переменные другим методом? Или есть другие идеи?


person matijasx    schedule 25.05.2017    source источник
comment
Да, это возможно, способ Groovy сделать это состоит в том, чтобы добавить ваши рекламные акции в список, перебирая этот список, вызывая необходимый job-dsl, который вам нужно запустить. На выходных дам полный ответ.   -  person Rob Kielty    schedule 09.06.2017
comment
Мне удалось найти решение, похожее на то, что вы сказали, но вместо этого я использую объекты. Тем не менее, не стесняйтесь предоставлять Groovy способ сделать это для эстетики и обучения.   -  person matijasx    schedule 15.06.2017
comment
Была сумасшедшая неделя! Apols за то, что еще не ответил.   -  person Rob Kielty    schedule 15.06.2017


Ответы (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])
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

Затем я подготавливаю свои параметры и передаю их конструктору продвижения, и в конце я вызываю 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)
person matijasx    schedule 12.06.2017
comment
Это прекрасный ответ. - person Rob Kielty; 15.06.2017