super charged configuration as code

26
Jenkins User Conference San Francisco #jenkinsconf Supercharged Configuration As Code Bulk Updates with Job DSL and System Groovy Alan Beale Chicago Trading Company October 23, 2014 #jenkinsconf

Upload: alan-beale

Post on 14-Apr-2017

293 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Supercharged Configuration As Code Bulk Updates with Job DSL and System Groovy

Alan Beale Chicago Trading Company !!October 23, 2014

#jenkinsconf

Page 2: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Who Am I

• Alan Beale

Build Engineer @ Chicago Trading Company

The statements, remarks and conclusions of this presentation are my own and do not represent the views of my employer, CTC Trading Group, L.L.C. (“CTC”).

Page 3: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Have you ever found a change that you need to

apply to 100 jobs?

Page 4: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

• Job DSL is a plugin that allows users to create job configurations with a groovy domain specific language

• System groovy scripts are groovy scripts that have access the the Jenkins.instance calling various parts of the Jenkins API

Page 5: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Observations about build jobs

• Jobs Change over Time

• Most jobs are like other jobs

Page 6: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Jobs Change Over Time

• Correctness Changes

• Bug Fixes

• Complexity Increase

Page 7: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Most Jobs are Similar

• Small number of themes with structured variation

Page 8: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Example of Job Themes

• Continuous Integration Jobs • Gerrit Verification Jobs

• Release Jobs • Privileged SCM Task Automation

Page 9: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

How do these observations help?

• Job DSL enables us to using coding techniques to create job configurations

• System groovy scripts enable use to automate repeated calls to jobs

Page 10: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Player Piano

• Our metaphor for bulk job regeneration

Page 11: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

The Piano Roll

• Controls the sound of the piano

• Orchestrates the automation of job recreation

Page 12: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Job DSL for gradle build

job {

name "git-gradle-simple-build"

scm {

git('/Users/alanbeale/sandbox/samples/java/basic',

'*/master' )

}

steps {

gradle ( "build", null, true )

}

}

Page 13: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Evolution Example

job {

name "git-gradle-build-with-worspace-option"

scm {

git('/Users/alanbeale/sandbox/samples/java/basic',

‘*/master')

}

steps {

gradle ( "build", null, true

){ node -> //hudson.plugins.gradle.Gradle

node/useWorkspaceAsHome(true)

}

}

}

Page 14: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Add Gerrit Trigger

• https://github.com/bealeaj1214/jenkins-juc-job-dsl-bulk-regeneration/blob/master/src/examples/jobdsl/scm-gradle-gerrit-build.jobDSL

Page 15: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Repeated elements

• Job Name

• Git URL

• Gerrit Trigger Project

Page 16: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Towards Job Factory

• Factor out common operations

• Parameterize calling Job DSL

Page 17: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Create Utility class

• jobdsl.JobUtilities methods

• setupGradleGerritJobName() • setupGerritScm() • setupGerritTrigger() • setupGradleBuild()

Page 18: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

JobUtilities.groovy

• https://github.com/bealeaj1214/jenkins-juc-job-dsl-bulk-regeneration/blob/master/src/main/groovy/jobdsl/JobUtilities.groovy

Page 19: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

generator job DSL

• https://github.com/bealeaj1214/jenkins-juc-job-dsl-bulk-regeneration/blob/master/src/generator/jobdsl/seed4GradleGerritJobs.jobDSL

Page 20: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Part 2 : System Groovy

Page 21: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Regeneration script

import jenkins.model.* !import hudson.model.* !def jenkins = jenkins.model.Jenkins.instance def jobGeneratorName='gradle-gerrit-job-generator' def jobGenerator = jenkins.getItem(jobGeneratorName) def projectParamName ='PROJECT_NAME' def projectParamValue=‘sample/java/library' !if(jobGenerator){ boolean buildQueued = jobGenerator.scheduleBuild( 5, new Cause.UserIdCause(), new ParametersAction( new StringParameterValue(projectParamName, projectParamValue) ) ) }

Page 22: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Regenerate from existing job name

import jenkins.model.* !import hudson.model.* !def jenkins = jenkins.model.Jenkins.instance def jobGeneratorName='gradle-gerrit-job-generator' def jobGenerator = jenkins.getItem(jobGeneratorName) def projectParamName ='PROJECT_NAME' def jobs = jenkins.getItems() !def gerritJobs = jobs.findAll { job -> job.name.endsWith('gradle-gerrit') } !def projectNames =gerritJobs.collect { item -> item.triggers.values().find { it.class.simpleName =='GerritTrigger' }. gerritProjects[0].pattern } !if(jobGenerator){ projectNames.each { projectName -> boolean buildQueued = jobGenerator.scheduleBuild( 5, new Cause.UserIdCause(), new ParametersAction( new StringParameterValue( projectParamName,projectName) ) ) } }

Page 23: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Summary

• Job DSL enables precise control

• Define parameterized Job Generator (the piano)

Page 24: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Summary

• System Groovy Jobs

• automates calling job generator in bulk

(piano roll)

Page 25: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Thank You To Our SponsorsPlatinum Gold

SilverCorporate

Page 26: Super Charged Configuration As Code

Jenkins User Conference San Francisco #jenkinsconf

Thank You

• Source Code at https://github.com/bealeaj1214/jenkins-juc-job-dsl-bulk-regeneration