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?
Est-ce que 'if (config.toolchainsBuild) {job (" job1 ")} else {matrixJob (" job2 ")}' fonctionne? – Raphael
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
Vous pouvez mettre matrixJob ("job2") {etc; etc; } à l'intérieur de l'autre. – Raphael