jenkins workflow

63
JENKINS WORKFLOW 15 DÉCEMBRE 2015

Upload: jean-detoeuf

Post on 14-Apr-2017

684 views

Category:

Software


0 download

TRANSCRIPT

Page 1: Jenkins Workflow

JENKINS WORKFLOW

15 DÉCEMBRE 2015

Page 2: Jenkins Workflow

JEAN DETOEUFCONCEPTEUR-DÉVELOPPEUR

Passionné de nouvelles technologies

#jvm #docker #craftmanship #rpi #diy

Page 3: Jenkins Workflow

SONDAGEIntégration continueLivraison continueDéploiement continu

Page 4: Jenkins Workflow

INTÉGRATION CONTINUE

Page 5: Jenkins Workflow

JENKINS

Page 6: Jenkins Workflow
Page 7: Jenkins Workflow
Page 8: Jenkins Workflow
Page 9: Jenkins Workflow
Page 10: Jenkins Workflow

ET BEAUCOUP D'AUTRES

Page 11: Jenkins Workflow

POURQUOI JENKINS ?

CI le plus utiliséExtensibleStableOpen SourceCommunautéLivraisons régulièresVieillissant par rapport à la concurrence ?

Page 12: Jenkins Workflow

JOBS CLASSIQUES

Page 13: Jenkins Workflow

COMMENT ENCHAÎNERDU BUILD AU DEPLOY ?

Histoire de faire du déploiement continu

Page 14: Jenkins Workflow

EN CHAÎNANT LESJOBS

Page 15: Jenkins Workflow

OUI, MAIS POURSUIVRE

L'ENCHAÎNEMENT ?

Page 16: Jenkins Workflow

PIPELINE PLUGIN !

Page 17: Jenkins Workflow

PROBLÈMEComplexe à mettre en oeuvreOn finit par avoir des jobs "étapes"File d'exécution impossible à lireUn job a des successeurs prédéterminésLe paramétrage se fait dans JenkinsSolution peu utilisable pour du déploiement continu

Page 18: Jenkins Workflow

DÉPLOIEMENT CONTINULe but du déploiement continu est d'avoir une application

stable en production.

La chaine de livraison doit être automatisée au maximumpour réduire l'intervention humaine entre une modification

de code et sa livraison en production.

L'erreur est humaine

Page 19: Jenkins Workflow

QUEL INTERVALE DE TEMPS ENTREDEUX MEP ?

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

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

Page 20: Jenkins Workflow

GO DELIVERYUn build est composé d'étapesChaque build peut être appliqué à un environnementFan-out-in (parallelisation des étapes)

Page 21: Jenkins Workflow

GO DELIVERY

Page 22: Jenkins Workflow

BONNES IDÉESParallèlisation des étapesEnvironnements de déploiementVisualisation du build et de l'étape en coursPossibilité d'avoir plusieurs repositories en entrée

PROBLÈMESConfiguration gérée dans l'outilPas de possibilité de scripter le jobDifficulté pour gérer plusieurs versions nécessitant desjobs différents

Page 23: Jenkins Workflow

JENKINS WORKFLOWPLUGIN

Page 24: Jenkins Workflow

PLUGIN(S)Ajout à une installation existanteNouveau type de job

Page 25: Jenkins Workflow

SCRIPTER LE JOBET METTRE LE SCRIPT AVEC LES

SOURCES

Page 26: Jenkins Workflow

PIPELINE AS CODE !

Page 27: Jenkins Workflow

SCRIPT STANDARDEcrit en shellS'exécute sur un noeud (maître ou esclave)

Page 28: Jenkins Workflow

JENKINSFILEFichier de build en Groovy

Du build au deploy dans un fichier compréhensible

Permet une orchestration plus avancée

Convention de nommage : Jenkinsfilenode { git url: 'https://github.com/spring-projects/spring-petclinic.git' def mvnHome = tool 'M3' sh "${mvnHome}/bin/mvn -B verify" }

Page 29: Jenkins Workflow

JENKINSFILELe base de code déclare elle-même comment s'installerDifférentes versions (tags/branches/commits) peuventavoir des manières différentes de s'installernode { git url: 'https://github.com/spring-projects/spring-petclinic.git' def mvnHome = tool 'M3' sh "${mvnHome}/bin/mvn -B verify" }

Page 30: Jenkins Workflow

ACTIONS FOURNIESPAR WORKFLOW

Page 31: Jenkins Workflow

