Sécurité

PratiqueComment
Ne jamais écrire de secret en clairToujours utiliser credentials('id') ou withCredentials
Approuver les scriptsTout script Groovy non-approuvé est bloqué par le sandbox — approuver via Manage Jenkins → In-process Script Approval
Limiter les permissionsPlugin Role Strategy : restreindre qui peut déclencher, configurer, voir les logs
Masquer les paramètres sensiblesUtiliser password(name: ...) dans parameters plutôt que string
Auditer les pluginsNe pas installer de plugin dont la source est inconnue
// ✅ Correct
withCredentials([string(credentialsId: 'api-token', variable: 'TOKEN')]) {
    sh 'curl -H "Authorization: Bearer ${TOKEN}" https://api.example.com'
}
 
// ❌ Jamais
sh 'curl -H "Authorization: Bearer mon-secret-en-clair" ...'

Performance et ressources

PratiqueComment
Toujours cleanWs()Libérer l’espace disque sur l’agent après le build
Limiter les builds conservésbuildDiscarder(logRotator(numToKeepStr: '15'))
Désactiver les executors du ControllerLe Controller ne doit pas exécuter de builds
Paralléliser les testsparallel { stage('Unit') {...} stage('Integration') {...} }
Cacher les dépendancesMonter /root/.m2 ou ~/.npm avec -v sur Docker agents
stash plutôt qu’artefactsPour partager des fichiers entre stages sur des agents différents

Organisation du code

PratiqueComment
Un Jenkinsfile par projetVersionné dans le dépôt du projet, à la racine
Multibranch PipelinePipeline automatique pour chaque branche — pas de configuration manuelle par branche
Shared LibrariesExtraire la logique commune (deploy, notify, docker) dans une lib versionnée
Nommer les stages clairement'Build Docker Image' plutôt que 'Step 3' — lisible dans Blue Ocean
failFast trueSur les stages parallèles pour arrêter rapidement si l’un échoue

Fiabilité du pipeline

PratiqueComment
timeout global et par stepÉviter les builds bloqués indéfiniment
retry sur les steps instablesretry(3) { sh '...' } pour les appels réseau fragiles
when { beforeAgent true }Évaluer la condition AVANT de réserver un agent (économise des resources)
Idempotence des scripts de déploiementUn script peut être relancé sans effet de bord
input avec submitterLimiter qui peut valider un déploiement manuel

Pipeline type CI/CD complet

Checkout → Compile → Tests Unit. ─┐
                                  ├─ (parallèle) → SonarQube → Package → Build Image
                         Lint    ─┘
                                              ↓
                                       Push Registry
                                              ↓
                                    Deploy Dev (auto)
                                              ↓
                                 [input gate] Deploy Prod
                                              ↓
                                    Smoke Tests → Notify

Outils complémentaires recommandés

OutilRôle
Blue OceanInterface pipeline moderne et visuelle
JenkinsPipelineUnitTests unitaires des Shared Libraries (offline)
Pipeline LinterValider la syntaxe d’un Jenkinsfile via l’API REST : curl -X POST -F "jenkinsfile=..." http://jenkins/pipeline-model-converter/validate
ReplayRelancer un build en modifiant le Jenkinsfile sans commit (bouton “Replay” dans l’UI)

En relation avec