One-Click Deployment with Jenkins

Preview:

DESCRIPTION

PHP Barcelona 2011

Citation preview

© Mayflower GmbH 2010

One-Click Deployment with Jenkins

Florian Anderiasch I October 28, 2011

Mayflower GmbH I 2

Who am I?

Mayflower GmbH I 3

DeveloperEx-AdminDevOp?

„I rant a lot“

@anderiaschstay in touch!

Mayflower GmbH I 4

Who are you?

Mayflower GmbH I 5

Developers?

Mayflower GmbH I 6

Admins?

Mayflower GmbH I 7

Continuous Integration?

Mayflower GmbH I 8

How often

do yourelease?

Mayflower GmbH I 9

6-12 months?

Mayflower GmbH I 10

1-6 months?

Mayflower GmbH I 11

2-4 weeks?

Mayflower GmbH I 12

1-14 days?

Mayflower GmbH I 13

1-24 hours?

Mayflower GmbH I 14

Less than 15 minutes?

Mayflower GmbH I 15

15 minutes!

Mayflower GmbH I 16

Why One-ClickDeployment?

Mayflower GmbH I 17

Everything is moving faster.

Mayflower GmbH I 18

React faster touser feedback

React faster touser feedback

Mayflower GmbH I 19

Faster ROITime to market

20Continuous Improvement in PHP Projects I Mayflower GmbH I 25th February I

Developers are lazy.Developers are lazy.

Mayflower GmbH I 21

Basic requirements

Mayflower GmbH I 22

Agile softwaredevelopment

Mayflower GmbH I 23

Scrum or Kanban

Mayflower GmbH I 24

Test Driven Development

Mayflower GmbH I 25

Continuous Integration

Mayflower GmbH I 26

Integrating the freshparts of code into

the application

at least daily

Mayflower GmbH I 27

Continuous Inspection

Mayflower GmbH I 28

instantfeedback

Mayflower GmbH I 29

Refactoring

Mayflower GmbH I 30

ContinuousDeployment

Mayflower GmbH I 31

Reproducableresults

Mayflower GmbH I 32

There arepractices you wantto avoid

Mayflower GmbH I 33

Having your SVN repo in your

webserver's docroot.

Mayflower GmbH I 34

Using SSH and vi and your root account on

the live server.

Mayflower GmbH I 35

Who's still doing this? :-)

Mayflower GmbH I 36

Mayflower GmbH I 37

What do we need?

Mayflower GmbH I 38

First of all:centralizedbuild server

Mayflower GmbH I 39

There are plenty:

CruiseControl/phpUCBamboobuildbot

Mayflower GmbH I 40

tests are running

all the time

Mayflower GmbH I 41

Mayflower GmbH I 42

Repeatedlyrunning

tests

Mayflower GmbH I 43

Advantages

Mayflower GmbH I 44

Informationavailable

at onesingle point

Mayflower GmbH I 45

find errors

Mayflower GmbH I 46

andfix themquickly

Mayflower GmbH I 47

Metrics

Mayflower GmbH I 48

Dashboards

Mayflower GmbH I 49

Awareness

Mayflower GmbH I 50

Awareness!

Mayflower GmbH I 51

Continuous integrationin

PHP projects

Mayflower GmbH I 52

Continuous Integrationin

PHP projects

Mayflower GmbH I 53

PHPUnitDocBlox

Mayflower GmbH I 54

Continuous Inspectionin

PHP projects

Mayflower GmbH I 55

PHP_CodeSnifferPHP_Depend

PHPMDphpcpd

jslint

Mayflower GmbH I 56

Infrastructure

Mayflower GmbH I 57

Mayflower GmbH I 58

59Continuous Improvement in PHP Projects I Mayflower GmbH I 25th February I

One Ubuntu package to rule them all.

Mayflower GmbH I 60

Developer VMUbuntu 11.04

Mayflower GmbH I 61

Jenkins: Dev-VMTesting: Dev-VM

Ubuntu 11.04

Mayflower GmbH I 62

Staging VMs:Frontend: Ubuntu 11.04

