SlideShare a Scribd company logo
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
Ad

More Related Content

What's hot (20)

Gitlab ci-cd
Gitlab ci-cdGitlab ci-cd
Gitlab ci-cd
Dan MAGIER
 
Jenkins CI presentation
Jenkins CI presentationJenkins CI presentation
Jenkins CI presentation
Jonathan Holloway
 
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Simplilearn
 
Introduction to jenkins
Introduction to jenkinsIntroduction to jenkins
Introduction to jenkins
Abe Diaz
 
Devops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabDevops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at Gitlab
Filipa Lacerda
 
What is Jenkins | Jenkins Tutorial for Beginners | Edureka
What is Jenkins | Jenkins Tutorial for Beginners | EdurekaWhat is Jenkins | Jenkins Tutorial for Beginners | Edureka
What is Jenkins | Jenkins Tutorial for Beginners | Edureka
Edureka!
 
CI/CD
CI/CDCI/CD
CI/CD
AmitDhodi
 
Jenkins Tutorial.pdf
Jenkins Tutorial.pdfJenkins Tutorial.pdf
Jenkins Tutorial.pdf
devtestervicky
 
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Edureka!
 
Docker and Kubernetes 101 workshop
Docker and Kubernetes 101 workshopDocker and Kubernetes 101 workshop
Docker and Kubernetes 101 workshop
Sathish VJ
 
Jenkins tutorial
Jenkins tutorialJenkins tutorial
Jenkins tutorial
HarikaReddy115
 
Gitlab CI/CD
Gitlab CI/CDGitlab CI/CD
Gitlab CI/CD
JEMLI Fathi
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins Introduction
Pavan Gupta
 
Introduction to CI/CD
Introduction to CI/CDIntroduction to CI/CD
Introduction to CI/CD
Steve Mactaggart
 
Difference between Github vs Gitlab vs Bitbucket
Difference between Github vs Gitlab vs BitbucketDifference between Github vs Gitlab vs Bitbucket
Difference between Github vs Gitlab vs Bitbucket
jeetendra mandal
 
Introducing GitLab (June 2018)
Introducing GitLab (June 2018)Introducing GitLab (June 2018)
Introducing GitLab (June 2018)
Noa Harel
 
Docker.pptx
Docker.pptxDocker.pptx
Docker.pptx
balaji257
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
Knoldus Inc.
 
Maven Introduction
Maven IntroductionMaven Introduction
Maven Introduction
Sandeep Chawla
 
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
Edureka!
 
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Jenkins Pipeline Tutorial | Jenkins Build And Delivery Pipeline | Jenkins Tut...
Simplilearn
 
Introduction to jenkins
Introduction to jenkinsIntroduction to jenkins
Introduction to jenkins
Abe Diaz
 
Devops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at GitlabDevops Porto - CI/CD at Gitlab
Devops Porto - CI/CD at Gitlab
Filipa Lacerda
 
What is Jenkins | Jenkins Tutorial for Beginners | Edureka
What is Jenkins | Jenkins Tutorial for Beginners | EdurekaWhat is Jenkins | Jenkins Tutorial for Beginners | Edureka
What is Jenkins | Jenkins Tutorial for Beginners | Edureka
Edureka!
 
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Jenkins Pipeline Tutorial | Continuous Delivery Pipeline Using Jenkins | DevO...
Edureka!
 
Docker and Kubernetes 101 workshop
Docker and Kubernetes 101 workshopDocker and Kubernetes 101 workshop
Docker and Kubernetes 101 workshop
Sathish VJ
 
Jenkins Introduction
Jenkins IntroductionJenkins Introduction
Jenkins Introduction
Pavan Gupta
 
Difference between Github vs Gitlab vs Bitbucket
Difference between Github vs Gitlab vs BitbucketDifference between Github vs Gitlab vs Bitbucket
Difference between Github vs Gitlab vs Bitbucket
jeetendra mandal
 
Introducing GitLab (June 2018)
Introducing GitLab (June 2018)Introducing GitLab (June 2018)
Introducing GitLab (June 2018)
Noa Harel
 
Introduction to GitHub Actions
Introduction to GitHub ActionsIntroduction to GitHub Actions
Introduction to GitHub Actions
Knoldus Inc.
 
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
CI CD Pipeline Using Jenkins | Continuous Integration and Deployment | DevOps...
Edureka!
 

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
Kurt 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 Pipelines
Steffen Gebert
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Long
ericlongtx
 
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
Andy 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 adventures
Frits 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 Integration
Giacomo 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 Groovy
jgcloudbees
 
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
Chris 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 2014
Rafe Colton
 
Continuous Integration & Development with Gitlab
Continuous Integration & Development with GitlabContinuous Integration & Development with Gitlab
Continuous Integration & Development with Gitlab
Ayush Sharma
 
Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101
Malcolm 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 Meetup
Tobias Schneck
 
Dev ops meetup
Dev ops meetupDev ops meetup
Dev ops meetup
Bigdata Meetup Kochi
 
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
Michal Ziarnik
 
DevOPS training - Day 2/2
DevOPS training - Day 2/2DevOPS training - Day 2/2
DevOPS training - Day 2/2
Vincent 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 3
kognate
 
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
Troublemaker Khunpech
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'a
corehard_by
 
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
Kurt 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 Pipelines
Steffen Gebert
 
