SlideShare a Scribd company logo
1 of 29
Download to read offline
Configuration as Code
Adoption of the Job DSL Plugin at Netflix

Justin Ryan <jryan@netflix.com>
@quidryan
http://www.slideshare.net/quidryan
Who Are We
• Engineering Tools
• Justin Ryan / jryan@netflix.com / @quidryan
• Curt Patrick / cpatrick@netflix.com
• Freedom & Responsibility
Situation
• No single flow that builds everything
• Every team has their own jobs
• Each branch needs multiple jobs
Problem
• Lots of copying of jobs
• Subtle fields hidden in Advanced button
• No ability to mimic another team
• Change in UI can be slow
Alternatives
• Template Project Plugin from Cloudbees
• Job Generator Plugin
• Literate Plugin
• etc...
Infrastructure As Code
“The end goal of infrastructure as code is to
perform as many infrastructure tasks as possible
programmatically. Key word is automation."

(http://www.somic.org/2012/09/28/concise-introduction-to-infrastructure-as-code/)
Configuration As Code
• Netflix - We understand the value of scaling and
automation

• Jobs should be responsible citizens
• Team can own their scripts
Job DSL Plugin
• Create a Free-form project
• Add a “Process Job DSL” build step
• Enter Groovy script using a Jenkins DSL
• Run job
Step 2. Add Build Step
Step 3. Specify Script
Step 4. Run
Job DSL Language
• Groovy
• One additional method, “job”
• Documentation in Github Wiki
• https://github.com/jenkinsci/job-dsl-plugin/wiki
• Job DSL Commands
• Job Reference Page
Single Job from Github
job {
name "RxJava-Test”
 scm {
  github(“git@github.com:Netflix/RxJava.git”)
 }
 steps {
  gradle("test")
 }
}
Leveraging Groovy
import groovy.json.JsonSlurper
def project = 'quidryan/aws-sdk-test'
def github = 'https://api.github.com'
def api = new URL("${github}/repos/${project}/branches")
def branches = new JsonSlurper().parse(api.newReader())
branches.each {
   def branchName = it.name
   job {
       name "${project}-${branchName}".replaceAll('/','-')
       scm {
           git("git://github.com/${project}.git", branchName)
       }
       steps {
           maven("test -Dproject.name=${project}/${branchName}")
       }
   }
}
Disadvantages	
• Learning Curve
• Can get complicated
• Not all plugins exist
• Possible problems with plugin version skew
The Project
• 408 installs at last check
• Active Google Group, with 78 members
• Regular Google Hangout
• Constant stream of contributors
• Core contributors - myself, Daniel Spilker, Stefan Wolf,
Andrew Harmel-Law
Use Case - Opower
“Grab json blobs, which define pipeline, from an
internal Rails app then loop through with Job
DSL. I now have only one job to set up manually.
So, in theory, I set up one job and I end up with
600 jobs. Throw each set into a folder and
you've got yourself a red/green dashboard.”
James Levinson <james.levinson@opower.com>
Use Case - Chicago Trading
“I use the Job DSL to create gerrit build and
release build jobs, parameterized on the  git
repository. Then I use the Build Flow plugin to
orchestrate those jobs”
Alan Beale <alan.beale@chicagotrading.com>
Netflix Conventions
• Utilities methods to create common jobs
• Groovy Category to enhance “job” object
• Published as a jar
Merge Jobs
import netflix.Merge
Merge.nfMergeJobs( [jobFactory: this, securityGroup: ‘nbs’,
   base: '//depot/IT_Engineering/NBS/nbsrules',
   projectPrefix: 'BILLING-rules'] )
Merge.nfMergeJobs( [jobFactory: this, securityGroup: ‘nbs’,
   base: '//depot/IT_Engineering/NBS/Phoenix',
   projectPrefix: 'BILLING-phoenix'] )
Merge Jobs
• BILLING-rules-dev-force-to-test
• BILLING-rules-test-force-to-prod
• BILLING-rules-prod-merge-to-test
• BILLING-rules-test-force-to-dev
• BILLING-phoenix-dev-force-to-test
• BILLING-phoenix-test-force-to-prod
• BILLING-phoenix-prod-merge-to-test
• BILLING-phoenix-test-force-to-dev
Jobs as Objects
import netflix.*
def defaults = [...]
def jobs = [‘dev’,’test’,’prod’].collectMany {[
CBFQuickBuild(defaults + [branch:branch]),
CBFQualityBuild(defaults + [branch:branch]),
nfBakeJob(defaults + [branch:branch])
]}
jobs.each {
   it.publishers {
       extendedEmail('jryan@netflix.com', 'Oops') {
           trigger(triggerName: 'StillUnstable',
subject: 'Subject',
recipientList:'RecipientList',
               
sendToDevelopers: true,
sendToRequester: true,
includeCulprits: true,
sendToRecipientList: false)
   }
}
Extra features
• Environment variables
• Queue jobs to run
• Read files workspace
• Configure blocks
• @Grab
• @Category
@Category
use(netflix.Conventions) {
def myjob = job {
name ‘BuildFromP4’
}
 myjob.addPerforce("//depot/webapps/astrid/...")
}
Good Practice
• Respect “source of truth”
• All scripts go in version control
• Use configure block if needed
• Trigger “seed” job on SCM changes
Future of project
• Plugins provide DSL methods
• Produce DSL from real job
• Support for utility classes
• Produce jobs from build, e.g. Gradle or Maven
Jenkins User Conference

Palo Alto , Oct 23 2013

Thank You To Our Sponsors
Platinum

Gold

Silver

#jenkinsconf
Thank You
We’re hiring.

Justin Ryan <jryan@netflix.com>
@quidryan
http://www.slideshare.net/quidryan

More Related Content

What's hot

What's hot (20)

GCP CloudRun Overview
GCP CloudRun OverviewGCP CloudRun Overview
GCP CloudRun Overview
 
하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료하이퍼레저 패브릭 실습자료
하이퍼레저 패브릭 실습자료
 
Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법Docker란 무엇인가? : Docker 기본 사용법
Docker란 무엇인가? : Docker 기본 사용법
 
How to test infrastructure code: automated testing for Terraform, Kubernetes,...
How to test infrastructure code: automated testing for Terraform, Kubernetes,...How to test infrastructure code: automated testing for Terraform, Kubernetes,...
How to test infrastructure code: automated testing for Terraform, Kubernetes,...
 
Dockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクルDockerイメージの理解とコンテナのライフサイクル
Dockerイメージの理解とコンテナのライフサイクル
 
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdfわたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
わたくし、やっぱりCDKを使いたいですわ〜CDK import編〜.pdf
 
Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...Best Practices for Middleware and Integration Architecture Modernization with...
Best Practices for Middleware and Integration Architecture Modernization with...
 
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
Node.js x Headless Chrome for WeRTC MCU / Node.js x Chrome headless で、お手軽WebR...
 
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
코드 리뷰의 또 다른 접근 방법: Pull Requests vs. Stacked Changes
 
A Hands-on Introduction on Terraform Best Concepts and Best Practices
A Hands-on Introduction on Terraform Best Concepts and Best Practices A Hands-on Introduction on Terraform Best Concepts and Best Practices
A Hands-on Introduction on Terraform Best Concepts and Best Practices
 
AWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすかAWS Batch Fargate対応は何をもたらすか
AWS Batch Fargate対応は何をもたらすか
 
Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현Knative로 서버리스 워크로드 구현
Knative로 서버리스 워크로드 구현
 
Infrastructure-as-Code with Pulumi - Better than all the others (like Ansible)?
Infrastructure-as-Code with Pulumi- Better than all the others (like Ansible)?Infrastructure-as-Code with Pulumi- Better than all the others (like Ansible)?
Infrastructure-as-Code with Pulumi - Better than all the others (like Ansible)?
 
React JS part 1
React JS part 1React JS part 1
React JS part 1
 
우아한 모노리스
우아한 모노리스우아한 모노리스
우아한 모노리스
 
Kubernetes Architecture - beyond a black box - Part 1
Kubernetes Architecture - beyond a black box - Part 1Kubernetes Architecture - beyond a black box - Part 1
Kubernetes Architecture - beyond a black box - Part 1
 
Docker実践入門
Docker実践入門Docker実践入門
Docker実践入門
 
React js t2 - jsx
React js   t2 - jsxReact js   t2 - jsx
React js t2 - jsx
 
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
왜 쿠버네티스는 systemd로 cgroup을 관리하려고 할까요
 
클라우드의 대세 쿠버네티스란 무엇인가?(윤성훈 클라우드 솔루션 아키텍트) - Webinar
클라우드의 대세 쿠버네티스란 무엇인가?(윤성훈 클라우드 솔루션 아키텍트) - Webinar클라우드의 대세 쿠버네티스란 무엇인가?(윤성훈 클라우드 솔루션 아키텍트) - Webinar
클라우드의 대세 쿠버네티스란 무엇인가?(윤성훈 클라우드 솔루션 아키텍트) - Webinar
 

Viewers also liked

Viewers also liked (10)

DevOps Practices: Configuration as Code
DevOps Practices:Configuration as CodeDevOps Practices:Configuration as Code
DevOps Practices: Configuration as Code
 
Microsoft Azureの機械学習サービス (Azure Machine Learning/Microsoft Cognitive Services)
Microsoft Azureの機械学習サービス (Azure Machine Learning/Microsoft Cognitive Services)Microsoft Azureの機械学習サービス (Azure Machine Learning/Microsoft Cognitive Services)
Microsoft Azureの機械学習サービス (Azure Machine Learning/Microsoft Cognitive Services)
 
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
自動化を支えるCI/CDツールの私の選択 ~何をするためにCI/CDツールを選ぶか~
 
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Codeクラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
クラウドを活用したシステム開発における、ネットワークのInfrastructure as Code
 
なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423
なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423
なぜソフトウェアアーキテクトが必要なのか - Devlove 20110423
 
みんなのTerraformで AWSをテラフォーミングさせるぜ
みんなのTerraformで AWSをテラフォーミングさせるぜみんなのTerraformで AWSをテラフォーミングさせるぜ
みんなのTerraformで AWSをテラフォーミングさせるぜ
 
スマホ版ログレスにポストエフェクトシステムを導入した話
スマホ版ログレスにポストエフェクトシステムを導入した話スマホ版ログレスにポストエフェクトシステムを導入した話
スマホ版ログレスにポストエフェクトシステムを導入した話
 
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
スマホ版ログレスでグローバル展開を想定したサーバ構築をAnsibleで試してみた話
 
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
新規事業が対峙する現実からエンジニアリングを俯瞰する #devsumiB #devsumi
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 

Similar to Configuration As Code - Adoption of the Job DSL Plugin at Netflix

Make Mobile Apps Quickly
Make Mobile Apps QuicklyMake Mobile Apps Quickly
Make Mobile Apps Quickly
Gil Irizarry
 
Evolving Services Into A Cloud Native World
Evolving Services Into A Cloud Native WorldEvolving Services Into A Cloud Native World
Evolving Services Into A Cloud Native World
Iain Hull
 
Dev ops lessons learned - Michael Collins
Dev ops lessons learned  - Michael CollinsDev ops lessons learned  - Michael Collins
Dev ops lessons learned - Michael Collins
Devopsdays
 

Similar to Configuration As Code - Adoption of the Job DSL Plugin at Netflix (20)

Make Mobile Apps Quickly
Make Mobile Apps QuicklyMake Mobile Apps Quickly
Make Mobile Apps Quickly
 
IBM and Node.js - Old Doge, New Tricks
IBM and Node.js - Old Doge, New TricksIBM and Node.js - Old Doge, New Tricks
IBM and Node.js - Old Doge, New Tricks
 
Make Cross-platform Mobile Apps Quickly - SIGGRAPH 2014
Make Cross-platform Mobile Apps Quickly - SIGGRAPH 2014Make Cross-platform Mobile Apps Quickly - SIGGRAPH 2014
Make Cross-platform Mobile Apps Quickly - SIGGRAPH 2014
 
Exploring Next Generation Buildpacks - Anand Rao & Scott Deeg
Exploring Next Generation Buildpacks - Anand Rao & Scott DeegExploring Next Generation Buildpacks - Anand Rao & Scott Deeg
Exploring Next Generation Buildpacks - Anand Rao & Scott Deeg
 
Untangling - fall2017 - week 9
Untangling - fall2017 - week 9Untangling - fall2017 - week 9
Untangling - fall2017 - week 9
 
Surrogate dependencies (in node js) v1.0
Surrogate dependencies  (in node js)  v1.0Surrogate dependencies  (in node js)  v1.0
Surrogate dependencies (in node js) v1.0
 
Web Components: The Future of Web Development is Here
Web Components: The Future of Web Development is HereWeb Components: The Future of Web Development is Here
Web Components: The Future of Web Development is Here
 
Evolving Services Into A Cloud Native World
Evolving Services Into A Cloud Native WorldEvolving Services Into A Cloud Native World
Evolving Services Into A Cloud Native World
 
Job DSL Plugin for Jenkins
Job DSL Plugin for JenkinsJob DSL Plugin for Jenkins
Job DSL Plugin for Jenkins
 
Measure and Increase Developer Productivity with Help of Serverless at AWS Co...
Measure and Increase Developer Productivity with Help of Serverless at AWS Co...Measure and Increase Developer Productivity with Help of Serverless at AWS Co...
Measure and Increase Developer Productivity with Help of Serverless at AWS Co...
 
Angular Ivy- An Overview
Angular Ivy- An OverviewAngular Ivy- An Overview
Angular Ivy- An Overview
 
Building production-quality apps with Node.js
Building production-quality apps with Node.jsBuilding production-quality apps with Node.js
Building production-quality apps with Node.js
 
Ensuring Design Standards with Web Components
Ensuring Design Standards with Web ComponentsEnsuring Design Standards with Web Components
Ensuring Design Standards with Web Components
 
Dev ops lessons learned - Michael Collins
Dev ops lessons learned  - Michael CollinsDev ops lessons learned  - Michael Collins
Dev ops lessons learned - Michael Collins
 
The Developers World
The Developers WorldThe Developers World
The Developers World
 
Infrastructure automation-in-the-cloud-130613045624-phpapp02
Infrastructure automation-in-the-cloud-130613045624-phpapp02Infrastructure automation-in-the-cloud-130613045624-phpapp02
Infrastructure automation-in-the-cloud-130613045624-phpapp02
 
Introduction to Node.js
Introduction to Node.jsIntroduction to Node.js
Introduction to Node.js
 
React.js at Cortex
React.js at CortexReact.js at Cortex
React.js at Cortex
 
ASP .Net Core SPA Templates
ASP .Net Core SPA TemplatesASP .Net Core SPA Templates
ASP .Net Core SPA Templates
 
Measure and Increase Developer Productivity with Help of Serverless at JCON 2...
Measure and Increase Developer Productivity with Help of Serverless at JCON 2...Measure and Increase Developer Productivity with Help of Serverless at JCON 2...
Measure and Increase Developer Productivity with Help of Serverless at JCON 2...
 

Recently uploaded

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
vu2urc
 

Recently uploaded (20)

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
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
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...
 
2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...2024: Domino Containers - The Next Step. News from the Domino Container commu...
2024: Domino Containers - The Next Step. News from the Domino Container commu...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
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
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdfThe Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
The Role of Taxonomy and Ontology in Semantic Layers - Heather Hedden.pdf
 

Configuration As Code - Adoption of the Job DSL Plugin at Netflix

  • 1. Configuration as Code Adoption of the Job DSL Plugin at Netflix Justin Ryan <jryan@netflix.com> @quidryan http://www.slideshare.net/quidryan
  • 2. Who Are We • Engineering Tools • Justin Ryan / jryan@netflix.com / @quidryan • Curt Patrick / cpatrick@netflix.com • Freedom & Responsibility
  • 3. Situation • No single flow that builds everything • Every team has their own jobs • Each branch needs multiple jobs
  • 4. Problem • Lots of copying of jobs • Subtle fields hidden in Advanced button • No ability to mimic another team • Change in UI can be slow
  • 5. Alternatives • Template Project Plugin from Cloudbees • Job Generator Plugin • Literate Plugin • etc...
  • 6. Infrastructure As Code “The end goal of infrastructure as code is to perform as many infrastructure tasks as possible programmatically. Key word is automation." (http://www.somic.org/2012/09/28/concise-introduction-to-infrastructure-as-code/)
  • 7. Configuration As Code • Netflix - We understand the value of scaling and automation • Jobs should be responsible citizens • Team can own their scripts
  • 8. Job DSL Plugin • Create a Free-form project • Add a “Process Job DSL” build step • Enter Groovy script using a Jenkins DSL • Run job
  • 9. Step 2. Add Build Step
  • 10. Step 3. Specify Script
  • 12. Job DSL Language • Groovy • One additional method, “job” • Documentation in Github Wiki • https://github.com/jenkinsci/job-dsl-plugin/wiki • Job DSL Commands • Job Reference Page
  • 13. Single Job from Github job { name "RxJava-Test”  scm {   github(“git@github.com:Netflix/RxJava.git”)  }  steps {   gradle("test")  } }
  • 14. Leveraging Groovy import groovy.json.JsonSlurper def project = 'quidryan/aws-sdk-test' def github = 'https://api.github.com' def api = new URL("${github}/repos/${project}/branches") def branches = new JsonSlurper().parse(api.newReader()) branches.each {    def branchName = it.name    job {        name "${project}-${branchName}".replaceAll('/','-')        scm {            git("git://github.com/${project}.git", branchName)        }        steps {            maven("test -Dproject.name=${project}/${branchName}")        }    } }
  • 15. Disadvantages • Learning Curve • Can get complicated • Not all plugins exist • Possible problems with plugin version skew
  • 16. The Project • 408 installs at last check • Active Google Group, with 78 members • Regular Google Hangout • Constant stream of contributors • Core contributors - myself, Daniel Spilker, Stefan Wolf, Andrew Harmel-Law
  • 17. Use Case - Opower “Grab json blobs, which define pipeline, from an internal Rails app then loop through with Job DSL. I now have only one job to set up manually. So, in theory, I set up one job and I end up with 600 jobs. Throw each set into a folder and you've got yourself a red/green dashboard.” James Levinson <james.levinson@opower.com>
  • 18.
  • 19. Use Case - Chicago Trading “I use the Job DSL to create gerrit build and release build jobs, parameterized on the  git repository. Then I use the Build Flow plugin to orchestrate those jobs” Alan Beale <alan.beale@chicagotrading.com>
  • 20. Netflix Conventions • Utilities methods to create common jobs • Groovy Category to enhance “job” object • Published as a jar
  • 21. Merge Jobs import netflix.Merge Merge.nfMergeJobs( [jobFactory: this, securityGroup: ‘nbs’,    base: '//depot/IT_Engineering/NBS/nbsrules',    projectPrefix: 'BILLING-rules'] ) Merge.nfMergeJobs( [jobFactory: this, securityGroup: ‘nbs’,    base: '//depot/IT_Engineering/NBS/Phoenix',    projectPrefix: 'BILLING-phoenix'] )
  • 22. Merge Jobs • BILLING-rules-dev-force-to-test • BILLING-rules-test-force-to-prod • BILLING-rules-prod-merge-to-test • BILLING-rules-test-force-to-dev • BILLING-phoenix-dev-force-to-test • BILLING-phoenix-test-force-to-prod • BILLING-phoenix-prod-merge-to-test • BILLING-phoenix-test-force-to-dev
  • 23. Jobs as Objects import netflix.* def defaults = [...] def jobs = [‘dev’,’test’,’prod’].collectMany {[ CBFQuickBuild(defaults + [branch:branch]), CBFQualityBuild(defaults + [branch:branch]), nfBakeJob(defaults + [branch:branch]) ]} jobs.each {    it.publishers {        extendedEmail('jryan@netflix.com', 'Oops') {            trigger(triggerName: 'StillUnstable', subject: 'Subject', recipientList:'RecipientList',                 sendToDevelopers: true, sendToRequester: true, includeCulprits: true, sendToRecipientList: false)    } }
  • 24. Extra features • Environment variables • Queue jobs to run • Read files workspace • Configure blocks • @Grab • @Category
  • 25. @Category use(netflix.Conventions) { def myjob = job { name ‘BuildFromP4’ }  myjob.addPerforce("//depot/webapps/astrid/...") }
  • 26. Good Practice • Respect “source of truth” • All scripts go in version control • Use configure block if needed • Trigger “seed” job on SCM changes
  • 27. Future of project • Plugins provide DSL methods • Produce DSL from real job • Support for utility classes • Produce jobs from build, e.g. Gradle or Maven
  • 28. Jenkins User Conference Palo Alto , Oct 23 2013 Thank You To Our Sponsors Platinum Gold Silver #jenkinsconf
  • 29. Thank You We’re hiring. Justin Ryan <jryan@netflix.com> @quidryan http://www.slideshare.net/quidryan

Editor's Notes

  1. Send feedback to @quidryan, presentation will be up later on slideshare, if you miss some link.
  2. I’d like to start by thanking my co-worker Curt Patrick. While I mostly work on writing the Job DSL Plugin, he has the spent the most time using it and integrating it into teams. Engineering Tools Is part of a larger organization who makes developing for the cloud palatable. Tasked with: Building and Deploying to the cloud Try to: Keep simple, simple. Keep hard, possible. Coupled with Freedom &amp; Responsibility See the Netflix culture slide deck. Or listen to episode 28 of theshipshow.com’s podcast to hear two members of the team explain how F&amp;R work in the context of our team. In general, we can’t necessarily tell people what to do
  3. We use a Service Orientated Architecture, with lots of little services. There is no one monolithic app to zip together. Each team has their own release schedule, some are short, some are long. Meaning there is not a set of jobs that all pushes go through. The jobs used between teams are “similar&quot;, and varying across branches and potentially environments. Think of a matrix of flows, measuring hundreds of projects by three branches. We have 3200 active jobs on our primary master.
  4. The problem then becomes the complexity. We provide some canonical jobs, and teams will copy among themselves. But in the end these are copies, and we don’t have a way to keep them up to date or effectively share them. We have a lot of plugins on our master, which makes the rendering of the configure screen slow.
  5. Caveat: Our problems are not necessarily your problems. We are not the teams making jobs for people, but we’re the ones who try to curate and streamline the usage of Jenkins. This gives us a unique prospective. So if I say something disparaging, it might just be because our situation is different than yours. It’s not giving anything away to say that we ended up using Job DSL. But it’s worth pointing out the alternatives at this stage. Since it was what we had to think about without this plugin. I’ll be the first to admit that I’m lazy when evaluating plugins, unless they have lots of screenshots. Template Project Plugin - UI Based, which is hard to scale out to many dozens of teams which all have their own preferences for jobs. The variations we have don’t map to a system being driven by parameters. Their docs state that it’s best when “only differ by a few attributes”, that’s not us. Job Generator Plugin - Good integration aligning input/outputs of jobs. Great for standardized flows, but that’s not us. Literate Plugin - Very new. Solves one of our use-cases which is to tie job creation to the source code. But we’re learned that the minutia of each plugin extremely subtle and important to get right. The idea of checking in specific settings in a subdirectory isn’t very scalable either across projects. Speaking of templates, we found that we don’t use them.
  6. Recognizing that the problem is about complexity, we can look at other areas which have had to tackle complexity recently. There have been plenty of attempts to wrap complex systems in pretty UIs. UML for coding. There are plenty of “Enterprise” solutions for configuration management, but it’s Chef/Puppet that’s winning that war. In Operations, their world is being up-ended by using Chef/Puppet. It’s making the problem of configuring hundreds if not thousands of systems manageable. Our problem is the same.
  7. Proper automation has to deal with all the quirks and customizations that real world requires. And to tackle those customizations we write code. Code is code. Build is Code (Ant/Gradle). Infrastructure is Code (Chef). The only missing piece is our build jobs, why are they special? In this model, Jobs are just artifacts of the DSL scripts. We expect any piece of our infrastructure to be a responsible citizen. They should be in SCM, they should get code reviews, re-usability through higher-level methods. Teams write and own the scripts. What they write is isolated from the work of others. There are no global constructs like templates. Meaning that changes are managed by them on their schedule, i.e. they don’t have the take a template change in the middle of a prod push. I’m sold!
  8. This is accomplished using the Job DSL Plugin. Let me explain the how it’s used. Create a “Seed” job, which will create the other jobs. Groovy runtime’s been instrumented to expose certain domain specific language features while maintaining the language. The specific build step will execute the script and collect a list of jobs to maintain. The general model is you create the ideal situation and the plugin take care of create/update/delete.
  9. We have 7 SCMs, 6 triggers, 15 build steps, 28 publishers, ~20 wrappers.
  10. It can be difficult to get started. I find that once there’s a “seed” job to modify, it’s easy to tweak it.Ideally, you could make the job the way you like it, then translate it back to dsl code, but that’s a future feature.Mental mind-shift, given that SEED jobs are jobs themselves.Plugin itself is dependent on contributors to fill in unimplemented plugins and we have a problem with version skew.
  11. Friendly mailing list and a monthly Google Hangout to let people ask questions. Constant stream of contributors adding miscellaneous plugins as they find a need. I’m always amazed how many plugins are out there. A few contributors stand out as contributing to the core
  12. sic.
  13. sic. Showing that the job dsl is good at creating jobs, while other plugins are better at executing them.
  14. Back to Netflix. We want to be a launching off point for teams, where EngTools can add value and not be gating them. We do that producing a .jar with utility methods and enhancements. We end up with our own language above the job dsl. Users are able to use the DSL directly or leverage what we offer on top of it. Focus on making most complicated problems easier (e.g. nftaskbuilder), while also addressing common problems (branching and merging).
  15. There’s some internals showing up here, around jobFactory, just ignore them for now. These each create 4 merge jobs, 2 to clobber up from dev to test, test to prod. And 2 merge jobs to merge back from prod to test and test to dev. Making this code even cleaner is left up to the reader.
  16. Creating 8 standardized jobs, which if changed by EngTools would get updated. We can abstract out the appropriate methods for our use-case.
  17. Some caveats, we’re using Groovy.Using groovy variables like properties, or variables defined earlier. Groovy strings, aka GStrings, have token replacement.
  18. addPerforce is a Netflix specific function that suites our needs and environment.
  19. E.g. Create a builds for every public Netflix project on GitHub. The Github API is the source of truth. Or Store model of your builds somewhere, like a web-app, so that users have a nice UI.Put scripts in VCS, we put them in a shared repo, to encourage teams learning from each other.
  20. Leave here, just Google “job dsl”, it’ll come right up. This was maybe Job DSL 101, for 102 tune into the Google Hangout to answer all new questions. As you might have guessed, we’re not just your standard Jenkins shop. We’re always looking out for someone who deeply understands Jenkins and can contribute back to the community, as part of their job.