J'ai un pipeline Jenkins qui comporte plusieurs étapes, par exemple:
node("nodename") {
stage("Checkout") {
git ....
}
stage("Check Preconditions") {
...
if(!continueBuild) {
// What do I put here? currentBuild.xxx ?
}
}
stage("Do a lot of work") {
....
}
}
Je veux pouvoir annuler (pas échouer) la construction si certaines conditions préalables ne sont pas remplies et qu’il n’ya pas de travail à faire. Comment puis-je faire ceci? Je sais que la variable currentBuild
est disponible, mais je ne trouve pas la documentation correspondante.
Vous pouvez marquer la construction comme étant ABORTED, puis utiliser l’étape error
pour arrêter la construction:
if (!continueBuild) {
currentBuild.result = 'ABORTED'
error('Stopping early…')
}
Dans la vue de la scène, cela montrera que la construction s'est arrêtée à ce stade, mais que l'ensemble de la construction sera marqué comme abandonné plutôt qu'échoué (voir l'icône grise de la construction n ° 9):
Après quelques tests, j'ai trouvé la solution suivante:
def autoCancelled = false
try {
stage('checkout') {
...
if (your condition) {
autoCancelled = true
error('Aborting the build to prevent a loop.')
}
}
} catch (e) {
if (autoCancelled) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Cela se traduira par la vue d'étape suivante:
Si vous n'aimez pas l'étape en échec, vous devez utiliser return. Mais sachez que vous devez sauter chaque étape ou emballage.
def autoCancelled = false
try {
stage('checkout') {
...
if (your condition) {
autoCancelled = true
return
}
}
if (autoCancelled) {
error('Aborting the build to prevent a loop.')
// return would be also possible but you have to be sure to quit all stages and wrapper properly
// return
}
} catch (e) {
if (autoCancelled) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Le résultat:
Vous pouvez également utiliser un message personnalisé à la place d'une variable locale:
final autoCancelledError = 'autoCancelled'
try {
stage('checkout') {
...
if (your condition) {
echo('Aborting the build to prevent a loop.')
error(autoCancelledError)
}
}
} catch (e) {
if (e.message == autoCancelledError) {
currentBuild.result = 'ABORTED'
echo('Skipping mail notification')
// return here instead of throwing error to keep the build "green"
return
}
// normal error handling
throw e
}
Suite à cela documentation de Jenkins, vous devriez être capable de générer une erreur pour arrêter la construction et définir le résultat de la construction comme ceci:
currentBuild.result = 'ABORTED'
J'espère que ça t'as aidé.
J'ai traité de manière déclarative comme indiqué ci-dessous:
Basé sur le bloc catchError, il exécutera un bloc post. Si le résultat de post tombe dans la catégorie d'échec, le bloc d'erreur sera exécuté pour arrêter les étapes à venir telles que Production, PréProd, etc.
pipeline {
agent any
stages{
stage('Build') {
steps{
catchError {
sh 'Sudo bash path/To/Filename.sh'
}
}
post {
success {
echo 'Build stage successful'
}
failure {
echo 'Compile stage failed'
error('Build is aborted due to failure of build stage')
}
}
}
stage ('Production'){
steps {
sh 'Sudo bash path/To/Filename.sh'
}
}
}
}
La chose que nous utilisons est:
try {
input 'Do you want to abort?'
} catch (Exception err) {
currentBuild.result = 'ABORTED';
return;
}
Le "retour" à la fin s'assure qu'aucun autre code n'est exécuté.