Jenkins Workflow

Jean Detoeuf

Concepteur-développeur

Passionné de nouvelles technologies

#jvm #docker #craftmanship #diy

Image d'Open

Sondage

  • Intégration continue
  • Déploiement continu

Intégration Continue

  • Jenkins/Hudson
  • Go Delivery
  • Bamboo
  • Travis CI
  • Team City
  • Beaucoup d'autres

Pourquoi Jenkins ?

  • CI le plus utilisé
  • Extensible
  • Stable
  • Open Source
  • Communauté

image de jenkins

Jobs classiques

  • Build
  • Tests unitaires
  • Tests d'intégration
  • Tests système
  • Deploy

Image jobs classiques

Comment enchaîner du build au deploy ?

Histoire de faire du déploiement continu

En chainant les jobs

Image de la conf pour chainer un job

Oui, mais pour suivre l'enchaînement ?

Avec le pipeline plugin !

image du pipeline plugin

Problème

  • Complexe à mettre en oeuvre
  • On finit par avoir des jobs "étapes"
  • File d'exécution impossible à lire
  • Un job a des successeurs prédéterminés
  • Le paramétrage se fait dans Jenkins

Solution peu utilisable pour du déploiement continu

Jenkins et le déploiement continu

Déploiement Continu

Le but du déploiement continu est d'avoir une application stable en production.

 

Pour ce faire, la chaine de livraison doit être automatisée au maximum pour réduire le travail entre une modification de code et sa livraison en production.

Quel intervale de temps entre deux MEP ?

Ce n'est pas le but premier du déploiement continu.

 

Pouvoir livrer rapidement ne veut pas dire livrer régulièrement.

Go Delivery

  • Un build est composé d'étapes
  • Chaque build peut être appliqué à un environnement
  • Fan-out-in (parallelisation des étapes)

Capture d'écran de Go Delivery

Bonnes idées

  • Parallelisation des étapes
  • Environnements de déploiement
  • Visualisation du build et de l'étape en cours

Problèmes

  • Configuration gérée dans l'outil
  • Pas de possibilité de scripter le job
  • Difficulté pour gérer plusieurs versions nécessitant des jobs différents

Jenkins Workflow plugin

Plugin(s)

  • Ajout à une installation existante
  • Nouveau type de job

image de configuration de workflow

Scripter le job

et mettre le script avec les sources

Jenkinsfile

Fichier de build en Groovy

 

Exprimer tout ce que pouvait faire un job simplement

Ajouter des principes supplémentaires

 

Convention de nommage pour éviter d'indiquer le nom en configuration du job

node {
  git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
  def mvnHome = tool 'M3'
  sh "${mvnHome}/bin/mvn -B verify"
}

Jenkinsfile

  • Le base de code déclare elle-même comment s'installer
  • Différentes versions (tags/branches/commits) peuvent avoir des manières différentes de s'installer
node {
  git url: 'https://github.com/jglick/simple-maven-project-with-tests.git'
  def mvnHome = tool 'M3'
  sh "${mvnHome}/bin/mvn -B verify"
}

Actions disponibles

Echo (print)

echo 'Compilation'

Commande shell

sh 'ls /tmp'
bat 'dir C:\tmp'

try-catch-finally

try {
    checkpoint('Before production')
} catch (NoSuchMethodError _) {
    echo 'Checkpoint feature available in CloudBees Jenkins Enterprise.'
}

Outils

def mvn(args) {
    sh "${tool 'Maven 3.x'}/bin/mvn ${args}"
}

mvn 'clean install'

Validation humaine

input 'Est-ce que la page ${url} est correcte ?'

Image du pause for input

Choix du node d'exécution

node('unix && 64bit') {
    sh 'make install'
}

Paramètres

Variables d'environnement

$VAR en shell

env.VAR en groovy

Parallèlisation

Parallel

for (int i = 0; i < splits.size(); i++) {
  branches["split${i}"] = {
    node('remote') {
      sh 'rm -rf *'
      sh "${tool 'M3'}/bin/mvn -B -Dmaven.test.failure.ignore test"
    }
  }
}
parallel branches
  • parallel prend une map en paramètre
  • la clé représente le nom de la branche
  • la valeur correspond au bloc de code à exécuter

Stage

stage 'build'
sh "${tool 'M3'}/bin/mvn clean install"
stage concurrency: 1, name: 'deploy'
sh 'mv target/app.war /tmp/webapps/'
  • Permet de séparer le phases du job
  • Permet de limiter le nombre d'exécutions parallèles

Stage

stage 'build'
sh "${tool 'M3'}/bin/mvn clean install"
stage name: 'deploy', concurrency: 1
sh 'mv target/app.war /tmp'
  • Tant que le stage deploy n'est pas terminé, les exécutions suivantes s'arrêtent avant deploy
  • Si plusieurs exécutions sont en attente de deploy, c'est la dernière qui est retenue.

Jenkins Workflow

By Jean Detoeuf

Jenkins Workflow

  • 193