Comment pouvez-vous définir Jenkins scène ou d'un pipeline parallèle le statut de branche (instable, échec, etc) pour les utiliser en vue de la Scène et de l'Océan Bleu de l'INTERFACE utilisateur?

Aperçu

Je suis actuellement à la configuration d'un pipeline composé d'un certain nombre de plate-forme s'appuie. Au début de la canalisation, un utilisateur peut sélectionner les plates-formes de construire ou de l'ignorer.

Selon que la "construction" d'étape, pour chaque plate-forme de passe ou échoue, les étapes en aval pouvez vérifier le statut de cette plate-forme à construire et à déterminer si ou de ne pas exécuter. Cela permet à la canalisation d'essayer de compléter les autres plates-formes (si la confirmation par l'utilisateur de le faire) si une ou plusieurs plates-formes de l'échec.

Progrès

Comme il est, mon pipeline réalise cette opération, d'autoriser un utilisateur à inclure/exclure des plates-formes au début de la canalisation et d'autoriser le pipeline de continuer à construire si une plate-forme d'échec (mais marquant le pipeline comme un échec). Cela permet d'archiver des fichiers de compilation/édition gtests, etc, qui peut être fait, en aval, de stades ou étapes. Voici mon Jenkinsfile:

//Specify whether or not to build platform by default
def buildDefinitions = [ 'windows' : true , 'macos' : true , 'ubuntu' : true ]
//Keep track of builds that fail
def failedBuilds = [:]
stage('Build Customisation') {
try {
//Wait limited amount of time for user input
timeout(time: 30, unit: 'SECONDS') {
//Update the build definitions based on user input
buildDefinitions = input(
message: 'Toggle which builds to run (Abort will use default)',
//Use custom global function to generate boolean input parameters based on a map
//Sets default value to value in input map
parameters: generateInputBoolParams( buildDefinitions )
)
}
//Continue pipeline if user input not provided within time limit
} catch ( error ) {
echo 'Using default pipeline configuration...'
}
//Check that at least one build platform is selected
if ( !mapContainsTrue( buildDefinitions ) ) {
error 'No builds selected, aborting pipeline'
}
}
stage('Conditional Build') {
parallel (
'Windows' : {
//Prevent a build failure from terminating the pipeline after this stage
try {
//Check if windows build is set to run
if ( buildDefinitions['windows'] ) {
node('windows') {
checkout(scm)
bat 'build.bat default-windows'
}
} else {
echo 'Build was disabled by user'
}
//Catch an error in the build
} catch ( error ) {
//Make note that the build failed
failedBuilds['windows'] = true
//Set the pipeline status as failure
currentBuild.result = 'FAILURE'
}
},
'MacOS' : {
try {
if ( buildDefinitions['macos'] ) {
node('macos') {
checkout(scm)
sh './build.sh default-macos'
}
} else {
echo 'Build was disabled by user'
}
} catch ( error ) {
failedBuilds['macos'] = true
currentBuild.result = 'FAILURE'
}
},
'Ubuntu' : {
try {
if ( buildDefinitions['ubuntu'] ) {
node('ubuntu') {
checkout(scm)
sh './build.sh default-ubuntu'
}
} else {
echo 'Build was disabled by user'
}
error 'test error'
} catch ( error ) {
failedBuilds['ubuntu'] = true
currentBuild.result = 'FAILURE'
}
}
)
//Check if any builds have been marked as failed
if ( mapContainsTrue( failedBuilds ) ) {
//Remove failed builds from the original map of enabled builds
def updatedBuildDefinitions = subtractMap( buildDefinitions, failedBuilds )
//Check that there are builds left to run
if ( mapContainsTrue( updatedBuildDefinitions ) ) {
//Update the original build map
buildDefinitions = updatedBuildDefinitions
//Lists the failed builds and asks whether to continue or abort the pipeline
timeout(time: 30, unit: 'SECONDS') {
input(
message: 'Builds failed ' + getKeyset( failedBuilds ) + ', do you want to continue the pipeline and skip failed builds?'
)
}
} else {
//Throw an error to terminate the pipeline if no builds are left to run
error 'No builds left to run'
}
}
}
stage('Conditional Downstream') {
parallel (
'Windows' : {
if ( buildDefinitions['windows'] ) {
echo 'You chose to run the windows build!'
} else {
echo 'The windows build was skipped'
}
},
'MacOS' : {
if ( buildDefinitions['macos'] ) {
echo 'You chose to run the macos build!'
} else {
echo 'The macos build was skipped'
}
},
'Ubuntu' : {
if ( buildDefinitions['ubuntu'] ) {
echo 'You chose to run the ubuntu build!'
} else {
echo 'The ubuntu build was skipped'
}
}
)
}

Et mes fonctions globales:

//subtractMap.groovy
def call ( map1, map2 ) {
return map1 - map2
}
//mapContainsTrue.groovy
boolean call ( array ) {
for ( entry in array ) {
if ( entry.value == true ) {
isBuildConfigValid = true
return true
} else {
return false
}
}
}
//getKeyset.groovy
def call ( map ) {
return map.keySet() as String[]
}
//generateInputBoolParams.groovy
def call ( array ) {
def parameterList = []
for ( item in array ) {
parameterList.add( booleanParam(defaultValue: item.value, name: item.key) )
}
return parameterList
}

Problème

Tandis que la fonctionnalité générale de travaux, la réponse de l'INTERFACE utilisateur n'a pas, en dehors de marquage le pipeline comme un échec. Je voudrais être en mesure de marquer la branche parallèle comme un échec alors que dans le Bleu de l'Océan de l'INTERFACE utilisateur, il est facile de voir quelle plate-forme n'a pas de construire.

Le bleu de l'Océan de l'INTERFACE utilisateur avec l'échec de la branche parallèle dans le bloc try/catch

Il serait également utile de marquer la scène échoué lorsqu'il n'est pas dans le Bleu de l'Océan de l'INTERFACE utilisateur, la Vue de la Scène qui montre un échec (à moins que cela ne se produit que si le pipeline est terminée à ce stade) mais, une fois le Bleu de l'Océan est plus en version Bêta, ce ne serait pas vraiment plus un problème.

Vue de la scène échec de la scène (ci-Dessus) et comme c'est (ci-Dessous)

Question

  • Comment puis-je marquer la branche parallèle d'échec, de sorte qu'il apparaisse dans l'Océan Bleu de l'INTERFACE utilisateur avec une croix rouge? Peut-être avec une variable d'environnement comme currentBuild.result

  • Est une chose de similaire possible avec l'ensemble de la scène afin qu'il s'affiche dans la Vue de la Scène? (Moins important)

Avez-vous trouver la solution ? J'ai la même utilisation.

OriginalL'auteur inkychris | 2017-01-11