One-Click Deployment
with Jenkins

Florian Anderiasch I October 28, 2011




                                        © Mayflower GmbH 2010
Who am I?

            Mayflower GmbH I 2
Developer
 Ex-Admin
  DevOp?

„I rant a lot“

@anderiasch
stay in touch!
                 Mayflower GmbH I 3
Who are you?

               Mayflower GmbH I 4
Developers?

              Mayflower GmbH I 5
Admins?

          Mayflower GmbH I 6
Continuous
Integration?

               Mayflower GmbH I 7
How often
do you
release?
            Mayflower GmbH I 8
6-12 months?


               Mayflower GmbH I 9
1-6 months?


              Mayflower GmbH I 10
2-4 weeks?


             Mayflower GmbH I 11
1-14 days?


             Mayflower GmbH I 12
1-24 hours?


              Mayflower GmbH I 13
Less than 15 minutes?



                    Mayflower GmbH I 14
15 minutes!



              Mayflower GmbH I 15
Why One-Click
Deployment?



                Mayflower GmbH I 16
Everything is
moving faster.


                 Mayflower GmbH I 17
React faster to
user feedback
     React faster to
      user feedback




               Mayflower GmbH I 18
Faster ROI
Time to market



                 Mayflower GmbH I 19
Developers are lazy.
       Continuous Improvement in PHP Projects I   Mayflower GmbH   I   20
Basic requirements


                     Mayflower GmbH I 21
Agile software
development


                 Mayflower GmbH I 22
Scrum or Kanban


                  Mayflower GmbH I 23
Test Driven
Development

              Mayflower GmbH I 24
Continuous
Integration

              Mayflower GmbH I 25
Integrating the fresh
  parts of code into
   the application

   at least daily

                        Mayflower GmbH I 26
Continuous
Inspection

             Mayflower GmbH I 27
instant
feedback
           Mayflower GmbH I 28
Refactoring

              Mayflower GmbH I 29
Continuous
Deployment

             Mayflower GmbH I 30
Reproducable
   results

               Mayflower GmbH I 31
There are
practices
you want
 to avoid
            Mayflower GmbH I 32
Having your SVN
   repo in your
webserver's docroot.

                   Mayflower GmbH I 33
Using SSH and vi and
your root account on
   the live server.

                   Mayflower GmbH I 34
Who's still doing this? :-)




                              Mayflower GmbH I 35
Mayflower GmbH I 36
What do we need?



                   Mayflower GmbH I 37
First of all:
centralized
build server
                Mayflower GmbH I 38
There are plenty:

CruiseControl/phpUC
       Bamboo
       buildbot

                      Mayflower GmbH I 39
tests are running
all the time

                    Mayflower GmbH I 40
Mayflower GmbH I 41
Repeatedly
 running
   tests


             Mayflower GmbH I 42
Advantages



             Mayflower GmbH I 43
Information
 available
   at one
single point


               Mayflower GmbH I 44
find errors
              Mayflower GmbH I 45
and
fix them
 quickly




   Mayflower GmbH I 46
Metrics


          Mayflower GmbH I 47
Dashboards



             Mayflower GmbH I 48
Awareness


            Mayflower GmbH I 49
Awareness!   Mayflower GmbH I 50
Continuous integration
          in
     PHP projects


                         Mayflower GmbH I 51
Continuous Integration
          in
     PHP projects


                         Mayflower GmbH I 52
PHPUnit
DocBlox



          Mayflower GmbH I 53
Continuous Inspection
         in
    PHP projects


                        Mayflower GmbH I 54
PHP_CodeSniffer
 PHP_Depend
    PHPMD
    phpcpd
     jslint

                  Mayflower GmbH I 55
Infrastructure



                 Mayflower GmbH I 56
Mayflower GmbH I 57
Mayflower GmbH I 58
One Ubuntu package to
    rule them all.
        Continuous Improvement in PHP Projects I   Mayflower GmbH   I   59
