82
APPLICATIONS CONTINUOUSLY DELIVERING

Continous Delivering a PHP application

Embed Size (px)

Citation preview

Page 1: Continous Delivering a PHP application

APPLICATIONS

CONTINUOUSLY!DELIVERING

Page 2: Continous Delivering a PHP application

Javier López @loalf

Senior Platform Engineer @Rightster!formerly Software Architect @TimeOut

Certified Symfony Developer

Zend Certified PHP

Co-organizer @desymfony

Page 3: Continous Delivering a PHP application

DISCLAIMER

Page 4: Continous Delivering a PHP application

AGENDA

CONTINUOUS DELIVERY IN A NUTSHELL

BUILDING THE PIPELINE

BEFORE AND AFTER

1

2

3

Page 5: Continous Delivering a PHP application

CONTINUOUS DELIVERY …

… IN A NUTSHELL

1

Page 6: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

When and how a change in your code is going to trigger the pipeline

Page 7: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Check the integrity of your code. Produce an artifact.

Page 8: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Check the integrity of your product. !

After this step you should be 100% confident that you could deploy your artifact.

Page 9: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Does what it says on the tin. Triggering this step should be “a click away”.

Manual

Page 10: Continous Delivering a PHP application

THE BOOK

Page 11: Continous Delivering a PHP application

THE PIPELINEBUILDING

2

Page 12: Continous Delivering a PHP application

TOOLS!OF THE TRADE

Page 13: Continous Delivering a PHP application
Page 14: Continous Delivering a PHP application
Page 15: Continous Delivering a PHP application

Github pluginhttps://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin

Build Pipeline Pluginhttps://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin

Page 16: Continous Delivering a PHP application
Page 17: Continous Delivering a PHP application
Page 18: Continous Delivering a PHP application
Page 19: Continous Delivering a PHP application

BUILDING!THE PIPELINE

Page 20: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

master

6ebb017

Page 21: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

master

featureA

6ebb017

Page 22: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

master

featureA

6ebb017

PULL REQUEST

Page 23: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

master

featureA

6ebb017 9046c48

Page 24: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

master

featureA

6ebb017 9046c48

BUILD TEST DEPLOY

Page 25: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Page 26: Continous Delivering a PHP application

1. Check out master branch

COMMIT BUILD TEST DEPLOY

Page 27: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

COMMIT BUILD TEST DEPLOY

Page 28: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies

COMMIT BUILD TEST DEPLOY

Page 29: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies

COMMIT BUILD TEST DEPLOY

—optimizer-­‐autoload  —prefer-­‐dist

Page 30: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies

COMMIT BUILD TEST DEPLOY

Page 31: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests

COMMIT BUILD TEST DEPLOY

Page 32: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies

COMMIT BUILD TEST DEPLOY

Page 33: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)

COMMIT BUILD TEST DEPLOY

Page 34: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)7. Generate artifact (zip file)

COMMIT BUILD TEST DEPLOY

Page 35: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)7. Generate artifact (zip file)

COMMIT BUILD TEST DEPLOY

discard unnecessary files

Page 36: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)7. Generate artifact (zip file)

COMMIT BUILD TEST DEPLOY

Page 37: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)7. Generate artifact (zip file)8. Upload artifact to S3

COMMIT BUILD TEST DEPLOY

Page 38: Continous Delivering a PHP application

1. Check out master branch2. Generate parameters.ini for each environment

3. Fetch PHP dependencies4. Run PHPUnit tests5. Fetch JS dependencies6. Generate assets (JS, CSS)7. Generate artifact (zip file)8. Upload artifact to S3

COMMIT BUILD TEST DEPLOYbuild.xml

Page 39: Continous Delivering a PHP application

