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

142b1ffa8c40aa37f65b0d70826fa99d?s=128

Sebastian Hempel

November 15, 2018
Tweet

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