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 { ... }
}| Condition | Description |
|---|---|
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):
| Expression | Signification |
|---|---|
H/15 * * * * | Toutes les 15 min (décalé par hash pour éviter les pics) |
H H * * 1-5 | Une fois par jour en semaine |
H 2 * * 0 | Tous 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’
inputbloque un executor pendant l’attente — utiliseragent nonesur 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
- Pipeline — Vue d’ensemble — hub pipeline
- Jenkinsfile déclaratif — structure complète du pipeline
- Shared Libraries — factoriser
when,triggersdans des fonctions réutilisables