<?xml  version="1.0"  encoding="UTF-­‐8"  ?>  <project  name="Time  Out  Miyagi"  description="Time  Out  Website  V4"  default="build"    !    <!-­‐-­‐  Install  PHP  dependencies  (composer)  -­‐-­‐>      <target  name="build:php-­‐dependencies"  depends="build:params">          <echo  msg="Installing  PHP  dependencies  (composer  install)"  />          <exec  command="/opt/composer/composer.phar  install  -­‐-­‐optimize-­‐autoloader  -­‐-­‐prefer-­‐dist"                        logoutput="true"                        checkreturn=“true"          />      </target>  !    <!-­‐-­‐  Test  JS  &  Generate  JS/CSS  assets  (grunt)  -­‐-­‐>      <target  name="build:frontend-­‐dependencies">          <echo  msg="Test  JS  and  Generate  JS/CSS  assets  (grunt)"  />          <exec  command="npm  install"                        logoutput="true"  checkreturn="true"  dir="./web-­‐src"  />          <exec  command="xvfb-­‐run  grunt  -­‐-­‐env=dist"                        logoutput="true"  checkreturn="true"  dir="./web-­‐src"  />          </target>      </project>

build.xml

Page 40: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Split into two jobs in Jenkins 1. Test deployment script 2. Run automated tests

Page 41: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

Page 42: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server

Page 43: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S3

Page 44: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S33. Unzip artifact

Page 45: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S33. Unzip artifact4. Set right permissions

Page 46: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S33. Unzip artifact4. Set right permissions5. Update virtual host

Page 47: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S33. Unzip artifact4. Set right permissions5. Update virtual host6. Reload PHP-FPM and nginx

Page 48: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

DEPLOYMENT SCRIPT

1. SSH to QA server2. Fetch artifact from S33. Unzip artifact4. Set right permissions5. Update virtual host6. Reload PHP-FPM and nginxdeploy.yml

Page 49: Continous Delivering a PHP application

-­‐-­‐-­‐  -­‐  hosts:  qa:beta:prod      sudo:  true      vars:          amazon_bucket  :  "releases-­‐miyagi"          base_dir            :  "/var/www/v4.timeout.com"          project_dir      :  "{{  base_dir  }}/{{  git_hash  }}"          web_dir              :  "{{  project_dir  }}/web"      tasks:          -­‐  name:  Fetch  artefact  from  S3              s3:  bucket={{  amazon_bucket  }}  aws_access_key={{  amazon_key  }}  aws_secret_key={{  amazon_secret  }}  object={{  git_hash  }}.gzip  dest="{{  project_dir  }}/{{artefact_zip}}"  mode="get"  !        -­‐  name:  Uncompress  zip  file              command:  chdir="{{  project_dir  }}"  tar  -­‐xf  {{  artefact_zip  }}  !        -­‐  name:  Apply  right  permissions  to  project  root              file:  dest="{{  project_dir  }}"  state=directory  mode=0755  group=nginx  owner=nginx  recurse=true                    -­‐  name:  Restart  PHP-­‐FPM                service:  name=php-­‐fpm  state=reloaded

deploy.yml

Page 50: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

RUN AUTOMATED TESTS

Page 51: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

RUN AUTOMATED TESTS

1. Check out 9046c48

Page 52: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

RUN AUTOMATED TESTS

1. Check out 9046c48

2. Fetch PHP dependencies

Page 53: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

RUN AUTOMATED TESTS

1. Check out 9046c48

2. Fetch PHP dependencies3. Run Behat against QA box

Page 54: Continous Delivering a PHP application

COMMIT BUILD TEST DEPLOY

Split into two jobs in Jenkins 1. Run deployment script (production) 2. Run automated tests against production

Page 55: Continous Delivering a PHP application

BUILD DEPLOY AUTOMATED!TESTS

6ebb017

6ebb017

QA

6ebb017

QA

DEPLOY AUTOMATED!TESTS

6ebb017

PROD

6ebb017

PROD

6ebb017

6ebb017.zip

Page 56: Continous Delivering a PHP application

BUILD DEPLOY AUTOMATED!TESTS

6ebb017

6ebb017

QA

6ebb017

QA

DEPLOY AUTOMATED!TESTS

6ebb017

STAGING

6ebb017

STAGING

DEPLOY AUTOMATED!TESTS

6ebb017

PROD

6ebb017

PROD

6ebb017

6ebb017.zip

SAFETY NET

Page 57: Continous Delivering a PHP application

TIME

Page 58: Continous Delivering a PHP application

