2

Je suis en train d'écrire un script groovy-dsl pour Jenkins pour générer deux emplois:Jenkins: DSL groovy: en utilisant l'opérateur ternaire pour distinguer entre FreeStyleJob et MatrixJob

  • Le premier emploi est un FreestyleJob
  • La deuxième un est un MatrixJob

Leurs définitions sont presque les mêmes; il n'y a que des différences mineures entre eux. Par conséquent, je veux réutiliser la plupart du code du travail et je suis venu au scénario refactoring suivant (s'il vous plaît se concentrer dans la cinquième ligne, dans l'opérateur ternaire):

[ 
    ['toolchainsBuild': false], 
    ['toolchainsBuild': true], 
].each { Map config -> 
    config.toolchainsBuild ? job("job1") : matrixJob("job2") { 
     // job definition follows...for example: 
     out.println("debug") 
     steps { 
      cmake { 
       buildToolStep {} 
      } 
     } 
     // if (config.toolchainsBuild) { 
     //  ... // different actions, depending on the job type 
     // } 
    } 
} 

Cependant, cela ne fonctionne pas. Preuve: debug est imprimé une seule fois dans le fichier journal (il devrait apparaître deux fois, car je veux que deux tâches différentes soient définies).

J'ai aussi essayé d'envelopper l'opérateur ternaire et ses opérandes entre parenthèses, comme dans:

(config.toolchainsBuild ? job("job1") : matrixJob("job2")) { 
// ... 

Cependant, cela provoque une erreur de syntaxe:

Processing provided DSL script 
ERROR: (script, line 20) No signature of method: javaposse.jobdsl.dsl.jobs.MatrixJob.call() is applicable for argument types: (script$_run_closure1$_closure2) values: [[email protected]] 
Possible solutions: wait(), label(), any(), wait(long), label(java.lang.String), each(groovy.lang.Closure) 
Started calculate disk usage of build 
Finished Calculation of disk usage of build in 0 seconds 
Started calculate disk usage of workspace 
Finished Calculation of disk usage of workspace in 0 seconds 
Notifying upstream projects of job completion 
Finished: FAILURE 

Comment puis-je réécrire ci-dessus expression pour produire deux emplois différents, en fonction de la valeur du booléen?

Je crois que le problème est lié à l'utilisation de l'opérateur ternaire avec des fermetures, peut-être qu'il n'est pas destiné à être utilisé de cette façon?

+0

Est-ce que 'if (config.toolchainsBuild) {job (" job1 ")} else {matrixJob (" job2 ")}' fonctionne? – Raphael

+0

Je vais le tester. En supposant que cela fonctionne, comment est-ce que j'inclurais le corps du travail dans chaque travail sans le dupliquer? – thiagowfx

+0

Vous pouvez mettre matrixJob ("job2") {etc; etc; } à l'intérieur de l'autre. – Raphael

Répondre

1

j'ai réussi à le résoudre de cette façon:

def jobInstance = !config.toolchainsBuild ? job("job1") : matrixJob("job2") 

jobInstance.with { 
    // ... job definition follows 
} 

à savoir, en utilisant la méthode with. De cette façon, la fermeture est seulement écrite une fois.

+0

Une autre alternative serait d'affecter la fermeture à une variable, puis d'essayer d'utiliser la variable susmentionnée pour initialiser les travaux. Il serait probablement plus élégant que ma solution, mais je ne pouvais pas trouver un moyen de le faire correctement. – thiagowfx