jenkins at your continuous service

124
01

Upload: andrey-adamovich

Post on 13-Apr-2017

8.678 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Jenkins at your continuous service

01

Page 2: Jenkins at your continuous service

About meBio: Developer, coach, speaker, author

Company: Aestas/IT (http://aestasit.com)

E­mail: [email protected]

Linkedin: http://www.linkedin.com/in/andreyadamovich

Lanyrd: http://lanyrd.com/profile/andrey­adamovich

GitHub: https://github.com/aadamovich

SO: http://stackoverflow.com/users/162792/andrey­adamovich

Twitter: @codingandrey, @aestasit

••••••••

02

Page 3: Jenkins at your continuous service

Let's start!03

Page 4: Jenkins at your continuous service

Who is mr. Jenkins?

04

Page 5: Jenkins at your continuous service

A bit of history: HudsonWork started in the summer of 2004 at Sun by Kohsuke Kawaguchi.

First release: February 2005.

In May, 2008, Hudson won the Duke's Choice Award in the Developer

Solutions category.

In 2010, Sun is acquired by Oracle... discussions, negotiations.

Kohsuke Kawaguchi leaves Oracle.

•••

••

05

Page 6: Jenkins at your continuous service

A bit of history: JenkinsIn 2010, majority of Hudson's community votes for forking and name

changing.

Initial release of Jenkins: 2nd of February, 2011.

Oracle still supports and develops Hudson.

Around 2010­2011, CloudBees is created and declared Jenkins as its

backbone product.

•••

06

Page 7: Jenkins at your continuous service

Current stateLatest version:  1.651  (LTS:  1.642.2 ).

jenkinsci  organization on Github has 600+ members

... and over 1400 Git repositories.

1100+ plugins available.

Uncountable number of installations and users.

Jenkins 2.0, most likely, is coming this year.

••••••

07

Page 8: Jenkins at your continuous service

Vibrant and lively

08

Page 9: Jenkins at your continuous service

Jenkins is useful for...Building (compiling, assembling, linking, etc.)...

...and Reporting the build status.

Testing and, more importantly, Reporting the test results.

Releasing, Deploying, Provisioning...

...or simply ­ Executing any of your automation tasks.

So...

Jenkins is an ultimate control panel for your software delivery!

•••••••

09

Page 10: Jenkins at your continuous service

Tools using/integrating with JenkinsFabric8 ­ http://fabric8.io/

MaestroDev ­ http://maestrodev.wix.com/maestrodev

IBM BlueMix ­ https://hub.jazz.net/

XebiaLabs ­ https://xebialabs.com/

••••

10

Page 11: Jenkins at your continuous service

Starting Jenkinsjava ‐jar jenkins.war01.

11

Page 12: Jenkins at your continuous service

Starting Jenkins: Debianwget ‐q ‐O ‐ \

     https://jenkins‐ci.org/debian/jenkins‐ci.org.key | \

     sudo apt‐key add ‐

sudo sh ‐c 'echo deb \

     http://pkg.jenkins‐ci.org/debian binary/ \

     \> /etc/apt/sources.list.d/jenkins.list'

sudo apt‐get update

sudo apt‐get install jenkins

01.

02.

03.

04.

05.

06.

07.

08.

12

Page 13: Jenkins at your continuous service

Starting Jenkins: RedHatsudo wget ‐O /etc/yum.repos.d/jenkins.repo \

     http://pkg.jenkins‐ci.org/redhat‐stable/jenkins.repo

sudo rpm ‐‐import \

     https://jenkins‐ci.org/redhat/jenkins‐ci.org.key

sudo yum install jenkins

01.

02.

03.

04.

05.

13

Page 14: Jenkins at your continuous service

Good start,but...

14

Page 15: Jenkins at your continuous service

What's thefirst thing you

do...15

Page 16: Jenkins at your continuous service

in Jenkinsafter

installation?16

Page 17: Jenkins at your continuous service

Remove TheBlue Balls!17

Page 18: Jenkins at your continuous service

Green balls

18

Page 19: Jenkins at your continuous service

Green balls

19

Page 20: Jenkins at your continuous service

But ifseriously...20

Page 21: Jenkins at your continuous service

Jenkins has lots of plugins

21

Page 22: Jenkins at your continuous service

Jenkinsneeds to bemaintained!22

Page 23: Jenkins at your continuous service

Maintaining your installationDevelopers need more tools to build their software.

Developers need more plugins to better integrate build tools and

increase visibility.

Developers need faster feedback from their builds.

It's not enough to just start the WAR file!

••

••

23

Page 24: Jenkins at your continuous service

Installing Jenkins: better wayFor more reliable setup, it's better to use provisioning tools to describe

your requirements:

Puppet

Chef

Ansible

your favorite provisioning tool here

••••

24

Page 25: Jenkins at your continuous service

Installing Jenkins: Puppethttps://forge.puppetlabs.com/rtyler/jenkins

class { 'jenkins':

  executors => 4,

}

jenkins::plugin { 'git': 

  version => '1.1.11',

}

01.

02.

03.

04.

05.

06.

25

Page 26: Jenkins at your continuous service

Installing Jenkins: Puppethttps://forge.puppetlabs.com/rtyler/jenkins

jenkins::job { 'test‐build‐job':

  enabled => 0,

  config  => 

    template("${templates}/test‐build‐job.xml.erb"),

}

01.

02.

03.

04.

05.

26

Page 27: Jenkins at your continuous service

Installing Jenkins: Ansiblehttps://github.com/geerlingguy/ansible­role­jenkins

‐ hosts: ci‐server

  vars:

    jenkins_plugins:

      ‐ git

      ‐ ssh

  roles:

    ‐ geerlingguy.jenkins

01.

02.

03.

04.

05.

06.

07.

27

Page 28: Jenkins at your continuous service

Installing Jenkins: Chefhttps://github.com/chef­cookbooks/jenkins

include_recipe 'jenkins::master'

jenkins_plugin 'greenballs' do

  version '1.3'

end

jenkins_user 'grumpy' do

  action :delete

end

01.

02.

03.

04.

05.

06.

07.

28

Page 29: Jenkins at your continuous service

Installing Jenkins: Dockerdocker run ‐p 8080:8080 ‐p 50000:50000 \

       ‐‐name myjenkins \

       ‐‐env JAVA_OPTS=... \

       ‐v /var/lib/jenkins:/var/jenkins_home \

       jenkins

01.

02.

03.

04.

05.

29

Page 30: Jenkins at your continuous service

Installing Jenkins: DockerfileFROM jenkins

COPY plugins.txt /usr/share/jenkins/ref/

COPY custom.groovy \

     /usr/share/jenkins/ref/init.groovy.d/custom.groovy

RUN  /usr/local/bin/plugins.sh \

     /usr/share/jenkins/ref/plugins.txt

01.

02.

03.

04.

05.

06.

30

Page 31: Jenkins at your continuous service

ConfiguringJenkins

31

Page 32: Jenkins at your continuous service

JobConfigHistoryhttps://wiki.jenkins­ci.org/display/JENKINS/JobConfigHistory+Plugin

32

Page 33: Jenkins at your continuous service

Jenkins asCode

33

Page 34: Jenkins at your continuous service

Job DSLhttps://jenkinsci.github.io/job­dsl­plugin/

job(jobName) {

  scm {

    git("git://github.com/${project}.git", branchName)

  }

  steps {

    maven("test ‐Dproject.name=${project}/${branchName}")

  }

}

01.

02.

03.

04.

05.

06.

07.

08. 34

Page 35: Jenkins at your continuous service

Gradle Jenkins pluginhttps://github.com/ghale/gradle­jenkins­plugin

Allows defining jobs and views with the help of Job DSL inside Gradle

build.

Gives common tasks to create, update, delete jobs and views on

Jenkins server(s).

••

35

Page 36: Jenkins at your continuous service

Gradle Jenkins pluginapply plugin: 'com.terrafolio.jenkins'

jenkins {

  servers {

    testing {

      url 'http://jenkins.somewhere.com:8080'

    }

  }

  ...

01.

02.

03.

04.

05.

06.

07.

08.

36

Page 37: Jenkins at your continuous service

Gradle Jenkins plugin: definition  ...

  jobs {

    test {

      server servers.testing

      definition {

        name "Build ${project.name}"

        xml file('config.xml')

      }

    }}}

01.

02.

03.

04.

05.

06.

07.

08.

09. 37

Page 38: Jenkins at your continuous service

Gradle Jenkins plugin: templatestemplates {

  build_template {

    dsl {

      triggers { scm '*/5 * * * *' }

      steps { gradle 'clean build' }

      publishers {

        archiveJunit 'build/test‐results/*.xml'

        archiveArtifacts 'build/libs/*.jar'

      }}}}

01.

02.

03.

04.

05.

06.

07.

08.

09. 38

Page 39: Jenkins at your continuous service

Gradle Jenkins plugin: mixingjobs {

 for (i in 1..3) {

  "build${i}" {

   dsl {

    using 'build_template'

    customWorkspace "/workspaces/build${i}"

    scm {

      git("[email protected]/build_repo_${i}")

    }

 }}}}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.39

Page 40: Jenkins at your continuous service

Gradle Jenkins plugin: viewsview {

  name "Even jobs"

  jobs {

    name "Build Job 2" 

  } 

  columns {

    name()

    buildButton()

  }}

01.

02.

03.

04.

05.

06.

07.

08.

09. 40

Page 41: Jenkins at your continuous service

Gradle Jenkins plugin: tasksupdateJenkinsItems

deleteJenkinsItems

dumpJenkinsItems

dumpRemoteJenkinsItems

retireJenkinsItems

validateJenkinsItems

••••••

41

Page 42: Jenkins at your continuous service

Constructingpipelines

42

Page 43: Jenkins at your continuous service

Build Flowhttps://wiki.jenkins­ci.org/display/JENKINS/Build+Flow+Plugin

43

Page 44: Jenkins at your continuous service

Build Flow: simplebuild("job2A")

build("job2B")

build("job2C")

01.

02.

03.

44

Page 45: Jenkins at your continuous service

Build Flow: guardguard {

  build( "this_job_may_fail" )

} rescue {

  build( "cleanup" )

}

01.

02.

03.

04.

05.

45

Page 46: Jenkins at your continuous service

Build Flow: retryretry (3) {

  build( "this_job_may_fail" )

}

01.

02.

03.

46

Page 47: Jenkins at your continuous service

Build Flow: parallelparallel (

  // job 1, 2 and 3 will 

  // be scheduled in parallel.

  { build("job1") },

  { build("job2") },

  { build("job3") }

)

// job4 will be triggered after jobs 1, 2, 3 complete

build("job4")

01.

02.

03.

04.

05.

06.

07.

08.

09. 47

Page 48: Jenkins at your continuous service

Build Flow: parallelparallel (

{

    build("job1A")

    build("job1B")

},

{

    build("job2A")

    build("job2B")

}

)

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.48

Page 49: Jenkins at your continuous service

Build Pipelinehttps://wiki.jenkins­ci.org/display/JENKINS/Build+Pipeline+Plugin

49

Page 50: Jenkins at your continuous service

Reporting50

Page 51: Jenkins at your continuous service

Timestamperhttps://wiki.jenkins­ci.org/display/JENKINS/Timestamper

21:51:15  Started by user anonymous

21:51:15  Building on master

21:51:17  Finished: SUCCESS

01.

02.

03.

51

Page 52: Jenkins at your continuous service

ANSI Colorhttps://wiki.jenkins­ci.org/display/JENKINS/AnsiColor+Plugin

52

Page 53: Jenkins at your continuous service

TAP53

Page 54: Jenkins at your continuous service

Test Anything ProtocolTAP, the Test Anything Protocol, is a simple text­based interface

between testing modules in a test harness. TAP started life as part of

the test harness for Perl but now has implementations in C, C++,

Python, PHP, Perl, Java, JavaScript, and others.

54

Page 55: Jenkins at your continuous service

TAP format: simple1..2

ok 1 ‐ Yahoo!

not ok 2 ‐ org.tap4j.Error...

01.

02.

03.

55

Page 56: Jenkins at your continuous service

TAP format: nested1..2

ok 1 ‐ First test

  1..2

  ok 1 ‐ This is a subtest

  ok 2 ‐ So is this

    1..2

    ok 1 ‐ This is a subtest

    ok 2 ‐ So is this

ok 2 ‐ 2nd test

01.

02.

03.

04.

05.

06.

07.

08.

09. 56

Page 57: Jenkins at your continuous service

TAP for Jenkinshttps://wiki.jenkins­ci.org/display/JENKINS/TAP+Plugin

57

Page 58: Jenkins at your continuous service

TAP for Jenkins

58

Page 59: Jenkins at your continuous service

Jenkins TVhttps://wiki.jenkins­ci.org/display/JENKINS/Build+Monitor+Plugin

59

Page 60: Jenkins at your continuous service

Jenkins TV

60

Page 61: Jenkins at your continuous service

Custom warningshttps://wiki.jenkins­ci.org/display/JENKINS/Warnings+Plugin

61

Page 62: Jenkins at your continuous service

Custom warningsSupport for javac (ant, maven, command line),

Eclipse Java Compiler, JavaDoc Compiler,

Hudson/Jenkins HPI, MSBuild, GCC, GNU Linker,

SUN Studio C++, Gnat (Ada), Erlang,

PC­Lint compiler warnings (configuration of PcLint),

Eclipse Buckminster, Oracle Invalids, Doxygen,

Robocopy, Perforce, Cobol, PHP, Flex, YUI Compressor,

puppet­lint, FxCop, C++ lint, CSSLint, JCReport,

and many more...

••••••••• 62

Page 63: Jenkins at your continuous service

Custom warnings

63

Page 64: Jenkins at your continuous service

Build labels

64

Page 65: Jenkins at your continuous service

Groovy Post­build pluginhttps://wiki.jenkins­ci.org/display/JENKINS/Groovy+Postbuild+Plugin

65

Page 66: Jenkins at your continuous service

Groovy Post­build plugin

66

Page 67: Jenkins at your continuous service

Groovy Post­build pluginif(manager.

    logContains(".*uses or overrides a deprecated API.*")) {

  manager.

    addWarningBadge("Thou shalt not use deprecated methods.")

  manager.

   createSummary("warning.gif").

   appendText("<h1>You have been warned!</h1>", 

     false, false, false, "red")

  manager.buildUnstable()

}

01.

02.

03.

04.

05.

06.

07.

08.

09.

10.67

Page 68: Jenkins at your continuous service

Groovy Post­build plugin

68

Page 69: Jenkins at your continuous service

Groovy Post­build pluginif("true".equals(

  manager.build.buildVariables.get("storeToDB"))) {

  manager.addBadge("db_in.gif", "Stored to DB")

}

01.

02.

03.

04.

69

Page 70: Jenkins at your continuous service

Groovy Post­build plugin

70

Page 71: Jenkins at your continuous service

Groovy Post­build pluginif(manager.build.result.

    isBetterOrEqualTo(

      hudson.model.Result.UNSTABLE)) {

  manager.

    addShortText(

    "v${manager.build.buildVariables.get('version')}"

    )

}

01.

02.

03.

04.

05.

06.

07.

08.

71

Page 72: Jenkins at your continuous service

Groovy Post­build plugin

72

Page 73: Jenkins at your continuous service

Groovy Post­build plugindef matcher = manager.getLogMatcher(".*Total time: (.*)\$")

if(matcher?.matches()) {

  manager.

    addShortText(

     matcher.group(1), 

     "grey", "white", "0px", "white"

    )

}

01.

02.

03.

04.

05.

06.

07.

08.

73

Page 74: Jenkins at your continuous service

Groovy Post­build plugin

74

Page 75: Jenkins at your continuous service

Groovy Post­build plugin: iconsmanager.addBadge("star‐gold.gif", "icon from Jenkins")

manager.addBadge("yellow.gif", 

                 "icon from groovy‐postbuild plugin")

manager.addBadge("/images/16x16/yellow.gif", 

                 "icon from Jenkins")

manager.addBadge("/plugin/greenballs/16x16/green.gif", 

                 "icon from greenballs plugin")

01.

02.

03.

04.

05.

06.

07.

75

Page 76: Jenkins at your continuous service

ChatOps76

Page 77: Jenkins at your continuous service

ChatOpsHipchat

Slack

Skype

Jabber/XMPP

etc.

•••••

77

Page 78: Jenkins at your continuous service

ChatOps: Slack

78

Page 79: Jenkins at your continuous service

ScalingJenkins

79

Page 80: Jenkins at your continuous service

Single server

80

Page 81: Jenkins at your continuous service

Master/Slave

81

Page 82: Jenkins at your continuous service

Labelling

82

Page 83: Jenkins at your continuous service

Slaves vs.Executors

83

Page 84: Jenkins at your continuous service

Why scale?84

Page 85: Jenkins at your continuous service

Feedback loop

85

Page 86: Jenkins at your continuous service

Reason 186

Page 87: Jenkins at your continuous service

Monolithicbuild

87

Page 88: Jenkins at your continuous service

Monolithic buildTime­consuming

Resource­consuming

Frustration­accumulating

•••

88

Page 89: Jenkins at your continuous service

Before youcan scale...89

Page 90: Jenkins at your continuous service

SPLIT!!!90

Page 91: Jenkins at your continuous service

Reason 291

Page 92: Jenkins at your continuous service

Too manythings tobuild

92

Page 93: Jenkins at your continuous service

Too many things to buildToo many components

Too many branches

Too many unit/integration tests

Too many validation rules

••••

93

Page 94: Jenkins at your continuous service

Reason 394

Page 95: Jenkins at your continuous service

Too manythings to test

95

Page 96: Jenkins at your continuous service

Too many test variationsDifferent operating systems

Different target platforms

Different markets

Different customers

••••

96

Page 97: Jenkins at your continuous service

Reason 497

Page 98: Jenkins at your continuous service

Lack ofresources

98

Page 99: Jenkins at your continuous service

Reason 599

Page 100: Jenkins at your continuous service

Lack of time!100

Page 101: Jenkins at your continuous service

Solutions?101

Page 102: Jenkins at your continuous service

Add morehardware!

102

Page 103: Jenkins at your continuous service

or...103

Page 104: Jenkins at your continuous service

Go to theCloud!

104

Page 105: Jenkins at your continuous service

Cloud slaves

105

Page 106: Jenkins at your continuous service

Slave/Executor scaling

106

Page 107: Jenkins at your continuous service

Jenkins EC2 pluginAllow Jenkins to start slaves on EC2 or Ubuntu Enterprise Cloud

(Eucalyptus) on demand, and kill them as they get unused. With this

plugin, if Jenkins notices that your build cluster is overloaded, it'll start

instances using the EC2 API and automatically connect them as

Jenkins slaves.

“107

Page 108: Jenkins at your continuous service

Configure access/secret key

108

Page 109: Jenkins at your continuous service

Configure key pair

109

Page 110: Jenkins at your continuous service

Configure security group

110

Page 111: Jenkins at your continuous service

Select machine imageAmazon base images

AWS market place

Create your own

•••

111

Page 112: Jenkins at your continuous service

Configure EC2 plugin

112

Page 113: Jenkins at your continuous service

Configure EC2 plugin

113

Page 114: Jenkins at your continuous service

Configure EC2 plugin

114

Page 115: Jenkins at your continuous service

Conclusion115

Page 116: Jenkins at your continuous service

Recommen­dations

116

Page 117: Jenkins at your continuous service

Recommendations: job structureDo not make your build to depend on too many plugins.

Do not implement too many build steps inside a job.

There should be a possiblity to execute full build job from a command

line at any machine.

Jenkins is just an executor engine!

And a report collector!

•••

••

117

Page 118: Jenkins at your continuous service

Recommendations: configurationUse provisioning tools to control complex Jenkins installations...

... and to scale them quicker.

(Optionally) use containers to isolate build tools from each other.

(Optionally) use containers to run acceptance/functional tests of your

applications.

Use Job DSL to define job templates!

••••

118

Page 119: Jenkins at your continuous service

Recommendations: securityEnable HTTPS.

Enable Jenkins security.

Configure LDAP with users and groups.

•••

119

Page 120: Jenkins at your continuous service

Recommendations: multi­masterRunning all your projects in the same Jenkins farm is not always a

good idea.

If your operations are profiecient in supporting single Jenkins

installation, they will be able to setup more.

Indepedent projects should leave in isolation.

120

Page 121: Jenkins at your continuous service

That's it!121

Page 122: Jenkins at your continuous service

Jenkins 2.0Pipeline as code aka  Jenkinsfile

Improved UX e.g. recommended plugins

Improved UI: job creation, view creation etc.

Improved website: better documentation, plugin index etc.

Totally backwards compatible!

•••••

122

Page 123: Jenkins at your continuous service

Now, that's itfor sure!

123

Page 124: Jenkins at your continuous service

Thank you!124