BUILD DEPLOY AUTOMATED!TESTS

~3 mins ~30 secs ~5 mins

Page 59: Continous Delivering a PHP application

VISIBILITYEVERYBODY IN THE TEAM SHOULD BE

AWARE OF THE STATUS OF THE PIPELINE

Page 60: Continous Delivering a PHP application

BUILD DEPLOY AUTOMATED!TESTS

9046c48

9046c48

QA

9046c48

QA9046c48

BUILD DEPLOY AUTOMATED!TESTS

6ebb017

6ebb017

QA

6ebb017

QA6ebb017

BUILD DEPLOY AUTOMATED!TESTS

b0b325

b0b325

QA

b0b325

QAb0b325

BUILD DEPLOY AUTOMATED!TESTS

99e6d6

99e6d6

QA

99e6d6

QA99e6d6

Page 61: Continous Delivering a PHP application

http://www.frisnit.com/internet-of-things-ci-status-lamp/

Page 62: Continous Delivering a PHP application

TRACEABILITYEVERYBODY SHOULD KNOW WHAT VERSION

IS DEPLOYED IN WHICH ENVIRONMENT

Page 63: Continous Delivering a PHP application

curl  -­‐I  http://www.timeout.com/las-­‐vegas  !HTTP/1.1  200  OK  Server:  nginx/1.4.7  Vary:  Accept-­‐Encoding  Cache-­‐Control:  no-­‐cache  Content-­‐Type:  text/html;  charset=UTF-­‐8  Date:  Fri,  19  Sep  2014  06:07:29  GMT  Transfer-­‐Encoding:  chunked  Access-­‐Control-­‐Allow-­‐Origin:  http://media.timeout.com  Connection:  Keep-­‐Alive  X-­‐TIMEOUT-­‐V:  d645127afb423e543d90ab5a7b8eae94f248b137  X-­‐Powered-­‐By:  PHP/5.5.14

VERSION NUMBER

Page 64: Continous Delivering a PHP application

https://github.com                /your-­‐company                /your-­‐application                /commits                /your-­‐git-­‐hash

Page 65: Continous Delivering a PHP application
Page 66: Continous Delivering a PHP application

ROLLING!BACK

Page 67: Continous Delivering a PHP application

AUTOMATION

Page 68: Continous Delivering a PHP application
Page 69: Continous Delivering a PHP application

YOU’LL NEED!ALLIES

Page 70: Continous Delivering a PHP application

YOUR ALLIES

Page 71: Continous Delivering a PHP application

DEV TEAM

YOUR ALLIES

Page 72: Continous Delivering a PHP application

DEV TEAMQA TEAM

YOUR ALLIES

Page 73: Continous Delivering a PHP application

DEV TEAMQA TEAMDEVOPS

YOUR ALLIES

Page 74: Continous Delivering a PHP application

DEV TEAMQA TEAMDEVOPSPRODUCT

YOUR ALLIES

Page 75: Continous Delivering a PHP application

DEV TEAMQA TEAMDEVOPSPRODUCTTHE TOP BRASS

YOUR ALLIES

Page 76: Continous Delivering a PHP application

BEFORE AFTER &

3

Page 77: Continous Delivering a PHP application

ONE QA BOX PER FEATURE

SAME QA BOX FOR EVERYONE

BEFORE

AFTER

Page 78: Continous Delivering a PHP application

~ !WEEKS FROM DEVELOPMENT TO RELEASE

~ !DAYS FROM DEVELOPMENT TO RELEASE

BEFORE

AFTER

Page 79: Continous Delivering a PHP application

5 PEOPLE TO RELEASE TO PRODUCTION

1 PERSON TO RELEASE TO PRODUCTION

BEFORE

AFTER

Page 80: Continous Delivering a PHP application

~30 MINUTES TO RUN DEPLOYMENT SCRIPT

~30 SECONDS TO RUN DEPLOYMENT SCRIPT

BEFORE

AFTER

Page 81: Continous Delivering a PHP application

RELEASING WAS AN EVENT

RELEASING NOW A NON-EVENT

BEFORE

AFTER

Page 82: Continous Delivering a PHP application

@loalf