SlideShare a Scribd company logo
1 of 52
Download to read offline
Declarative
Jenkins Pipelines
Steffen Gebert
Java User Group Mannheim, 15.03.2017
@StGebert on Twitter
@StephenKing elsewhere
2
Thanks
for sponsoring my travel costs
About Me
Researcher / PhD Student
(Software-based Networks)
2011 - 2016
Core Team Member
2010 - 2013
Server Admin Team Member
since 2011
3
Co-Organizer DevOps Meetup Würzburg
since 2016
Continuous Delivery
5
Agile Development
• Sprints of ~1-4 weeks duration
• Result: Product that can be
shown/given to customer
• Return: Feedback
Image	credits:	Marekventur,
Wikimedia, CC-BY-SA-3.0
6
Continuous Delivery
• Reduce cycle times (even more)
• “How long does it take to release a one-line change?”
• Potentially deliverable code with every commit
• Automated tests decide about acceptance
• You don’t have to release/deploy it, but you could
à Continuous Deployment: Deploy every successfully
tested commit automatically
7
Pipelines
• Every check-in triggers
pipeline execution
• Feedback to the team in
every stage
• “Bring the pain forward”
• “Fail fast, fail often”
• Minimize execution time
• Always aware of
latest stable release
CI & CD Tools
9
CI/CD Tools
• On-premise
• Jenkins
• Thoughtworks Go
• Gitlab CI
• Pivotal Concourse
• Jetbrains TeamCity
• SaaS
• TravisCI
• CircleCI
• AppVeyor
• Codeship
• Visual Studio Team Services
10
Why (I like) Jenkins
• Established open source project
• On premise installation
• Thousands of plugins
• Integrates with many tools/services
• Tailored to CI/CD
11
History of CI/CD with Jenkins
• Downstream Jobs
• Job A triggers job B triggers job C triggers job D trig...
• If one job fails, fail all
• Build Pipeline View
But that’s awkward
… and what I want instead
13
Configuration as Code
• Define jobs/pipelines as code
• Avoid point & click
• In version control
• Can live with the application
• Scales better
• Example: .travis.yml (from TravisCI)
• Similar to GitlabCI
language: php
services:
- redis-server
before_script:
- composer install
script:
- ./bin/phpunit -c …
notifications:
slack:
…
14
Code-driven Approaches in Jenkins
• Jenkins Job Builder
• Python / YAML based, from the OpenStack project
• Job DSL plugin
• Groovy DSL!
(e.g. query Github API and create
jobs for all branches)
• Great thing!
• But creates single jobs
job('my-project-main') {
scm {
git('https://github.com/...')
}
triggers {
scm('H/15 * * * *')
}
publishers {
downstream('my-project-unit')
}
}
Jenkins Pipeline Plugins
16
Jenkins Pipeline Plugins
• Whole suite of plugins (20+), open-sourced a year ago
• Shipped with Jenkins 2.0
• Formerly commercially available by CloudBees, called Workflow
• Define pipeline as code (again Groovy DSL)
stage("Hello") {
...
}
stage("World") {
...
}
17
Pipeline Example
pipeline {
stages {
stage("Build") {
steps {
echo "Starting engines"
}
}
stage("Unit") {
steps {
sh "df -h"
}
}
}
agent any
}
18
Pipeline DSL Steps
• Shellout
• *nix systems: sh
• Windows systems: bat
• SCM
• File handling
sh('make'), sh('rm -rf /')
bat('C:Program Files..')
git('https://github.com/..')
readFile('my.config')
writeFile(file: 'README.md', text: 'Hello World')
fileExists('filename.txt')
19
Pipeline DSL Steps (2)
• Copy workspace to next agent (aka executor/node)
stage('build') {
agent 'build-tool'
steps {
step {
sh('make')
stash('my-workspace')
}
}
}
// continue - - >
stage('release') {
agent 'release-machine'
steps {
step {
unstash('my-workspace')
sh('release')
}
}
}
20
Pipeline DSL Steps (3)
• Build another job:
• Will not go further into detail J
build("jobname")
build("jobname", wait: false, propagate: false)
build(job: 'jobname', parameters: [
[$class: 'StringParameterValue', name: 'target', value: target]
[$class: 'ListSubversionTagsParameterValue', name: 'release', tag: release],
[$class: 'BooleanParameterValue', name: 'update_composer', value:
update_composer.to_boolean()])
21
Even More Pipeline Steps
• Plugins contribute additional steps
• Steps available in this Jenkins instance via
• Online reference: https://jenkins.io/doc/pipeline/steps/
22
User Input?
23
Parameters and Input
• Parametrized build (before build starts) 1
• Input step (during pipeline execution) 2
bonus points for lock, milestone, timeout..
1) see https://st-g.de/2016/12/parametrized-jenkins-pipelines
2) see http://stackoverflow.com/questions/42501553/jenkins-declarative-pipeline-how-to-read-choice-from-input-step
pipeline {
// agent, steps. etc.
parameters {
string(name: 'DEPLOY_ENV', defaultValue: 'TESTING',
description: 'The target environment')
input(message: 'Heyho', parameters: [string(..), ..])
24
Pipeline DSL
• Specify custom environment variables (and access credentials)
• Variables provided by Jenkins
• Control flow (a tiny bit..)
environment {
AWS_ACCESS_KEY_ID = credentials('my-aws-key')
}
sh "echo $AWS_ACCESS_KEY_ID"
sh 'echo $BUILD_NUMBER'
echo env.BUILD_NUMBER
when { branch 'production' { sh 'rm –rf /' } }
25
Full Example Parameterized Build
pipeline {
agent any
parameters {
string(name: 'DEPLOY_ENV', defaultValue: 'TESTING', description: 'Target environment')
choice(name: 'FRUIT', choices: 'applenbanananpizza', description: 'Pick a fruit')
}
stages {
stage('Something') {
steps {
echo "Will deploy to ${params.DEPLOY_ENV}"
writeFile(file: 'fruit.txt', text: params.FRUIT)
echo readFile('fruit.txt')
}
}
}
}
26
Docker
• Run build jobs within Docker containers
• No need to install software on Jenkins master/slave
• Use multiple versions of the same tool
• Containers can be existing ones
or based on Dockerfile
• .. and Kubernetes
agent {
docker {
image 'maven:3-alpine'
}
stages { .. }
}
27
Demo Time!
Picture by annca/ pixabay:
https://pixabay.com/en/popcorn-cinema-ticket-film-1433327/
28
pipeline {
agent any
tools {
maven 'maven-3'
}
// or alternatively:
// agent { docker 'maven:3-alpine' }
stages {
stage('Checkout') {
steps {
git "https://github.com/StephenKing/MAJUG17-jenkins-mvn"
sh 'mvn clean'
}
}
stage('Build') {
steps {
sh 'mvn package -DskipTests'
}
}
stage('Tests') {
steps {
sh 'mvn test'
}
post {
always {
junit 'target/surefire-reports/**/*.xml'
}
}
}
}
post {
always {
archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
}
success {
emailext (
subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
body: """SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at ${env.BUILD_URL}""",
to: 'mail@example.org'
)
}
failure {
emailext (
subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'",
body: """FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at ${env.BUILD_URL}""",
to: 'mail@example.org'
)
}
}
}
29
Declarative What?
• What you've seen now is the brand new stuff (pipeline-model-* v1.1)
• Formerly, there were "scripted pipelines"
• Groovy-based DSL
• Real code à real power
• Sometimes: real pain*
• Both approaches officially supported
*	includes	debugging,	failure	handling,	script	security	/	sandbox,	CPS,	…
30
Scripted Pipeline Example
node {
stage("Foo") {
def data = new groovy.json.JsonSlurper().parseText(readFile('somefile.txt'))
sh "make ${data.options}"
}
stage("Bar") {
try {
sh "make"
} catch (err) {
slackSend message: "Oh dude, didn't workout. ${err}"
error "Things went wrong"
}
}
if (env.BRANCH_NAME == 'master') {
stage("Bar") {
echo "Deploy!!"
}
}
}
31
Scripted Pipeline Execution
• node step allocates executor slot (“heavyweight executor”)
• As other Jenkins jobs
• Filter node by labels (i.e. node('php7'), node('master'))
• Required for heavy lifting
• Avoid many sequential allocations (slows down pipeline progress)
• Code outside of node
• Flyweight executor
• Running on master, "for free”
• Pipeline execution survives Jenkins restarts (CPS)
32
Pipeline Syntax:
Declarative vs. Scripted
• Beginning
• Executor allocation
• Post-build steps, failure handling
• Flow control
see	https://jenkins.io/doc/book/pipeline/syntax/
pipeline { .. } // everything else
agent(docker:'image')
steps { .. }
node('label') { sh .. } // or
docker.image('..').inside{ .. }
post { failure {} always {} } try { sh .. } catch { cry }
when { .. }
script { // groovy script }
// any groovy statement
(node can	be	used	for	declarative	as	well)
33
More on Scripted Pipelines
..in older versions of this talk
https://st-g.de/speaking
Where to put that config?
35
Pipeline Configuration
• Paste code into job config (fine for testing)
(job type: Pipeline)
• Create pipelines via JobDSL
• Commit it to your repo (job type: Multibranch)
• File called Jenkinsfile
• It evolves with the application
• It is versioned
• Everybody can read (and modify) it
• You can throw away your Jenkins master at any time
36
Multibranch & Organization Folder Plugins
• Scans a complete GitHub/Bitbucket organization for Jenkinsfile
• Triggered by Webhook and/or runs periodically
• Automatically adds pipeline jobs per repo/branch/PR
37
DRY: Jenkins Global Library
• Provides shared functionality available for all jobs
• Loaded from remote Git repos
• Specified in global configuration
or on folder-level
• Specified in Jenkinsfile
@Library("https://github.com/..")
node { deployToProd() }
@Library("mylib@v1.2")
node { deployToProd() }
node { deployToProd() }
38
Snipped Editor & Docs
• Because first steps are hard..
• For scripted and declarative pipelines
• Auto-generated DSL documentation
(Pipeline Syntax → Step Reference)
39
(Declarative) Pipeline Editor
Jenkins Pipelines for
Chef Cookbooks
Real-World Example
41
Chef CI/CD at TYPO3.org
• Code that runs the *.typo3.org infrastructure, chef-ci.typo3.org
• Objective: Chef cookbooks
• Server provisioning (installs packages, configures services)
• Code: github.com/TYPO3-cookbooks
42
Many Cookbooks, Many Pipelines
• Scans our GitHub organization TYPO3-cookbooks
• Automatically adds/removes pipelines for branches and pull requests*
• Triggered via Webhooks
• Contents of Jenkinsfile: def pipe = new org.typo3.chefci.v1.Pipeline()
pipe.execute()
* Currently suspicious to arbitrary code execution
43
Jenkins Global Library
• Pipelines implemented in Global Library
TYPO3-infrastructure/jenkins-pipeline-global-library-chefci
44
Parallelize Integration Tests
• Run Test-Kitchen (integration test for Chef cookbooks)
• Run all instances in parallel (by Jenkins)
$ kitchen list
Instance Driver Provisioner [..] Last Action
default-debian-78 Docker ChefZero <Not Created>
default-debian-82 Docker ChefZero <Not Created>
physical-debian-78 Docker ChefZero <Not Created>
physical-debian-82 Docker ChefZero <Not Created>
production-debian-78 Docker ChefZero <Not Created>
production-debian-82 Docker ChefZero <Not Created>
45
Parallelize Integration Tests (2)
• Goal: Extract instance list, run kitchen commands in parallel
• Expected result:
parallel(
'default-debian-82': {
node {
unstash('cookbook-tk')
sh('kitchen test --destroy always default-debian-82')
}
},
'physical-debian-82': {
node {
unstash('cookbook-tk')
sh('kitchen test --destroy always physical-debian-82')
}...
46
Parallelize Integration Tests (3)
• Grab list of instance names
def ArrayList<String> getInstanceNames(){
def instanceNames = []
node {
def lines = sh(script: 'kitchen list', returnStdout: true).split('n')
for (int i = 1; i < lines.size(); i++) {
instanceNames << lines[i].tokenize(' ')[0]
}
}
return instanceNames
}
* Closures don’t always work well within pipeline code (cf. @NonCPS)
47
Parallelize Integration Tests (4)
def Closure getNodeForInstance(String instanceName) {
return {
// this node (one per instance) is later executed in parallel
node {
// restore workspace
unstash('cookbook-tk')
sh('kitchen test --destroy always ' + instanceName)
}}}
for (int i = 0; i < instanceNames.size(); i++) {
def instanceName = instanceNames.get(i)
plNodes[instanceName] = this.getNodeForInstance(instanceName)
}
parallel plNodes
48
Failure Notification
• Pipeline stops, when any step fails
• But.. I want that info in Slack!
def run(Object step){
try {
step.execute()
} catch (err) {
this.postBuildNotify
failTheBuild("Build failed")
}
}
def execute() {
this.prepare()
this.run(new Lint())
this.run(new BerkshelfInstall())
this.run(new TestKitchen())
this.run(new ArchiveArtifacts())
if (env.BRANCH_NAME == "master") {
this.run(new BerkshelfUpload())
}
}
49
50
More Details
https://st-g.de/speaking
51
Summary
• Finally nice pipelines!
• The way to go with Jenkins
• Many Jenkins plugins already compatible
• Pipeline as code!
• Versioned
• Doesn't mess up Jenkins jobs
• Code sharing
• New UI stuff still freaking broken
• Endless possibilities - can be complex and painful*
• Chained pipelines? Yes, but..
*IMHO	still	better	than	YAML
52
Further Reading
• Pipeline Documentation:
https://jenkins.io/doc/book/pipeline/
• Step documentation:
https://jenkins.io/doc/pipeline/steps/
• Pipeline shared libraries:
https://jenkins.io/doc/book/pipeline/shared-libraries/
• Parallel execution:
https://jenkins.io/blog/2016/06/16/parallel-test-executor-plugin/
• Extending pipeline DSL:
https://jenkins.io/blog/2016/04/21/dsl-plugins/
• Controlling the Flow with Stage, Lock, and Milestone:
https://jenkins.io/blog/2016/10/16/stage-lock-milestone/
• TYPO3's Chef CI:
https://chef-ci.typo3.org

More Related Content

What's hot

Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CDHoang Le
 
CI-Jenkins.pptx
CI-Jenkins.pptxCI-Jenkins.pptx
CI-Jenkins.pptxMEDOBEST1
 
Transforming Organizations with CI/CD
Transforming Organizations with CI/CDTransforming Organizations with CI/CD
Transforming Organizations with CI/CDCprime
 
Jenkins for java world
Jenkins for java worldJenkins for java world
Jenkins for java worldAshok Kumar
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins IntroductionPavan Gupta
 
Jenkins 101: Getting Started
Jenkins 101: Getting StartedJenkins 101: Getting Started
Jenkins 101: Getting StartedR Geoffrey Avery
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To JenkinsKnoldus Inc.
 
AWS January 2016 Webinar Series - Introduction to Docker on AWS
AWS January 2016 Webinar Series - Introduction to Docker on AWSAWS January 2016 Webinar Series - Introduction to Docker on AWS
AWS January 2016 Webinar Series - Introduction to Docker on AWSAmazon Web Services
 
Docker introduction (1)
Docker introduction (1)Docker introduction (1)
Docker introduction (1)Gourav Varma
 
Pipeline based deployments on Jenkins
Pipeline based deployments  on JenkinsPipeline based deployments  on Jenkins
Pipeline based deployments on JenkinsKnoldus Inc.
 
Building a CICD pipeline for deploying to containers
Building a CICD pipeline for deploying to containersBuilding a CICD pipeline for deploying to containers
Building a CICD pipeline for deploying to containersAmazon Web Services
 
Continuous Integration With Jenkins
Continuous Integration With JenkinsContinuous Integration With Jenkins
Continuous Integration With JenkinsEdureka!
 

What's hot (20)

Jenkins
JenkinsJenkins
Jenkins
 
Jenkins presentation
Jenkins presentationJenkins presentation
Jenkins presentation
 
Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CD
 
Jenkins-CI
Jenkins-CIJenkins-CI
Jenkins-CI
 
CI-Jenkins.pptx
CI-Jenkins.pptxCI-Jenkins.pptx
CI-Jenkins.pptx
 
Transforming Organizations with CI/CD
Transforming Organizations with CI/CDTransforming Organizations with CI/CD
Transforming Organizations with CI/CD
 
Jenkins for java world
Jenkins for java worldJenkins for java world
Jenkins for java world
 
CICD with Jenkins
CICD with JenkinsCICD with Jenkins
CICD with Jenkins
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins Introduction
 
Jenkins
JenkinsJenkins
Jenkins
 
Jenkins 101: Getting Started
Jenkins 101: Getting StartedJenkins 101: Getting Started
Jenkins 101: Getting Started
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To Jenkins
 
Dev ops using Jenkins
Dev ops using JenkinsDev ops using Jenkins
Dev ops using Jenkins
 
AWS January 2016 Webinar Series - Introduction to Docker on AWS
AWS January 2016 Webinar Series - Introduction to Docker on AWSAWS January 2016 Webinar Series - Introduction to Docker on AWS
AWS January 2016 Webinar Series - Introduction to Docker on AWS
 
Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CD
 
Jenkins CI presentation
Jenkins CI presentationJenkins CI presentation
Jenkins CI presentation
 
Docker introduction (1)
Docker introduction (1)Docker introduction (1)
Docker introduction (1)
 
Pipeline based deployments on Jenkins
Pipeline based deployments  on JenkinsPipeline based deployments  on Jenkins
Pipeline based deployments on Jenkins
 
Building a CICD pipeline for deploying to containers
Building a CICD pipeline for deploying to containersBuilding a CICD pipeline for deploying to containers
Building a CICD pipeline for deploying to containers
 
Continuous Integration With Jenkins
Continuous Integration With JenkinsContinuous Integration With Jenkins
Continuous Integration With Jenkins
 

Similar to (Declarative) Jenkins Pipelines

Atlanta Jenkins Area Meetup October 22nd 2015
Atlanta Jenkins Area Meetup October 22nd 2015Atlanta Jenkins Area Meetup October 22nd 2015
Atlanta Jenkins Area Meetup October 22nd 2015Kurt Madel
 
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins PipelinesAn Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins PipelinesSteffen Gebert
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Longericlongtx
 
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesJenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesAndy Pemberton
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresFrits Van Der Holst
 
Docker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationDocker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationGiacomo Vacca
 
Building an Extensible, Resumable DSL on Top of Apache Groovy
Building an Extensible, Resumable DSL on Top of Apache GroovyBuilding an Extensible, Resumable DSL on Top of Apache Groovy
Building an Extensible, Resumable DSL on Top of Apache Groovyjgcloudbees
 
Continuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerContinuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerChris Adkin
 
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...Docker, Inc.
 
Dockercon EU 2014
Dockercon EU 2014Dockercon EU 2014
Dockercon EU 2014Rafe Colton
 
Continuous Integration & Development with Gitlab
Continuous Integration & Development with GitlabContinuous Integration & Development with Gitlab
Continuous Integration & Development with GitlabAyush Sharma
 
Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101Malcolm Groves
 
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group MeetupOpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group MeetupTobias Schneck
 
Pipeline as code - new feature in Jenkins 2
Pipeline as code - new feature in Jenkins 2Pipeline as code - new feature in Jenkins 2
Pipeline as code - new feature in Jenkins 2Michal Ziarnik
 
DevOPS training - Day 2/2
DevOPS training - Day 2/2DevOPS training - Day 2/2
DevOPS training - Day 2/2Vincent Mercier
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...Eric Smalling
 
Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3kognate
 
CI/CD with Jenkins and Docker - DevOps Meetup Day Thailand
CI/CD with Jenkins and Docker - DevOps Meetup Day ThailandCI/CD with Jenkins and Docker - DevOps Meetup Day Thailand
CI/CD with Jenkins and Docker - DevOps Meetup Day ThailandTroublemaker Khunpech
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'acorehard_by
 

Similar to (Declarative) Jenkins Pipelines (20)

Atlanta Jenkins Area Meetup October 22nd 2015
Atlanta Jenkins Area Meetup October 22nd 2015Atlanta Jenkins Area Meetup October 22nd 2015
Atlanta Jenkins Area Meetup October 22nd 2015
 
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins PipelinesAn Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
An Open-Source Chef Cookbook CI/CD Implementation Using Jenkins Pipelines
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Long
 
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los AngelesJenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
Jenkins Days - Workshop - Let's Build a Pipeline - Los Angeles
 
Moving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventuresMoving from Jenkins 1 to 2 declarative pipeline adventures
Moving from Jenkins 1 to 2 declarative pipeline adventures
 
Docker and Puppet for Continuous Integration
Docker and Puppet for Continuous IntegrationDocker and Puppet for Continuous Integration
Docker and Puppet for Continuous Integration
 
Building an Extensible, Resumable DSL on Top of Apache Groovy
Building an Extensible, Resumable DSL on Top of Apache GroovyBuilding an Extensible, Resumable DSL on Top of Apache Groovy
Building an Extensible, Resumable DSL on Top of Apache Groovy
 
Continuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL ServerContinuous Integration With Jenkins Docker SQL Server
Continuous Integration With Jenkins Docker SQL Server
 
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
The Tale of a Docker-based Continuous Delivery Pipeline by Rafe Colton (ModCl...
 
Dockercon EU 2014
Dockercon EU 2014Dockercon EU 2014
Dockercon EU 2014
 
Continuous Integration & Development with Gitlab
Continuous Integration & Development with GitlabContinuous Integration & Development with Gitlab
Continuous Integration & Development with Gitlab
 
Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101
 
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group MeetupOpenShift Build Pipelines @ Lightweight Java User Group Meetup
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
 
Dev ops meetup
Dev ops meetupDev ops meetup
Dev ops meetup
 
Pipeline as code - new feature in Jenkins 2
Pipeline as code - new feature in Jenkins 2Pipeline as code - new feature in Jenkins 2
Pipeline as code - new feature in Jenkins 2
 
DevOPS training - Day 2/2
DevOPS training - Day 2/2DevOPS training - Day 2/2
DevOPS training - Day 2/2
 
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
IBM Index 2018 Conference Workshop: Modernizing Traditional Java App's with D...
 
Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3Server(less) Swift at SwiftCloudWorkshop 3
Server(less) Swift at SwiftCloudWorkshop 3
 
CI/CD with Jenkins and Docker - DevOps Meetup Day Thailand
CI/CD with Jenkins and Docker - DevOps Meetup Day ThailandCI/CD with Jenkins and Docker - DevOps Meetup Day Thailand
CI/CD with Jenkins and Docker - DevOps Meetup Day Thailand
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'a
 

More from Steffen Gebert

Building an IoT SuperNetwork on top of the AWS Global Infrastructure
Building an IoT SuperNetwork on top of the AWS Global InfrastructureBuilding an IoT SuperNetwork on top of the AWS Global Infrastructure
Building an IoT SuperNetwork on top of the AWS Global InfrastructureSteffen Gebert
 
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...Steffen Gebert
 
Feature Management Platforms
Feature Management PlatformsFeature Management Platforms
Feature Management PlatformsSteffen Gebert
 
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT Devices
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT DevicesServerless Networking - How We Provide Cloud-Native Connectivity for IoT Devices
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT DevicesSteffen Gebert
 
How our Cloudy Mindsets Approached Physical Routers
How our Cloudy Mindsets Approached Physical RoutersHow our Cloudy Mindsets Approached Physical Routers
How our Cloudy Mindsets Approached Physical RoutersSteffen Gebert
 
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)Jenkins vs. AWS CodePipeline (AWS User Group Berlin)
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)Steffen Gebert
 
Jenkins vs. AWS CodePipeline
Jenkins vs. AWS CodePipelineJenkins vs. AWS CodePipeline
Jenkins vs. AWS CodePipelineSteffen Gebert
 
Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0Steffen Gebert
 
Let's go HTTPS-only! - More Than Buying a Certificate
Let's go HTTPS-only! - More Than Buying a CertificateLet's go HTTPS-only! - More Than Buying a Certificate
Let's go HTTPS-only! - More Than Buying a CertificateSteffen Gebert
 
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the Web
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the WebCleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the Web
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the WebSteffen Gebert
 
Investigating the Impact of Network Topology on the Processing Times of SDN C...
Investigating the Impact of Network Topology on the Processing Times of SDN C...Investigating the Impact of Network Topology on the Processing Times of SDN C...
Investigating the Impact of Network Topology on the Processing Times of SDN C...Steffen Gebert
 
SDN interfaces and performance analysis of SDN components
SDN interfaces and performance analysis of SDN componentsSDN interfaces and performance analysis of SDN components
SDN interfaces and performance analysis of SDN componentsSteffen Gebert
 
The Development Infrastructure of the TYPO3 Project
The Development Infrastructure of the TYPO3 ProjectThe Development Infrastructure of the TYPO3 Project
The Development Infrastructure of the TYPO3 ProjectSteffen Gebert
 
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-Entwicklung
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-EntwicklungDer Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-Entwicklung
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-EntwicklungSteffen Gebert
 
Official typo3.org infrastructure &
the TYPO3 Server Admin Team
Official typo3.org infrastructure &
the TYPO3 Server Admin TeamOfficial typo3.org infrastructure &
the TYPO3 Server Admin Team
Official typo3.org infrastructure &
the TYPO3 Server Admin TeamSteffen Gebert
 
Neuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-ProjektNeuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-ProjektSteffen Gebert
 
The TYPO3 Server Admin Team
The TYPO3 Server Admin TeamThe TYPO3 Server Admin Team
The TYPO3 Server Admin TeamSteffen Gebert
 

More from Steffen Gebert (20)

Building an IoT SuperNetwork on top of the AWS Global Infrastructure
Building an IoT SuperNetwork on top of the AWS Global InfrastructureBuilding an IoT SuperNetwork on top of the AWS Global Infrastructure
Building an IoT SuperNetwork on top of the AWS Global Infrastructure
 
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...
Wenn selbst ‘erlaube allen Verkehr von 0.0.0.0/0’ nicht hilft - Verbindungspr...
 
Feature Management Platforms
Feature Management PlatformsFeature Management Platforms
Feature Management Platforms
 
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT Devices
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT DevicesServerless Networking - How We Provide Cloud-Native Connectivity for IoT Devices
Serverless Networking - How We Provide Cloud-Native Connectivity for IoT Devices
 
How our Cloudy Mindsets Approached Physical Routers
How our Cloudy Mindsets Approached Physical RoutersHow our Cloudy Mindsets Approached Physical Routers
How our Cloudy Mindsets Approached Physical Routers
 
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)Jenkins vs. AWS CodePipeline (AWS User Group Berlin)
Jenkins vs. AWS CodePipeline (AWS User Group Berlin)
 
Jenkins vs. AWS CodePipeline
Jenkins vs. AWS CodePipelineJenkins vs. AWS CodePipeline
Jenkins vs. AWS CodePipeline
 
Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
 
Let's go HTTPS-only! - More Than Buying a Certificate
Let's go HTTPS-only! - More Than Buying a CertificateLet's go HTTPS-only! - More Than Buying a Certificate
Let's go HTTPS-only! - More Than Buying a Certificate
 
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the Web
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the WebCleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the Web
Cleaning Up the Dirt of the Nineties - How New Protocols are Modernizing the Web
 
Investigating the Impact of Network Topology on the Processing Times of SDN C...
Investigating the Impact of Network Topology on the Processing Times of SDN C...Investigating the Impact of Network Topology on the Processing Times of SDN C...
Investigating the Impact of Network Topology on the Processing Times of SDN C...
 
SDN interfaces and performance analysis of SDN components
SDN interfaces and performance analysis of SDN componentsSDN interfaces and performance analysis of SDN components
SDN interfaces and performance analysis of SDN components
 
Git Power-Workshop
Git Power-WorkshopGit Power-Workshop
Git Power-Workshop
 
The Development Infrastructure of the TYPO3 Project
The Development Infrastructure of the TYPO3 ProjectThe Development Infrastructure of the TYPO3 Project
The Development Infrastructure of the TYPO3 Project
 
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-Entwicklung
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-EntwicklungDer Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-Entwicklung
Der Weg zu TYPO3 CMS 6.0 und Einblicke in die TYPO3-Entwicklung
 
Official typo3.org infrastructure &
the TYPO3 Server Admin Team
Official typo3.org infrastructure &
the TYPO3 Server Admin TeamOfficial typo3.org infrastructure &
the TYPO3 Server Admin Team
Official typo3.org infrastructure &
the TYPO3 Server Admin Team
 
Neuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-ProjektNeuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-Projekt
 
The TYPO3 Server Admin Team
The TYPO3 Server Admin TeamThe TYPO3 Server Admin Team
The TYPO3 Server Admin Team
 
Gerrit Workshop
Gerrit WorkshopGerrit Workshop
Gerrit Workshop
 

Recently uploaded

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DaySri Ambati
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Recently uploaded (20)

Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo DayH2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
H2O.ai CEO/Founder: Sri Ambati Keynote at Wells Fargo Day
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 

(Declarative) Jenkins Pipelines

  • 1. Declarative Jenkins Pipelines Steffen Gebert Java User Group Mannheim, 15.03.2017 @StGebert on Twitter @StephenKing elsewhere
  • 3. About Me Researcher / PhD Student (Software-based Networks) 2011 - 2016 Core Team Member 2010 - 2013 Server Admin Team Member since 2011 3 Co-Organizer DevOps Meetup Würzburg since 2016
  • 5. 5 Agile Development • Sprints of ~1-4 weeks duration • Result: Product that can be shown/given to customer • Return: Feedback Image credits: Marekventur, Wikimedia, CC-BY-SA-3.0
  • 6. 6 Continuous Delivery • Reduce cycle times (even more) • “How long does it take to release a one-line change?” • Potentially deliverable code with every commit • Automated tests decide about acceptance • You don’t have to release/deploy it, but you could à Continuous Deployment: Deploy every successfully tested commit automatically
  • 7. 7 Pipelines • Every check-in triggers pipeline execution • Feedback to the team in every stage • “Bring the pain forward” • “Fail fast, fail often” • Minimize execution time • Always aware of latest stable release
  • 8. CI & CD Tools
  • 9. 9 CI/CD Tools • On-premise • Jenkins • Thoughtworks Go • Gitlab CI • Pivotal Concourse • Jetbrains TeamCity • SaaS • TravisCI • CircleCI • AppVeyor • Codeship • Visual Studio Team Services
  • 10. 10 Why (I like) Jenkins • Established open source project • On premise installation • Thousands of plugins • Integrates with many tools/services • Tailored to CI/CD
  • 11. 11 History of CI/CD with Jenkins • Downstream Jobs • Job A triggers job B triggers job C triggers job D trig... • If one job fails, fail all • Build Pipeline View
  • 12. But that’s awkward … and what I want instead
  • 13. 13 Configuration as Code • Define jobs/pipelines as code • Avoid point & click • In version control • Can live with the application • Scales better • Example: .travis.yml (from TravisCI) • Similar to GitlabCI language: php services: - redis-server before_script: - composer install script: - ./bin/phpunit -c … notifications: slack: …
  • 14. 14 Code-driven Approaches in Jenkins • Jenkins Job Builder • Python / YAML based, from the OpenStack project • Job DSL plugin • Groovy DSL! (e.g. query Github API and create jobs for all branches) • Great thing! • But creates single jobs job('my-project-main') { scm { git('https://github.com/...') } triggers { scm('H/15 * * * *') } publishers { downstream('my-project-unit') } }
  • 16. 16 Jenkins Pipeline Plugins • Whole suite of plugins (20+), open-sourced a year ago • Shipped with Jenkins 2.0 • Formerly commercially available by CloudBees, called Workflow • Define pipeline as code (again Groovy DSL) stage("Hello") { ... } stage("World") { ... }
  • 17. 17 Pipeline Example pipeline { stages { stage("Build") { steps { echo "Starting engines" } } stage("Unit") { steps { sh "df -h" } } } agent any }
  • 18. 18 Pipeline DSL Steps • Shellout • *nix systems: sh • Windows systems: bat • SCM • File handling sh('make'), sh('rm -rf /') bat('C:Program Files..') git('https://github.com/..') readFile('my.config') writeFile(file: 'README.md', text: 'Hello World') fileExists('filename.txt')
  • 19. 19 Pipeline DSL Steps (2) • Copy workspace to next agent (aka executor/node) stage('build') { agent 'build-tool' steps { step { sh('make') stash('my-workspace') } } } // continue - - > stage('release') { agent 'release-machine' steps { step { unstash('my-workspace') sh('release') } } }
  • 20. 20 Pipeline DSL Steps (3) • Build another job: • Will not go further into detail J build("jobname") build("jobname", wait: false, propagate: false) build(job: 'jobname', parameters: [ [$class: 'StringParameterValue', name: 'target', value: target] [$class: 'ListSubversionTagsParameterValue', name: 'release', tag: release], [$class: 'BooleanParameterValue', name: 'update_composer', value: update_composer.to_boolean()])
  • 21. 21 Even More Pipeline Steps • Plugins contribute additional steps • Steps available in this Jenkins instance via • Online reference: https://jenkins.io/doc/pipeline/steps/
  • 23. 23 Parameters and Input • Parametrized build (before build starts) 1 • Input step (during pipeline execution) 2 bonus points for lock, milestone, timeout.. 1) see https://st-g.de/2016/12/parametrized-jenkins-pipelines 2) see http://stackoverflow.com/questions/42501553/jenkins-declarative-pipeline-how-to-read-choice-from-input-step pipeline { // agent, steps. etc. parameters { string(name: 'DEPLOY_ENV', defaultValue: 'TESTING', description: 'The target environment') input(message: 'Heyho', parameters: [string(..), ..])
  • 24. 24 Pipeline DSL • Specify custom environment variables (and access credentials) • Variables provided by Jenkins • Control flow (a tiny bit..) environment { AWS_ACCESS_KEY_ID = credentials('my-aws-key') } sh "echo $AWS_ACCESS_KEY_ID" sh 'echo $BUILD_NUMBER' echo env.BUILD_NUMBER when { branch 'production' { sh 'rm –rf /' } }
  • 25. 25 Full Example Parameterized Build pipeline { agent any parameters { string(name: 'DEPLOY_ENV', defaultValue: 'TESTING', description: 'Target environment') choice(name: 'FRUIT', choices: 'applenbanananpizza', description: 'Pick a fruit') } stages { stage('Something') { steps { echo "Will deploy to ${params.DEPLOY_ENV}" writeFile(file: 'fruit.txt', text: params.FRUIT) echo readFile('fruit.txt') } } } }
  • 26. 26 Docker • Run build jobs within Docker containers • No need to install software on Jenkins master/slave • Use multiple versions of the same tool • Containers can be existing ones or based on Dockerfile • .. and Kubernetes agent { docker { image 'maven:3-alpine' } stages { .. } }
  • 27. 27 Demo Time! Picture by annca/ pixabay: https://pixabay.com/en/popcorn-cinema-ticket-film-1433327/
  • 28. 28 pipeline { agent any tools { maven 'maven-3' } // or alternatively: // agent { docker 'maven:3-alpine' } stages { stage('Checkout') { steps { git "https://github.com/StephenKing/MAJUG17-jenkins-mvn" sh 'mvn clean' } } stage('Build') { steps { sh 'mvn package -DskipTests' } } stage('Tests') { steps { sh 'mvn test' } post { always { junit 'target/surefire-reports/**/*.xml' } } } } post { always { archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } success { emailext ( subject: "SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", body: """SUCCESSFUL: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at ${env.BUILD_URL}""", to: 'mail@example.org' ) } failure { emailext ( subject: "FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]'", body: """FAILED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]': Check console output at ${env.BUILD_URL}""", to: 'mail@example.org' ) } } }
  • 29. 29 Declarative What? • What you've seen now is the brand new stuff (pipeline-model-* v1.1) • Formerly, there were "scripted pipelines" • Groovy-based DSL • Real code à real power • Sometimes: real pain* • Both approaches officially supported * includes debugging, failure handling, script security / sandbox, CPS, …
  • 30. 30 Scripted Pipeline Example node { stage("Foo") { def data = new groovy.json.JsonSlurper().parseText(readFile('somefile.txt')) sh "make ${data.options}" } stage("Bar") { try { sh "make" } catch (err) { slackSend message: "Oh dude, didn't workout. ${err}" error "Things went wrong" } } if (env.BRANCH_NAME == 'master') { stage("Bar") { echo "Deploy!!" } } }
  • 31. 31 Scripted Pipeline Execution • node step allocates executor slot (“heavyweight executor”) • As other Jenkins jobs • Filter node by labels (i.e. node('php7'), node('master')) • Required for heavy lifting • Avoid many sequential allocations (slows down pipeline progress) • Code outside of node • Flyweight executor • Running on master, "for free” • Pipeline execution survives Jenkins restarts (CPS)
  • 32. 32 Pipeline Syntax: Declarative vs. Scripted • Beginning • Executor allocation • Post-build steps, failure handling • Flow control see https://jenkins.io/doc/book/pipeline/syntax/ pipeline { .. } // everything else agent(docker:'image') steps { .. } node('label') { sh .. } // or docker.image('..').inside{ .. } post { failure {} always {} } try { sh .. } catch { cry } when { .. } script { // groovy script } // any groovy statement (node can be used for declarative as well)
  • 33. 33 More on Scripted Pipelines ..in older versions of this talk https://st-g.de/speaking
  • 34. Where to put that config?
  • 35. 35 Pipeline Configuration • Paste code into job config (fine for testing) (job type: Pipeline) • Create pipelines via JobDSL • Commit it to your repo (job type: Multibranch) • File called Jenkinsfile • It evolves with the application • It is versioned • Everybody can read (and modify) it • You can throw away your Jenkins master at any time
  • 36. 36 Multibranch & Organization Folder Plugins • Scans a complete GitHub/Bitbucket organization for Jenkinsfile • Triggered by Webhook and/or runs periodically • Automatically adds pipeline jobs per repo/branch/PR
  • 37. 37 DRY: Jenkins Global Library • Provides shared functionality available for all jobs • Loaded from remote Git repos • Specified in global configuration or on folder-level • Specified in Jenkinsfile @Library("https://github.com/..") node { deployToProd() } @Library("mylib@v1.2") node { deployToProd() } node { deployToProd() }
  • 38. 38 Snipped Editor & Docs • Because first steps are hard.. • For scripted and declarative pipelines • Auto-generated DSL documentation (Pipeline Syntax → Step Reference)
  • 40. Jenkins Pipelines for Chef Cookbooks Real-World Example
  • 41. 41 Chef CI/CD at TYPO3.org • Code that runs the *.typo3.org infrastructure, chef-ci.typo3.org • Objective: Chef cookbooks • Server provisioning (installs packages, configures services) • Code: github.com/TYPO3-cookbooks
  • 42. 42 Many Cookbooks, Many Pipelines • Scans our GitHub organization TYPO3-cookbooks • Automatically adds/removes pipelines for branches and pull requests* • Triggered via Webhooks • Contents of Jenkinsfile: def pipe = new org.typo3.chefci.v1.Pipeline() pipe.execute() * Currently suspicious to arbitrary code execution
  • 43. 43 Jenkins Global Library • Pipelines implemented in Global Library TYPO3-infrastructure/jenkins-pipeline-global-library-chefci
  • 44. 44 Parallelize Integration Tests • Run Test-Kitchen (integration test for Chef cookbooks) • Run all instances in parallel (by Jenkins) $ kitchen list Instance Driver Provisioner [..] Last Action default-debian-78 Docker ChefZero <Not Created> default-debian-82 Docker ChefZero <Not Created> physical-debian-78 Docker ChefZero <Not Created> physical-debian-82 Docker ChefZero <Not Created> production-debian-78 Docker ChefZero <Not Created> production-debian-82 Docker ChefZero <Not Created>
  • 45. 45 Parallelize Integration Tests (2) • Goal: Extract instance list, run kitchen commands in parallel • Expected result: parallel( 'default-debian-82': { node { unstash('cookbook-tk') sh('kitchen test --destroy always default-debian-82') } }, 'physical-debian-82': { node { unstash('cookbook-tk') sh('kitchen test --destroy always physical-debian-82') }...
  • 46. 46 Parallelize Integration Tests (3) • Grab list of instance names def ArrayList<String> getInstanceNames(){ def instanceNames = [] node { def lines = sh(script: 'kitchen list', returnStdout: true).split('n') for (int i = 1; i < lines.size(); i++) { instanceNames << lines[i].tokenize(' ')[0] } } return instanceNames } * Closures don’t always work well within pipeline code (cf. @NonCPS)
  • 47. 47 Parallelize Integration Tests (4) def Closure getNodeForInstance(String instanceName) { return { // this node (one per instance) is later executed in parallel node { // restore workspace unstash('cookbook-tk') sh('kitchen test --destroy always ' + instanceName) }}} for (int i = 0; i < instanceNames.size(); i++) { def instanceName = instanceNames.get(i) plNodes[instanceName] = this.getNodeForInstance(instanceName) } parallel plNodes
  • 48. 48 Failure Notification • Pipeline stops, when any step fails • But.. I want that info in Slack! def run(Object step){ try { step.execute() } catch (err) { this.postBuildNotify failTheBuild("Build failed") } } def execute() { this.prepare() this.run(new Lint()) this.run(new BerkshelfInstall()) this.run(new TestKitchen()) this.run(new ArchiveArtifacts()) if (env.BRANCH_NAME == "master") { this.run(new BerkshelfUpload()) } }
  • 49. 49
  • 51. 51 Summary • Finally nice pipelines! • The way to go with Jenkins • Many Jenkins plugins already compatible • Pipeline as code! • Versioned • Doesn't mess up Jenkins jobs • Code sharing • New UI stuff still freaking broken • Endless possibilities - can be complex and painful* • Chained pipelines? Yes, but.. *IMHO still better than YAML
  • 52. 52 Further Reading • Pipeline Documentation: https://jenkins.io/doc/book/pipeline/ • Step documentation: https://jenkins.io/doc/pipeline/steps/ • Pipeline shared libraries: https://jenkins.io/doc/book/pipeline/shared-libraries/ • Parallel execution: https://jenkins.io/blog/2016/06/16/parallel-test-executor-plugin/ • Extending pipeline DSL: https://jenkins.io/blog/2016/04/21/dsl-plugins/ • Controlling the Flow with Stage, Lock, and Milestone: https://jenkins.io/blog/2016/10/16/stage-lock-milestone/ • TYPO3's Chef CI: https://chef-ci.typo3.org