Référence des directives avancées d’un Jenkinsfile déclaratif : conditions, déclencheurs, validation manuelle, et parallélisme.


when — conditions d’exécution d’un stage

stage('Deploy Prod') {
    when {
        allOf {
            branch 'main'               // branche = main
            not { changeRequest() }     // pas une PR
            environment name: 'ENV', value: 'prod'  // variable d'env = prod
        }
    }
    steps { ... }
}
ConditionDescription
branch 'main'Exécute seulement sur cette branche
tag 'v*'Exécute sur les tags correspondants
changeRequest()Vrai si c’est une Pull Request
environment name: 'X', value: 'Y'Variable d’environnement = valeur
expression { return params.DEPLOY == 'yes' }Expression Groovy libre
not { ... }Inverse la condition
allOf { ... }ET logique
anyOf { ... }OU logique
beforeAgent trueÉvalue la condition AVANT de réserver un agent

triggers — déclencheurs automatiques

triggers {
    // Polling SCM toutes les 5 minutes (si pas de webhook)
    pollSCM('H/5 * * * *')
 
    // Build périodique (cron) — tous les jours à 2h
    cron('H 2 * * *')
 
    // Webhook GitHub/GitLab — déclenche sur push (plugin requis)
    githubPush()
 
    // Pipeline upstream — déclenche quand "autre-job" réussit
    upstream(upstreamProjects: 'autre-job', threshold: hudson.model.Result.SUCCESS)
}

Syntaxe cron Jenkins (H = hash):

ExpressionSignification
H/15 * * * *Toutes les 15 min (décalé par hash pour éviter les pics)
H H * * 1-5Une fois par jour en semaine
H 2 * * 0Tous les dimanches à 2h environ

input — validation manuelle (gate)

stage('Deploy Production') {
    input {
        message "Déployer la version ${env.BUILD_NUMBER} en production ?"
        ok      "Valider"
        submitter 'admin,ops-team'   // qui peut valider
        parameters {
            choice(name: 'ENV', choices: ['prod-eu','prod-us'], description: 'Région')
        }
    }
    steps {
        sh "deploy.sh ${ENV}"
    }
}

⚠️ L’input bloque un executor pendant l’attente — utiliser agent none sur le stage parent pour libérer l’executor.


parallel — exécution en parallèle

stages {
    stage('Tests parallèles') {
        parallel {
            stage('Unit Tests') {
                agent { label 'linux' }
                steps { sh 'pytest tests/unit' }
            }
            stage('Integration Tests') {
                agent { label 'linux' }
                steps { sh 'pytest tests/integration' }
            }
            stage('Security Scan') {
                agent { label 'linux' }
                steps { sh 'trivy image mon-app:latest' }
            }
        }
        // Stopper tous les stages parallèles si l'un échoue
        failFast true
    }
}

script — Groovy libre dans un stage déclaratif

steps {
    script {
        def tag = "${env.REGISTRY}/mon-app:${env.BUILD_NUMBER}"
        def exitCode = sh(script: "docker build -t ${tag} .", returnStatus: true)
        if (exitCode != 0) {
            error "La construction Docker a échoué"
        }
        env.IMAGE_TAG = tag   // partager une variable entre stages
    }
}

stash / unstash — partager des fichiers entre stages

stage('Build') {
    steps {
        sh 'mvn package -DskipTests'
        stash name: 'jar', includes: 'target/*.jar'
    }
}
 
stage('Deploy') {
    agent { label 'deploy' }  // agent différent
    steps {
        unstash 'jar'
        sh 'deploy.sh target/*.jar'
    }
}

retry et timeout au niveau d’un step

steps {
    retry(3) {
        sh 'curl -f https://api.example.com/health'
    }
    timeout(time: 5, unit: 'MINUTES') {
        sh './scripts/wait-for-deploy.sh'
    }
}

En relation avec