2017-05-25 3 views
1

Ich habe die meisten Jobs/Pipelines unseres Projektes in DSL ohne irgendeine vorherige groovy Erfahrung geschrieben, aber jetzt bin ich bei fortgeschritteneren Problem fest, das ich nicht herausfinden kann.Jenkins DSL generische mehrfache Förderungen

Ich versuche eine Methode zu implementieren, die 1,2, n Aktionen zu einem Job hinzufügen würde. Unten sehen Sie eine voll funktionsfähige Methode, die eine Promotion hinzufügen kann, und ich erwartete, dass es so funktioniert, dass ich die Methode nur zweimal aufrufen würde, wenn ich eine andere brauchte, aber dann stieß ich auf mein Problem wurde erstellt das neueste würde generiert werden.

/** 
    * @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]) 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

So wie es funktionieren würde, aber wenn ich eine andere 'Förderung' Schließung wie diese, aber hinzugefügt, dieses Beispiel fast identisch erzeugen würde (Namen und Namen-1) Sonderangebote:

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]) 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

Ist es möglich, Closures in irgendeiner Weise wiederzuverwenden und die Variablen von einer anderen Methode aus zu bevölkern? Oder irgendwelche anderen Ideen?

+0

Ja ist es möglich, die Groovy Weise, dies zu tun würde sein, Ihre Beförderungen einer Liste iterate über dieser Liste hinzuzufügen, die das notwendige job-dsl aufruft, das Sie ausführen müssen. Ich werde am Wochenende eine vollständige Antwort geben. –

+0

Es ist mir gelungen, eine Lösung zu finden, die dem ähnelt, was Sie gesagt haben, aber ich benutze stattdessen Objekte. Wie auch immer, fühlen Sie sich frei, Groovy Art, es für die Ästhetik und Lernen zu tun. – matijasx

+0

War eine verrückte Woche! Apologeten, die noch nicht beantwortet haben. –

Antwort

1

So habe ich es gelöst.

Allgemeine Förderung Objektteil:

/** 
* 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]) 
             } 
            } 
           } 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Und dann habe ich meine params vorzubereiten und sie auf die Förderung Konstruktor übergeben, und am Ende habe ich nennen addPromotions() und übergeben alle meine konstruierten Objekte, um es:

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

Dies ist eine gute Antwort. –

Verwandte Themen