Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Jobs as Code - Jenkins Pipeline Jobs

Jobs as Code - Jenkins Pipeline Jobs

Folien meines Vortrag auf der Continuous Lifecycle 2018

Sebastian Hempel

November 15, 2018
Tweet

More Decks by Sebastian Hempel

Other Decks in Programming

Transcript

  1. JOBS AS CODE Jenkins Pipeline Jobs Sebastian Hempel 1

  2. Sebastian Hempel IT-Consulting Hempel @ithempel shempel@it-hempel.de 2

  3. Klassische Jobs XML-Dateien Erstellung und Konfiguration über GUI 3 .

    1
  4. PROBLEME DER JENKINS JOBS Dokumentation Reproduzierbarkeit automatische Erstellung Durchführung von

    Änderungen 3 . 2
  5. Neue Job Typen Continuous Delivery Pipeline seit Jenkins 2 Realisierung

    durch Plugins 4 . 1
  6. MERKMALE DER JENKINS PIPELINE Pipeline Domain Specific Language (DSL) Pipeline

    as Code Jenkinsfile in Git 4 . 2
  7. VORTEILE DER PIPELINE Durable (robust) Pausable (Warten auf Benutzereingabe) Versatile

    (Schleifen, fork/join, parallel) Extensible (DSL ist erweiterbar) 4 . 3
  8. SCRIPTED PIPELINE erste Realisierung Klassen und Funktionen für Groovy Anlehnung

    an Job DSL Plugin 4 . 4
  9. DECLARATIVE PIPELINE zweite Generation Groovy DSL (domain specific language) deklarativer

    Syntax Resume-Able 4 . 5
  10. STRUKTUR EINER PIPELINE Jenkinsfile pipeline Definition Direktiven 5 . 1

  11. BEISPIEL EINER PIPELINE 1 Ausführung eines Shell Kommandos 2 Step,

    der vom JUnit plugin zur Verfügung gestellt wird pipeline { agent any stages { stage('Build') { steps { sh 'make' (1) } } stage('Test') { steps { sh 'make check' junit 'reports/**/*.xml' (2) } } 5 . 2
  12. AGENT 1 Jenkins bestimmt den Executor 2 kein Executor 3

    Auswahl eines Executors über ein Label agent any (1) agent none (2) agent { label 'linux' (3) } 5 . 3
  13. STAGES 1 Definition der Stages der Pipeline 2 mindestens ein

    Stage muss definiert sein stages { (1) stage('Build') { (2) ... } } 5 . 4
  14. STAGE 1 Definition eines anderen / eigenen Agents 2 beinhaltet

    steps stages { stage('Build') { agent { (1) label 'linux' } steps { (2) ... } } } 5 . 5
  15. STEPS 1 Container um die Steps einer Stage 2 Steps

    / Kommandos der Stage stages { stage('Build') { steps { (1) echo "Building" (2) } } } 5 . 6
  16. WEITERE DIREKTIVEN Environment Variablen Job Optionen Job Parameter Build Trigger

    Build Tools 6 . 1
  17. ENVIRONMENT Setzen von Environment Variablen Kann in pipeline oder stage

    gesetzt werden. environment { JAVA_HOME = '/usr/java/openjdk8-latest' } 6 . 2
  18. SECRETS AUS CREDENTIAL STORE REMOTE = secret REMOTE = user:password

    REMOTE_USR = user REMOTE_PSW = password environment { REMOTE = credentials('credential-id') } 6 . 3
  19. OPTIONS 1 Direktive zur Definition / Festlegung der Optionen 2

    Option für das Timeout der Pipeline options { (1) timeout(time: 1, unit: 'HOURS') (2) } 6 . 4
  20. OPTIONS buildDiscarder(logRotator(numToKeepStr: '10')) disableConcurrentBuilds() skipStagesAfterUnstable() timeout(time: 1, unit: 'HOURS') retry(3)

    timestamps() 6 . 5
  21. PARAMETER DEFINITION Setzen von Parametern Parameter PERSON vom Typ string

    Vorgabewert Mr Jenkins Beschreibung des Parameters für den Benutzer parameters { string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?') } 6 . 6
  22. ZUGRIFF AUF PARAMETER Zugriff über das params Objekt Objekt stellt

    Parameter als Properties zur Verfügung. steps { echo "Hello ${params.PERSON}" } 6 . 7
  23. TRIGGER Wie soll der Job automatisch ausgeführt werden? 1 Starte

    Job zeitgesteuert triggers { cron('H 4/* 0 0 1-5') (1) } 6 . 8
  24. TRIGGER cron('H 4/* 0 0 1-5') pollSCM('H 4/* 0 0

    1-5') upstream(upstreamProjects: 'job1,job2', threshold: hudson.model.Result.SUCC 6 . 9
  25. TOOLS Buildtools zum PATH hinzufügen Unterstütze Tools: maven jdk gradle

    tools { maven 'apache-maven-3.5.0' } 6 . 10
  26. ERSTELLEN VON PIPELINES Es gibt 2 Arten eine Pipeline zu

    erstellen: Textfeld in Jenkins Jenkinsfile 7 . 1
  27. EINGABEFELD IN JOB 7 . 2

  28. JENKINSFILE 7 . 3

  29. SNIPPET-GENERATOR 7 . 4

  30. PIPELINE STEPS Kommandos / Befehle innerhalb eines Stage Basis Steps

    von Jenkins weitere Steps von Plugins 8 . 1
  31. STEP: SH Ausführen eines Shell Scripts (bash) sh 'build.sh' /*

    short form */ sh([script: 'build.sh']) /* long form */ 8 . 2
  32. STEP: SH Speichern des Return Codes in einer Variablen 1

    Die Variable status enthält den Resultcode des Kommandos status = sh([script: 'build.sh', returnStatus: true]) (1) 8 . 3
  33. STEP: SSHAGENT Block mit aktivierten SSH-Agent ausführen 1 startet den

    SSH-Agent und lädt das angegebene Credential sshagent([credentials: ['publish']]) { (1) sh 'ssh -o StrictHostKeyChecking=no publisher@content.exmaple.com publi } 8 . 4
  34. STEP: SCRIPT "Wechsel" zu Scripted Pipeline 1 Innerhalb des script

    Blocks können Anweisungen der Scripted Pipeline ausgeführt werden script { (1) } 8 . 5
  35. ARCHIV ENTPACKEN Entpacken eines Archivs im Workspace 1 Entpacken des

    Archivs im aktuellen Verzeichnis 2 Entpacken im Unterverzeichnis release_tmp unzip([zipFile: 'release.zip']) (1) unzip([zipFile: 'release.zip', dir: 'release_tmp']) (2) 8 . 6
  36. ARCHIV PACKEN Erstellen eines Archivs 1 Erstellt eine ZIP-Archiv archive.zip

    mit dem Inhalt des Ordner release zip([zipFile: 'archive.zip', dir: 'release']) (1) 8 . 7
  37. FEHLERBEHANDLUNG Prüfung nach jedem Step Abbruch der Pipeline bei Result

    != 0 Fehlerbehandlung pro Stage oder für gesamte Pipeline 8 . 8
  38. FEHLEBEHANDLUNG IM STAGE 1 post Sektion für den Stage Build

    2 Wenn der Stage des Status failed hat pipeline { agent any stages { stage('Build') { steps { sh 'make build' } post { (1) failure { (2) echo 'Error compiling sources!' } } } } } 8 . 9
  39. FEHLERBEHANDLUNG DER PIPELINE 1 post Sektion für die gesamte Pipeline

    pipeline { agent any stages { stage('Build') { steps { sh 'make build' } } } post { (1) failure { echo 'Error executing pipe!' } } } 8 . 10
  40. GLOBALE VARIABLEN Werden von Jenkins zur Verfügung gestellt params env

    currentBuild 8 . 11
  41. ZUGRIFF AUF AKTUELLEN BUILD Eigenscha en number / id result

    / currentResult displayName / description 8 . 12
  42. TEXT BESCHREIBUNG ÄNDERN 1 Name des Jobs ändern / überschreiben

    2 Beschreibung des Runs setzen script { currentBuild.displayName = 'My Job' (1) currentBuild.description = 'This is as super duper run!' (2) } 8 . 13
  43. PIPELINE ADVANCED erweiterte Sprachmöglichkeiten bedingte Ausführung parallele Ausführung Pipeline pro

    Branch 9 . 1
  44. BEDINGTE AUSFÜHRUNG Prüfung einer Bedingung vor der Ausführung eines Stage

    1 Block mit Bedingung 2 Bedingung die true ergeben muss, damit Steps ausgeführt werden stage('Deploy') { when { (1) // Bedingung (2) } steps { sh 'make something' } } 9 . 2
  45. BEDINGUNG: ENVIRONMENT VARIABLEN Prüfung auf den Wert einer Environment Variablen

    1 Die Environment Variable STAGE muss den Wert production haben when { environment name: 'STAGE', value: 'production' (1) } 9 . 3
  46. BEDINGUNG: GROOVY EXPRESSION Auswertung eines Groovy Ausdrucks 1 Die Variable

    STAGE muss den regulären Ausdruck matchen when { expression { STAGE ==~ /(production|maintenance)/ } (1) } 9 . 4
  47. BEDINGUNG: NEGATION Bedingung negieren 1 Die Environment Variable STAGE darf

    nicht den Wert production haben when { not { environment name: 'STAGE', value: 'production' } (1) } 9 . 5
  48. BEDINGUNGEN: UND VERKNÜPFUNG Alle Bedingungen müssen zutreffen 1 Beide environment

    Bedingungen müssen zutreffen when { allOf { (1) environment name: 'STAGE', value: 'production' environment name: 'DEPLOY_TO', value 'production' } } 9 . 6
  49. BEDINGUNGEN: ODER VERKNÜPFUNG Eine Bedingung muss zutreffen 1 Mindestens eine

    Bedingung muss zutreffen when { anyOf { (1) environment name: 'STAGE', value: 'production' environment name: 'DEPLOY_TO', value 'production' } } 9 . 7
  50. SHARED LIBRARIES Ziele: gemeinsame Nutzung von Build Steps "Plugins" für

    Pipeline Jobs 9 . 8
  51. SHARED LIBRARIES REPOSITORY Source Code Repository 1 Resourcen wie z.B.

    Datendateien 2 Groovy (Hilfs) Code (classpath) 3 Variablen (= custom build steps) . ├── resources (1) ├── src (2) └── vars (3) └── myMaven.groovy 9 . 9
  52. BUILD STEP DEFINIEREN vars/myMaven.groovy 1 Funktion zur Ausführung des Build

    Steps Scripted Pipeline Syntax Verwendung von Groovy Code möglich def call(args) { (1) sh "${tool 'Maven v3.5'}/bin/mvn ${args}" } 9 . 10
  53. HINZUFÜGEN ZU JENKINS Einbindung in Jenkins Name der Library VCS

    Parameter Standard Version (optional) 9 . 11
  54. HINZUFÜGEN ZU JENKINS 9 . 12

  55. LIBRARY LADEN 1 Annotation der Library - _ als Dummy

    Element 2 library Step (ab Version 2.7 Shared Groovy Libraries plugin) 3 vorgegebene Version überschreiben (Tag, Branch) @Library('my-shared-library') _ (1) library 'my-shared-library' (2) library 'my-shared-library@1.0' (3) 9 . 13
  56. LIBRARY IMPLIZIT LADEN 9 . 14

  57. ENTWICKLUNGSWERKZEUGE 10 . 1

  58. SYNTAX HIGHLIGHTING Pipeline Code ist Groovy Code 10 . 2

  59. PIPELINE LINTER Validierung eines Jenkinsfile ausgeführt auf Jenkins Server HTTP

    POST-Request 10 . 3
  60. PIPELINE LINTER Anforderungen an POST-Request Secret Key aus Benutzerkonfiguration CRUMB

    für Request (CRSE Schutz) 10 . 4
  61. PIPELINE LINTER pipelint.sh if [ $1 ] && [ -f

    $1 ] then JENKINSFILE=$1 else JENKINSFILE=Jenkinsfile fi # curl (REST API) User JENKINS_USER=myuser # Api key from "/me/configure" on my Jenkins instance JENKINS_USER_KEY=fe188e2e0c1d471895811f2ea9ad757b # Url for my local Jenkins instance. JENKINS_URL=https://$JENKINS_USER:$JENKINS_USER_KEY@development.office.it-h 10 . 5
  62. REPLAY geändertes Jenkinsfile ausführen 10 . 6

  63. VERWEISE Warum Jenkins Pipeline? Anwendungsfälle https://www.cloudbees.com/blog/need-jenkins- pipeline https://jenkins.io/blog/2017/07/05/continuousdelivery- devops-artifactory/ https://jenkins.io/blog/2017/04/18/continuousdelivery-

    devops-sonarqube/ 11
  64. FRAGEN? by , any questions? Matthias Ripp CC-BY 12