Jenkins Workflow

458 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
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
458
Sur SlideShare
0
Issues des intégrations
0
Intégrations
7
Actions
Partages
0
Téléchargements
14
Commentaires
0
J’aime
1
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

×