JENKINS WORKFLOW
15 DÉCEMBRE 2015
JEAN DETOEUF
CONCEPTEUR-DÉVELOPPEUR
Passionné de nouvelles technologies
#jvm #docker #craftmanship #rpi #diy
SONDAGE
Intégration continue
Livraison continue
Déploiement continu
INTÉGRATION CONTINUE
JENKINS
ET BEAUCOUP D'AUTRES
POURQUOI JENKINS ?
CI le plus utilisé
Extensible
Stable
Open Source
Communauté
Livraisons régulières
Vieillissant par rapp...
JOBS CLASSIQUES
COMMENT ENCHAÎNER
DU BUILD AU DEPLOY ?
Histoire de faire du déploiement continu
EN CHAÎNANT LES
JOBS
OUI, MAIS POUR
SUIVRE
L'ENCHAÎNEMENT ?
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 ...
DÉPLOIEMENT CONTINU
Le but du déploiement continu est d'avoir une application
stable en production.
La chaine de livraison...
QUEL INTERVALE DE TEMPS ENTRE
DEUX MEP ?
Ce n'est pas le but premier du déploiement continu.
Pouvoir livrer rapidement ne ...
GO DELIVERY
Un build est composé d'étapes
Chaque build peut être appliqué à un environnement
Fan-out-in (parallelisation d...
GO DELIVERY
BONNES IDÉES
Parallèlisation des étapes
Environnements de déploiement
Visualisation du build et de l'étape en cours
Possib...
JENKINS WORKFLOW
PLUGIN
PLUGIN(S)
Ajout à une installation existante
Nouveau type de job
SCRIPTER LE JOB
ET METTRE LE SCRIPT AVEC LES
SOURCES
PIPELINE AS CODE !
SCRIPT STANDARD
Ecrit en shell
S'exécute sur un noeud (maître ou esclave)
JENKINSFILE
Fichier de build en Groovy
Du build au deploy dans un fichier compréhensible
Permet une orchestration plus ava...
JENKINSFILE
Le base de code déclare elle-même comment s'installer
Différentes versions (tags/branches/commits) peuvent
avo...
ACTIONS FOURNIES
PAR WORKFLOW
COMMANDE SHELL
sh 'ls /tmp'
bat 'dir C:tmp'
Pour reprendre un script standard, il suffit de reprendre
toutes les lignes du...
ECHO (PRINT)
echo 'Compilation'
TRY-CATCH-FINALLY
try {
checkpoint('Before production')
} catch (NoSuchMethodError _) {
echo 'Checkpoint feature available...
FOR-LOOPS
files.each{ file ->
sh "check.sh $file"
}
for num in 1..10
sh "echo $num"
}
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 ?'
Si cette validation intervient avant le déploiement, o...
CHOIX DU NOEUD
D'EXÉCUTION
node('unix && 64bit') {
sh 'make install'
}
PARAMÈTRES
EXPOSÉES SOUS FORME DE
VARIABLES D'ENVIRONNEMENT
Shell
$VAR
Groovy
env.VAR
PARALLÈLISATION
PARALLEL
for (int i = 0; i < splits.size(); i++) {
branches["split${i}"] = {
node('remote') {
sh 'rm -rf *'
sh "${tool 'M3...
PARALLEL
STAGE
Permet de séparer le phases du job
Permet de limiter le nombre d'exécutions parallèles
stage 'build'
sh "${tool 'M3'...
STAGE
stage 'build'
sh "${tool 'M3'}/bin/mvn clean install"
stage name: 'deploy', concurrency: 1
sh 'mv target/app.war /tm...
STAGE
CHARGEMENT D'UN FICHIER DE
SCRIPT
node{
def install = load 'install.groovy'
install.main()
}
Permet de diviser le script d...
SUIVI À L'IHM : OPEN SOURCE
Liens pour afficher les logs de chaque étape
SUIVI À L'IHM : CLOUDBEES EDITION
LONGUE INSTALLATION
Les builds de Workflow survivent à un redémarrage de
Jenkins
Le thread d'orchestration ne s'exécute qu...
RÉSUMÉ
Une orchestration intégrée à la base de code
Un langage expressif (DSL workflow et Groovy)
Parallèlisation et distr...
EST-CE QU'ON A LE TEMPS POUR
UNE DÉMO ?
MULTIBRANCH
Jenkins a uniquement besoin de connaître l'URL du
repository
MULTIBRANCH
Pour chaque branche à la racine de ce repository doit se
trouver le fichier Jenkinsfile
Les branches sont scru...
JENKINS SLAVES
Besoin d'installer des outils
Le bon JDK, la version de Maven qu'il me faut, gradle ? sbt ?
compilateur ?
DOCKER TO THE RESCUE !
Docker est la solution à tout de toutes manières
WORKFLOW DANS UNE IMAGE
DOCKER
docker.image('maven:3.3.3-jdk-8').inside {
sh 'mvn -B clean install'
}
Le répertoire couran...
FAIRE DES IMAGES DOCKER DANS
JENKINS
DOCKER BUILD
node {
git scm // Récupérer le repository git en mode multibranch
def myEnv = docker.build 'my-environment:sn...
DOCKER BUILD
node {
git scm // Récupérer le repository git en mode multibranch
def myEnv = docker.build "my-environment:${...
DOCKER POUR TESTER
node {
git scm
docker.image('mysql').withRun('-p 81:3126') {c ->
sh './test-with-local-db'
}
}
On veut ...
DOCKER REGISTRY
node {
docker.withRegistry('https://docker.mycorp.com/', 'docker-login'){
git scm
docker.build('myapp').pu...
DOCKER SERVER
docker.withServer('tcp://swarm.mycorp.com:2376', 'swarm-certs'){
docker.image('httpd').withRun('-p 8080:80')...
QUESTIONS ?
MERCI POUR VOTRE ÉCOUTE
Cette présentation :
@thebignet
thebignet
thebignet
talk-jenkins-workflow
Jenkins Workflow
Jenkins Workflow
Jenkins Workflow
Jenkins Workflow
Prochain SlideShare
Chargement dans…5
×

Jenkins Workflow

552 vues

Publié le

Jenkins Workflow plugin lets you write Jenkins jobs as pipelines using the Groovy programming language

Talk given in french at the Lyon JUG - 15/12/2015

Publié dans : Logiciels
0 commentaire
2 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
552
Sur SlideShare
0
Issues des intégrations
0
Intégrations
6
Actions
Partages
0
Téléchargements
19
Commentaires
0
J’aime
2
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Jenkins Workflow

  1. 1. JENKINS WORKFLOW 15 DÉCEMBRE 2015
  2. 2. JEAN DETOEUF CONCEPTEUR-DÉVELOPPEUR Passionné de nouvelles technologies #jvm #docker #craftmanship #rpi #diy
  3. 3. SONDAGE Intégration continue Livraison continue Déploiement continu
  4. 4. INTÉGRATION CONTINUE
  5. 5. JENKINS
  6. 6. ET BEAUCOUP D'AUTRES
  7. 7. POURQUOI JENKINS ? CI le plus utilisé Extensible Stable Open Source Communauté Livraisons régulières Vieillissant par rapport à la concurrence ?
  8. 8. JOBS CLASSIQUES
  9. 9. COMMENT ENCHAÎNER DU BUILD AU DEPLOY ? Histoire de faire du déploiement continu
  10. 10. EN CHAÎNANT LES JOBS
  11. 11. OUI, MAIS POUR SUIVRE L'ENCHAÎNEMENT ?
  12. 12. PIPELINE PLUGIN !
  13. 13. 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
  14. 14. DÉPLOIEMENT CONTINU Le but du déploiement continu est d'avoir une application stable en production. La chaine de livraison doit être automatisée au maximum pour réduire l'intervention humaine entre une modification de code et sa livraison en production. L'erreur est humaine
  15. 15. 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.
  16. 16. GO DELIVERY Un build est composé d'étapes Chaque build peut être appliqué à un environnement Fan-out-in (parallelisation des étapes)
  17. 17. GO DELIVERY
  18. 18. BONNES IDÉES Parallèlisation des étapes Environnements de déploiement Visualisation du build et de l'étape en cours Possibilité d'avoir plusieurs repositories en entrée 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
  19. 19. JENKINS WORKFLOW PLUGIN
  20. 20. PLUGIN(S) Ajout à une installation existante Nouveau type de job
  21. 21. SCRIPTER LE JOB ET METTRE LE SCRIPT AVEC LES SOURCES
  22. 22. PIPELINE AS CODE !
  23. 23. SCRIPT STANDARD Ecrit en shell S'exécute sur un noeud (maître ou esclave)
  24. 24. JENKINSFILE Fichier de build en Groovy Du build au deploy dans un fichier compréhensible Permet une orchestration plus avancée Convention de nommage : Jenkinsfile node { git url: 'https://github.com/spring-projects/spring-petclinic.git' def mvnHome = tool 'M3' sh "${mvnHome}/bin/mvn -B verify" }
  25. 25. 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/spring-projects/spring-petclinic.git' def mvnHome = tool 'M3' sh "${mvnHome}/bin/mvn -B verify" }
  26. 26. ACTIONS FOURNIES PAR WORKFLOW
  27. 27. COMMANDE SHELL sh 'ls /tmp' bat 'dir C:tmp' Pour reprendre un script standard, il suffit de reprendre toutes les lignes du script comme ceci
  28. 28. ECHO (PRINT) echo 'Compilation'
  29. 29. TRY-CATCH-FINALLY try { checkpoint('Before production') } catch (NoSuchMethodError _) { echo 'Checkpoint feature available in CloudBees Jenkins Enterprise.' }
  30. 30. FOR-LOOPS files.each{ file -> sh "check.sh $file" } for num in 1..10 sh "echo $num" }
  31. 31. OUTILS def mvn(args) { sh "${tool 'Maven 3.x'}/bin/mvn ${args}" } mvn 'clean install'
  32. 32. VALIDATION HUMAINE input 'Est-ce que la page ${url} est correcte ?' Si cette validation intervient avant le déploiement, on fait de la livraison continue
  33. 33. CHOIX DU NOEUD D'EXÉCUTION node('unix && 64bit') { sh 'make install' }
  34. 34. PARAMÈTRES EXPOSÉES SOUS FORME DE VARIABLES D'ENVIRONNEMENT Shell $VAR Groovy env.VAR
  35. 35. PARALLÈLISATION
  36. 36. 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
  37. 37. PARALLEL
  38. 38. STAGE Permet de séparer le phases du job Permet de limiter le nombre d'exécutions parallèles stage 'build' sh "${tool 'M3'}/bin/mvn clean install" stage concurrency: 1, name: 'deploy' sh 'mv target/app.war /tmp/webapps/'
  39. 39. 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.
  40. 40. STAGE
  41. 41. CHARGEMENT D'UN FICHIER DE SCRIPT node{ def install = load 'install.groovy' install.main() } Permet de diviser le script de build en plusieurs parties
  42. 42. SUIVI À L'IHM : OPEN SOURCE Liens pour afficher les logs de chaque étape
  43. 43. SUIVI À L'IHM : CLOUDBEES EDITION
  44. 44. LONGUE INSTALLATION Les builds de Workflow survivent à un redémarrage de Jenkins Le thread d'orchestration ne s'exécute que pour lancer la prochaine tache
  45. 45. RÉSUMÉ Une orchestration intégrée à la base de code Un langage expressif (DSL workflow et Groovy) Parallèlisation et distribution des tâches Pipeline de déploiement continu
  46. 46. EST-CE QU'ON A LE TEMPS POUR UNE DÉMO ?
  47. 47. MULTIBRANCH Jenkins a uniquement besoin de connaître l'URL du repository
  48. 48. MULTIBRANCH Pour chaque branche à la racine de ce repository doit se trouver le fichier Jenkinsfile Les branches sont scrutées régulièrement et mises à jour et lancées On peut utiliser un hook pour lancer les builds
  49. 49. JENKINS SLAVES Besoin d'installer des outils Le bon JDK, la version de Maven qu'il me faut, gradle ? sbt ? compilateur ?
  50. 50. DOCKER TO THE RESCUE ! Docker est la solution à tout de toutes manières
  51. 51. WORKFLOW DANS UNE IMAGE DOCKER docker.image('maven:3.3.3-jdk-8').inside { sh 'mvn -B clean install' } Le répertoire courant dans docker est le workspace Jenkins Montage du workspace dans un volume docker Plus de problèmes d'outils, mis à part Docker qui doit être installé sur les slaves Le container est supprimé après son exécution
  52. 52. FAIRE DES IMAGES DOCKER DANS JENKINS
  53. 53. DOCKER BUILD node { git scm // Récupérer le repository git en mode multibranch def myEnv = docker.build 'my-environment:snapshot' myEnv.push() }
  54. 54. DOCKER BUILD node { git scm // Récupérer le repository git en mode multibranch def myEnv = docker.build "my-environment:${env.BUILD_TAG}" myEnv.push() } Utilisation du tag git pour pousser dans le registry
  55. 55. DOCKER POUR TESTER node { git scm docker.image('mysql').withRun('-p 81:3126') {c -> sh './test-with-local-db' } } On veut exécuter le corps du withRun alors que l'image mysql tourne Le withRun prend optionnellement les paramètres du docker run Adapté aux tests d'intégration
  56. 56. DOCKER REGISTRY node { docker.withRegistry('https://docker.mycorp.com/', 'docker-login'){ git scm docker.build('myapp').push('latest') } } Possibilité d'utiliser un registry privé On passe des credentials enregistrés dans Jenkins
  57. 57. DOCKER SERVER docker.withServer('tcp://swarm.mycorp.com:2376', 'swarm-certs'){ docker.image('httpd').withRun('-p 8080:80') {c -> sh "curl -i http://${hostIp(c)}:8080/" } } def hostIp(container) { sh "docker inspect -f {{.Node.Ip}} ${container.id} > hostIp" readFile('hostIp').trim() } Possibilité de déléguer à un serveur docker (swarm ou autre) Le client docker doit être installé A utiliser si le slave ne peut pas supporter l'application à tester
  58. 58. QUESTIONS ?
  59. 59. MERCI POUR VOTRE ÉCOUTE Cette présentation : @thebignet thebignet thebignet talk-jenkins-workflow

×