Jenkins days workshop pipelines - Eric Long
Jenkins days workshop  pipelines - Eric LongJenkins days workshop  pipelines - Eric Long
Jenkins days workshop pipelines - Eric Long
ericlongtx
 
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
Andy 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 adventures
Frits 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 Integration
Giacomo 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 Groovy
jgcloudbees
 
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
Chris 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 2014
Rafe Colton
 
Continuous Integration & Development with Gitlab
Continuous Integration & Development with GitlabContinuous Integration & Development with Gitlab
Continuous Integration & Development with Gitlab
Ayush Sharma
 
Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101Jenkins Declarative Pipelines 101
Jenkins Declarative Pipelines 101
Malcolm 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 Meetup
Tobias 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 2
Michal Ziarnik
 
DevOPS training - Day 2/2
DevOPS training - Day 2/2DevOPS training - Day 2/2
DevOPS training - Day 2/2
Vincent 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 3
kognate
 
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
Troublemaker Khunpech
 
Настройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'aНастройка окружения для кросскомпиляции проектов на основе docker'a
Настройка окружения для кросскомпиляции проектов на основе docker'a
corehard_by
 
Ad

More from Steffen Gebert (20)

Please Give Me Back My Network Cables! On Networking Limits in AWS
Please Give Me Back My Network Cables! On Networking Limits in AWSPlease Give Me Back My Network Cables! On Networking Limits in AWS
Please Give Me Back My Network Cables! On Networking Limits in AWS
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 Infrastructure
Steffen 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 Platforms
Steffen 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 Devices
Steffen 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 Routers
Steffen 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 CodePipeline
Steffen Gebert
 
Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0
Steffen Gebert
 
Continuous Delivery
Continuous DeliveryContinuous Delivery
Continuous Delivery
Steffen 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 Certificate
Steffen 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 Web
Steffen 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 components
Steffen Gebert
 
Git Power-Workshop
Git Power-WorkshopGit Power-Workshop
Git Power-Workshop
Steffen 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 Project
Steffen 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-Entwicklung
Steffen 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 Team
Steffen Gebert
 
Neuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-ProjektNeuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-Projekt
Steffen Gebert
 
The TYPO3 Server Admin Team
The TYPO3 Server Admin TeamThe TYPO3 Server Admin Team
The TYPO3 Server Admin Team
Steffen Gebert
 
Please Give Me Back My Network Cables! On Networking Limits in AWS
Please Give Me Back My Network Cables! On Networking Limits in AWSPlease Give Me Back My Network Cables! On Networking Limits in AWS
Please Give Me Back My Network Cables! On Networking Limits in AWS
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 Infrastructure
Steffen 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 Platforms
Steffen 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 Devices
Steffen 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 Routers
Steffen 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 CodePipeline
Steffen Gebert
 
Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0Monitoring Akka with Kamon 1.0
Monitoring Akka with Kamon 1.0
Steffen 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 Certificate
Steffen 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 Web
Steffen 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 components
Steffen 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 Project
Steffen 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-Entwicklung
Steffen 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 Team
Steffen Gebert
 
Neuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-ProjektNeuigkeiten aus dem TYPO3-Projekt
Neuigkeiten aus dem TYPO3-Projekt
Steffen Gebert
 
The TYPO3 Server Admin Team
The TYPO3 Server Admin TeamThe TYPO3 Server Admin Team
The TYPO3 Server Admin Team
Steffen Gebert
 
Ad

Recently uploaded (20)

SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Generative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in BusinessGenerative Artificial Intelligence (GenAI) in Business
Generative Artificial Intelligence (GenAI) in Business
Dr. Tathagat Varma
 
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc Webinar: Consumer Expectations vs Corporate Realities on Data Broker...
TrustArc
 
Technology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data AnalyticsTechnology Trends in 2025: AI and Big Data Analytics
Technology Trends in 2025: AI and Big Data Analytics
InData Labs
 
tecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdftecnologias de las primeras civilizaciones.pdf
tecnologias de las primeras civilizaciones.pdf
fjgm517
 
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes Partner Innovation Updates for May 2025
ThousandEyes
 
How analogue intelligence complements AI
How analogue intelligence complements AIHow analogue intelligence complements AI
How analogue intelligence complements AI
Paul Rowe
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Build Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For DevsBuild Your Own Copilot & Agents For Devs
Build Your Own Copilot & Agents For Devs
Brian McKeiver
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdfThe Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
The Evolution of Meme Coins A New Era for Digital Currency ppt.pdf
Abi john
 
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptxDevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
DevOpsDays Atlanta 2025 - Building 10x Development Organizations.pptx
Justin Reock
 
AI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global TrendsAI and Data Privacy in 2025: Global Trends
AI and Data Privacy in 2025: Global Trends
InData Labs
 
Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025Splunk Security Update | Public Sector Summit Germany 2025
Splunk Security Update | Public Sector Summit Germany 2025
Splunk
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.Greenhouse_Monitoring_Presentation.pptx.
Greenhouse_Monitoring_Presentation.pptx.
hpbmnnxrvb
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 

(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: '[email protected]' ) } 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: '[email protected]' ) } } }
  • 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("[email protected]") 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