Backend: Ubuntu 10.04 LTS

(bad idea, use one version)

Mayflower GmbH I 63

Amazon AWS live:Frontend: Ubuntu 11.04

Backend: Ubuntu 10.04 LTS

Mayflower GmbH I 64

Frontend NodesVarnishnginx

PHP 5.3 with APCZend Framework 1.11

Dojo 1.6Doctrine2.1

Mayflower GmbH I 65

Backend NodesMySQL Master/Slave

Apache SolrGearman/RabbitMQ

memcachedejabberd

Mayflower GmbH I 66

Development workflow

Mayflower GmbH I 67

1. developer commits code2. post commit hook: build3. checks4. packaging a .deb5. (deploy to STAGING)6. (deploy to LIVE)

Mayflower GmbH I 68

<project> <property /> <target name=“build“></target> <target name=“clean“></target> <target name=“phpunit“></target> <target name=“deploy-to-staging“></target></project>

Mayflower GmbH I 69

<target name="phpunit" depends="db-test" description="Run all tests"> <exec executable="phpunit" failonerror="true"> <arg line="--configuration${basedir}/tests/phpunit-verbose.xml${basedir}/tests/AllTests.php" /> </exec> </target>

Mayflower GmbH I 70

„ant build“

ant syncant cleanant db-up

ant parallelTasksant parallelTasksant phpunitant phpcb

ant build-debant build-deb

Mayflower GmbH I 71

„ant parallelTasks“

ant phpmdant phpdocant phpcpdant phpcsant jslint

Mayflower GmbH I 72

„build-deb“

git pullant phpunitant clean

ant compilejsant compilecss

Mayflower GmbH I 73

„deploy-to-staging“

ant deb-signant db-staging-up

scp to all hosts

Mayflower GmbH I 74

„deploy-to-live“

fetch known-good .debscp to all hosts

there is no step 3

Mayflower GmbH I 75

Disadvantagesand

problems

Mayflower GmbH I 76

Build time15 min on harddisk

massive disk i/o4 min on ramdisk

Mayflower GmbH I 77

Complex setup

Mayflower GmbH I 78

Jenkins:Single point of failure!

Mayflower GmbH I 79

Goodies

Mayflower GmbH I 80

everyonecan deploy

(including theproduct owner)

Mayflower GmbH I 81

git bisect start$BAD $GOOD

Mayflower GmbH I 82

30min frombugreport to

deploy

Mayflower GmbH I 83

We can still do hotfixes in thisenvironment

Mayflower GmbH I 84

plotting plugin (gitstats)

Mayflower GmbH I 85

Mayflower GmbH I 86

echo $(olddir=`pwd`;cd /media/ram/PROJECT;

git log --oneline --after=$(date +%Y-%m-%d -d yesterday) --shortstat

| grep --color=none "^ " | sed 's,^ *,,' | awk 'NF==7 {p+=$4;m+=$6;diff+=$4;diff-=$6;} END {printf("%d %d %d\n", p, m, diff)}';cd

$olddir;) > gitnum.properties.all

echo YVALUE=$(cat gitnum.properties.all | cut -d' ' -f1) >> gitnum.properties.plus

Mayflower GmbH I 87

Jenkins Plugin: Chuck Norris

Mayflower GmbH I 88

Questions?

29.10.11 Mayflower GmbH 89

Thanks for listening!

Contact Florian Anderiasch

florian.anderiasch@mayflower.de

+49 89 242054 1134

@anderiasch

Mayflower GmbH

Mannhardtstrasse 6

80538 München

Mayflower GmbH I 90

ImagesVader (42), Sebastian Bergmann, CC-BY-SA

http://www.flickr.com/photos/sebastian_bergmann/2282734669

Clouds (52), John Mueller, CC-BY-NC-NDhttp://www.flickr.com/photos/johnmueller/52621490/

Mayflower GmbH I 91

CinderConnecting CI server and IDE

Help is welcomehttp://github.com/winks/cinder

needs XML from phpuc/hudson/bamboo

and nothing else :)

Recommended