J'essaie de comprendre comment structurer mon script groovy du pipeline 2.7 de Jenkins. J'ai lu le tutoriel sur les pipelines , mais j'ai le sentiment qu'il pourrait s'étendre davantage sur ces sujets.
Je peux comprendre qu’un pipeline peut avoir beaucoup de stage
s et que chaque stage
peut avoir beaucoup de step
s. Mais quelle est la différence entre un step();
et un appel de méthode à l'intérieur d'un stage
, disons sh([script: "echo hello"]);
. Est-ce que node
s devrait être à l'intérieur ou à l'extérieur de stage
s? Les propriétés globales d'un travail doivent-elles être à l'intérieur ou à l'extérieur d'un node
?
Voici ma structure actuelle sur un nœud maître Ubuntu:
#!/usr/bin/env groovy
node('master') {
properties([
[$class: 'BuildDiscarderProperty', strategy: [$class: 'LogRotator', numToKeepStr: '10']]
]);
stage 'Checkout'
checkout scm
stage 'Build'
sh([script: "make build"]);
archive("bin/*");
}
Les concepts de node
, stage
et step
sont différents:
node
spécifie où quelque chose doit se passer. Vous donnez un nom ou une étiquette et Jenkins exécute le bloc à cet endroit.
stage
structure votre script en une séquence de haut niveau. Les étapes s'affichent sous forme de colonnes dans la vue Etape du pipeline, avec les durées moyennes et les couleurs du résultat de l'étape.
step
est un moyen de spécifier quoi doit arriver. sh
est d'une qualité similaire, c'est un type d'action différent. (Vous pouvez également utiliser build
pour des éléments déjà spécifiés en tant que projets.)
Donc step
s peut résider dans node
s (sinon, ils sont exécutés sur le maître), et node
s et step
s peuvent être structurés en une séquence globale avec stage
s.
Ça dépend. Toute déclaration node
alloue un exécuteur (maître ou esclave Jenkins). Cela nécessite que stash
et unstash
l'espace de travail, car un autre exécuteur n'a pas les sources extraites.
Plusieurs étapes du Pipeline DSL s’exécutent dans un exécuteur flyweight et n’ont donc pas besoin d’être dans un bloc node
. Cela peut être utile pour un exemple tel que le suivant, dans lequel vous devez quand même allouer plusieurs nœuds:
stage("Checkout") {
checkout scm
}
stage("Build") {
node('linux') {
sh "make"
}
node('windows') {
bat "whatever"
}
}
stage("Upload") {
...
Un autre exemple (peut-être plus réaliste) consisterait à allouer plusieurs nœuds dans parallel
. Ensuite, il n'est pas nécessaire de laisser l'appel stage
s'exécuter dans un autre exécuteur alloué (également dans node
).
Votre exemple me semble bien. Il n'est pas nécessaire d'allouer plusieurs node
s au sein de l'unique stage
s, car il ne s'agirait que d'une surcharge supplémentaire.