COMMANDE SHELLsh 'ls /tmp'

bat 'dir C:\tmp'

Pour reprendre un script standard, il suffit de reprendretoutes les lignes du script comme ceci

Page 32: Jenkins Workflow

ECHO (PRINT)echo 'Compilation'

Page 33: Jenkins Workflow

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

Page 34: Jenkins Workflow

FOR-LOOPSfiles.each{ file -> sh "check.sh $file" }

for num in 1..10 sh "echo $num" }

Page 35: Jenkins Workflow

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

mvn 'clean install'

Page 36: Jenkins Workflow

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

Si cette validation intervient avant le déploiement, on fait dela livraison continue

Page 37: Jenkins Workflow

CHOIX DU NOEUDD'EXÉCUTION

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

Page 38: Jenkins Workflow

PARAMÈTRESEXPOSÉES SOUS FORME DE

VARIABLES D'ENVIRONNEMENTShell

$VAR

Groovyenv.VAR

Page 39: Jenkins Workflow

PARALLÈLISATION

Page 40: Jenkins Workflow

PARALLELfor (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ètrela clé représente le nom de la branchela valeur correspond au bloc de code à exécuter

Page 41: Jenkins Workflow

PARALLEL

Page 42: Jenkins Workflow

STAGEPermet de séparer le phases du jobPermet 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/'

Page 43: Jenkins Workflow

STAGEstage '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écutionssuivantes s'arrêtent avant deploySi plusieurs exécutions sont en attente de deploy, c'est ladernière qui est retenue.

Page 44: Jenkins Workflow

STAGE

Page 45: Jenkins Workflow

CHARGEMENT D'UN FICHIER DESCRIPT

node{ def install = load 'install.groovy' install.main() }

Permet de diviser le script de build en plusieurs parties

Page 46: Jenkins Workflow

SUIVI À L'IHM : OPEN SOURCE

Liens pour afficher les logs de chaque étape

Page 47: Jenkins Workflow

SUIVI À L'IHM : CLOUDBEES EDITION

Page 48: Jenkins Workflow

LONGUE INSTALLATIONLes builds de Workflow survivent à un redémarrage deJenkinsLe thread d'orchestration ne s'exécute que pour lancer laprochaine tache

Page 49: Jenkins Workflow

RÉSUMÉUne orchestration intégrée à la base de codeUn langage expressif (DSL workflow et Groovy)Parallèlisation et distribution des tâchesPipeline de déploiement continu

Page 50: Jenkins Workflow

EST-CE QU'ON A LE TEMPS POURUNE DÉMO ?

Page 51: Jenkins Workflow

MULTIBRANCH

Jenkins a uniquement besoin de connaître l'URL durepository

Page 52: Jenkins Workflow

MULTIBRANCHPour chaque branche à la racine de ce repository doit se

trouver le fichier Jenkinsfile

Les branches sont scrutées régulièrement et mises à jour etlancées

On peut utiliser un hook pour lancer les builds

Page 53: Jenkins Workflow

JENKINS SLAVESBesoin d'installer des outils

Le bon JDK, la version de Maven qu'il me faut, gradle ? sbt ?compilateur ?

DOCKER TO THE RESCUE !

Page 54: Jenkins Workflow

DOCKER TO THE RESCUE !

Docker est la solution à tout de toutes manières

Page 55: Jenkins Workflow

WORKFLOW DANS UNE IMAGEDOCKER

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 êtreinstallé sur les slaves

Le container est supprimé après son exécution

Page 56: Jenkins Workflow

FAIRE DES IMAGES DOCKER DANSJENKINS

Page 57: Jenkins Workflow

DOCKER BUILDnode { git scm // Récupérer le repository git en mode multibranch def myEnv = docker.build 'my-environment:snapshot' myEnv.push() }

Page 58: Jenkins Workflow

DOCKER BUILDnode { 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

Page 59: Jenkins Workflow

DOCKER POUR TESTERnode { 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'imagemysql tourne

Le withRun prend optionnellement les paramètres dudocker run

Adapté aux tests d'intégration

Page 60: Jenkins Workflow

DOCKER REGISTRYnode { 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

Page 61: Jenkins Workflow

DOCKER SERVERdocker.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

Page 62: Jenkins Workflow

QUESTIONS ?

Page 63: Jenkins Workflow

MERCI POUR VOTRE ÉCOUTE

Cette présentation :

@thebignetthebignetthebignet

talk-jenkins-workflow