web-dev-qa-db-fra.com

Jenkinsfile - Exécution d'étape conditionnelle dans la syntaxe de pipeline de scripts

Nous utilisons la syntaxe Script Pipeline pour notre Jenkinsfile qui comporte de nombreuses étapes définies pour générer et déployer notre code. Nous avons un cas d'utilisation dans lequel je veux exécuter toutes mes étapes si je fais unFull Buildmais n'exécute qu'une étape spécifique si j'ai besoin d'effectuer un routage AWS. Je sais que je peux utiliser la if(<expression>) pour sauter une étape ou en exécuter une. Le problème est que je ne veux pas appliquer cette condition if à toutes les étapes de ma Jenkinsfile

Dans la nouvelle syntaxe Declarative Pipeline , il est facilement possible d’utiliser l’option stage..when. Nous avons beaucoup de fonctions d’assistance Groovy personnalisées utilisées dans notre infrastructure; il m’est donc impossible de passer de la syntaxe Script Pipeline à la nouvelle syntaxe Declarative Pipeline . Ce que j'ai fini par faire sur ma Jenkinsfile existante est quelque chose comme ça.

Jenkinsfile original

  stage('Checkout Code') {}
  stage('Build') {}
  parallel(
    stage('Sonar Analysis') {}
    stage('CLM Analysis') {}
    stage('Security Analysis') {}
  )
  stage('Build Docker Image') {}
  ...
  ...
  stage('QA Deploy') {}
  stage('QA Routing') {}
  ...
  ...
  stage('Prod Deploy') {}
  stage('Prod Routing') {}

Changé en

  if (fullDeploy){
    stage('Full Build') {
        stage('Checkout Code') {}
        stage('Build') {}
        parallel(
          stage('Sonar Analysis') {}
          stage('CLM Analysis') {}
          stage('Security Analysis') {}
        )
        stage('Build Docker Image') {}
        ...
        ...
        stage('QA Deploy') {}
        stage('QA Routing') {}
        ...
        ...
        stage('Prod Deploy') {}
        stage('Prod Routing') {}          
    }
  }

  if (routeOnly){
    stage('Prod Routing') {}    
  } 

Cela me semble un peu compliqué et je ne trouve aucun élément sur la documentation Jenkins qui offre un bon moyen de le faire.

Quelqu'un at-il un meilleur moyen d'intégrer cela?

4
Ali Bhagat

Je n'utilise pas de pipelines scriptés, mais je suis presque sûr que c'est ce que vous feriez (en incluant les étapes conditionnelles dans une if).

Si vous voulez qu'il agisse un peu plus comme déclaratif, vous pouvez placer des instructions if dans chaque étape. De cette façon, les étapes seraient toujours visualisées. Cela peut être souhaitable ou non alors qu’ils n’ont rien fait.

Je pense que le passage au déclaratif sera le seul moyen d’afficher les étapes ignorées différemment dans l’interface utilisateur blue ocean (elles ont un aspect différent lorsqu’elles sont ignorées en raison d’une clause when), mais vous disposez du plus petit code avec votre solution actuelle. Cela ne me semble pas bizarre, mais ce genre de chose peut être subjectif. :)

2
burnettk

Je n'aimais pas non plus l'idée d'avoir un bloc if {} redondant dans mon stage {}

def stage(name, execute, block) {
    return stage(name, execute ? block : {echo "skipped stage $name"})
}

maintenant vous pouvez désactiver une étape comme suit

stage('Full Build', false) { 
    ...
}

Mise à jour Vous pouvez également marquer l'étape ignorée en utilisant la définition ci-dessous

import org.jenkinsci.plugins.pipeline.modeldefinition.Utils

def stage(name, execute, block) {
    return stage(name, execute ? block : {
        echo "skipped stage $name"
        Utils.markStageSkippedForConditional(STAGE_NAME)
    })
}
17
culmat

D'après les commentaires sur JENKINS-47286 , il ne semble pas que l'ajout du support when au Scripted Pipeline ait lieu. Pour contourner le problème, il existe une bibliothèque partagée implémentant l'instruction when pour les pipelines scriptés: https://github.com/comquent/imperative-when

2
Nick Jones