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

Getting started with Jenkins
Getting started with JenkinsGetting started with Jenkins
Getting started with JenkinsEdureka!
 
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!
 
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 | EdurekaEdureka!
 
Introduction to CICD
Introduction to CICDIntroduction to CICD
Introduction to CICDKnoldus Inc.
 
Build CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesBuild CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesAmazon Web Services
 
CI and CD with Jenkins
CI and CD with JenkinsCI and CD with Jenkins
CI and CD with JenkinsMartin Málek
 
Pipeline based deployments on Jenkins
Pipeline based deployments  on JenkinsPipeline based deployments  on Jenkins
Pipeline based deployments on JenkinsKnoldus Inc.
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To JenkinsKnoldus Inc.
 
Transforming Organizations with CI/CD
Transforming Organizations with CI/CDTransforming Organizations with CI/CD
Transforming Organizations with CI/CDCprime
 
Achieving CI/CD with Kubernetes
Achieving CI/CD with KubernetesAchieving CI/CD with Kubernetes
Achieving CI/CD with KubernetesRamit Surana
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueVincent Composieux
 
Ansible Introduction
Ansible Introduction Ansible Introduction
Ansible Introduction Robert Reiz
 

What's hot (20)

Getting started with Jenkins
Getting started with JenkinsGetting started with Jenkins
Getting started with Jenkins
 
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...
 
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
 
Introduction to CICD
Introduction to CICDIntroduction to CICD
Introduction to CICD
 
Jenkins tutorial
Jenkins tutorialJenkins tutorial
Jenkins tutorial
 
Jenkins CI
Jenkins CIJenkins CI
Jenkins CI
 
CICD with Jenkins
CICD with JenkinsCICD with Jenkins
CICD with Jenkins
 
Build CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation SlidesBuild CICD Pipeline for Container Presentation Slides
Build CICD Pipeline for Container Presentation Slides
 
Jenkins Overview
Jenkins OverviewJenkins Overview
Jenkins Overview
 
Jenkins presentation
Jenkins presentationJenkins presentation
Jenkins presentation
 
CI and CD with Jenkins
CI and CD with JenkinsCI and CD with Jenkins
CI and CD with Jenkins
 
Docker & kubernetes
Docker & kubernetesDocker & kubernetes
Docker & kubernetes
 
Pipeline based deployments on Jenkins
Pipeline based deployments  on JenkinsPipeline based deployments  on Jenkins
Pipeline based deployments on Jenkins
 
An Introduction To Jenkins
An Introduction To JenkinsAn Introduction To Jenkins
An Introduction To Jenkins
 
Transforming Organizations with CI/CD
Transforming Organizations with CI/CDTransforming Organizations with CI/CD
Transforming Organizations with CI/CD
 
Achieving CI/CD with Kubernetes
Achieving CI/CD with KubernetesAchieving CI/CD with Kubernetes
Achieving CI/CD with Kubernetes
 
Dev ops using Jenkins
Dev ops using JenkinsDev ops using Jenkins
Dev ops using Jenkins
 
Jenkins tutorial
Jenkins tutorialJenkins tutorial
Jenkins tutorial
 
Gitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement ContinueGitlab CI : Integration et Déploiement Continue
Gitlab CI : Integration et Déploiement Continue
 
Ansible Introduction
Ansible Introduction Ansible Introduction
Ansible Introduction
 

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

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxOnBoard
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure servicePooja Nehwal
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
 

Recently uploaded (20)

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Maximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptxMaximizing Board Effectiveness 2024 Webinar.pptx
Maximizing Board Effectiveness 2024 Webinar.pptx
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure serviceWhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
WhatsApp 9892124323 ✓Call Girls In Kalyan ( Mumbai ) secure service
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
 

(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