Developer VM
Ubuntu 11.04




               Mayflower GmbH I 60
Jenkins: Dev-VM
Testing: Dev-VM
 Ubuntu 11.04




                  Mayflower GmbH I 61
Staging VMs:
 Frontend: Ubuntu 11.04
Backend: Ubuntu 10.04 LTS

(bad idea, use one version)



                              Mayflower GmbH I 62
Amazon AWS live:
 Frontend: Ubuntu 11.04
Backend: Ubuntu 10.04 LTS




                            Mayflower GmbH I 63
Frontend Nodes
     Varnish
      nginx
PHP 5.3 with APC
Zend Framework 1.11
      Dojo 1.6
    Doctrine2.1

                      Mayflower GmbH I 64
Backend Nodes
MySQL Master/Slave
   Apache Solr
Gearman/RabbitMQ
    memcached
     ejabberd
                     Mayflower GmbH I 65
Development workflow



                       Mayflower GmbH I 66
1. developer commits code
2. post commit hook: build
3. checks
4. packaging a .deb
5. (deploy to STAGING)
6. (deploy to LIVE)

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




                                      Mayflower GmbH I 68
<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 69
„ant build“
     ant sync
    ant clean
    ant db-up
ant parallelTasks
  ant phpunit
   ant phpcb
 ant build-deb
                    Mayflower GmbH I 70
„ant parallelTasks“
     ant phpmd
     ant phpdoc
     ant phpcpd
      ant phpcs
       ant jslint

                    Mayflower GmbH I 71
„build-deb“
     git pull
   ant phpunit
    ant clean
  ant compilejs
 ant compilecss

                  Mayflower GmbH I 72
„deploy-to-staging“
     ant deb-sign
   ant db-staging-up
    scp to all hosts


                       Mayflower GmbH I 73
„deploy-to-live“
fetch known-good .deb
     scp to all hosts
   there is no step 3


                        Mayflower GmbH I 74
Disadvantages
     and
   problems

                Mayflower GmbH I 75
Build time
15 min on harddisk
 massive disk i/o
 4 min on ramdisk

                     Mayflower GmbH I 76
Complex setup


                Mayflower GmbH I 77
Jenkins:
Single point of failure!




                           Mayflower GmbH I 78
Goodies

          Mayflower GmbH I 79
everyone
can deploy
  (including the
 product owner)


                   Mayflower GmbH I 80
git bisect start
$BAD $GOOD


                    Mayflower GmbH I 81
30min from
bugreport to
  deploy

               Mayflower GmbH I 82
We can still do
hotfixes in this
 environment

                   Mayflower GmbH I 83
plotting plugin (gitstats)




                             Mayflower GmbH I 84
Mayflower GmbH I 85
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 %dn", p, m, diff)}';cd
      $olddir;) > gitnum.properties.all



echo YVALUE=$(cat gitnum.properties.all | cut
      -d' ' -f1) >> gitnum.properties.plus
                                              Mayflower GmbH I 86
Jenkins Plugin:
Chuck Norris
                  Mayflower GmbH I 87
Questions?




             Mayflower GmbH I 88
Thanks for listening!




      Contact   Florian Anderiasch
                florian.anderiasch@mayflower.de
                +49 89 242054 1134
                @anderiasch


                Mayflower GmbH
                Mannhardtstrasse 6
29.10.11        80538 München          Mayflower GmbH   89
Images
Vader (42), Sebastian Bergmann, CC-BY-SA
   http://www.flickr.com/photos/sebastian_bergmann/2282734669
 Clouds (52), John Mueller, CC-BY-NC-ND
       http://www.flickr.com/photos/johnmueller/52621490/




                                                                Mayflower GmbH I 90
Cinder
  Connecting CI server and IDE

     Help is welcome
http://github.com/winks/cinder

       needs XML from
   phpuc/hudson/bamboo
      and nothing else :)

                                 Mayflower GmbH I 91

One-Click Deployment with Jenkins