Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Automated Deployment with Phing

Automated Deployment with Phing

Given at ZendCon 2009

Daniel Cousineau

October 22, 2009
Tweet

More Decks by Daniel Cousineau

Other Decks in Programming

Transcript

  1. Who  Daniel Cousineau  The [Former] Hat Guy 

    Senior Software Applications Developer Texas A&M University Division of Student Affairs Department of IT  http://www.toosweettobesour.com/  @dcousineau Automated Deployment With Phing - Daniel Cousineau ZendCon '09 2
  2. They do the same thing every time (supposedly) Automated Deployment

    With Phing - Daniel Cousineau ZendCon '09 7
  3. At Any Given Time  New Code  New Configuration

     New Database Schema  New Static Files Automated Deployment With Phing - Daniel Cousineau ZendCon '09 8
  4. A Lot To Remember  Did you remember to upload

    ALL new files?  Did you remember to update your DB?  Did you remember to correct your config? Automated Deployment With Phing - Daniel Cousineau ZendCon '09 9
  5. Even Worse  Did you clear your caches?  Did

    you delete that old file/plugin?  In the upload process, was your configuration overwritten?  Did you upload ALL the changed files?  When did you last upload? Automated Deployment With Phing - Daniel Cousineau ZendCon '09 10
  6. Don’t Do More Work Than You Have To! Automated Deployment

    With Phing - Daniel Cousineau ZendCon '09 13
  7. What?  Automated deployment means a single command  Locks

    your live site  Uploads changed files  Clears caches and temporary files  Updates the database schema  Runs other cron tasks  Unlocks your live site Automated Deployment With Phing - Daniel Cousineau ZendCon '09 16
  8. Why?  Deployment is tricky  Simplicity is outweighed by

    variety  Repetition degrades quality  She sells sea shells by the sea shore Automated Deployment With Phing - Daniel Cousineau ZendCon '09 17
  9. When?  All the time!  Staging  Live 

    Probably best to use it on your dev box too! Automated Deployment With Phing - Daniel Cousineau ZendCon '09 18
  10. Tools of the Trade  Build System  Phing 

    Apache ANT  Capastrano  Plain PHP or BASH or BAT Files  File Transfer  Rsync (*NIX Environments)  Xcopy (Windows Environments)  Configuration Management  Database Migration  DBDeploy  Doctrine Automated Deployment With Phing - Daniel Cousineau ZendCon '09 20
  11. Phing Philosophy  Build scripts contains "Targets"  Targets should

    be small and specialized.  Example Targets:  clean  Clear temporary and cached files  copy  Copy files to their intended destination  migrate  Upgrade the database schema Automated Deployment With Phing - Daniel Cousineau ZendCon '09 21
  12. Phing Philosophy Cont.  Targets can have dependencies  Target

    "live" can depend on clean, copy, and migrate  Meaning, when we run the "live" target, it first runs clean, copy, then migrate  And any tasks they depend on Automated Deployment With Phing - Daniel Cousineau ZendCon '09 22
  13. Installing Phing  pear channel-discover pear.phing.info  pear install phing/Phing

     Want all the little dependencies?  pear config-set preferred_state alpha  pear install –alldeps phing/Phing  pear config-set preferred_state stable Automated Deployment With Phing - Daniel Cousineau ZendCon '09 23
  14. Running Phing  $> phing –v  Lists Phing version

     Phing expects to find a file "build.xml" in the current directory  build.xml defines the targets  You can use the "-f <filename>" flag to specify an alternate build file like  $> phing -f build-live.xml Automated Deployment With Phing - Daniel Cousineau ZendCon '09 24
  15. Syntax  XML  If you don’t already know it,

    you have bigger problems  Variables  ${variablename}  Conventions  Psuedo-Namespaces using periods  ${namespace.variable.name} Automated Deployment With Phing - Daniel Cousineau ZendCon '09 25
  16. Basic Conventions  build.xml  Central repository of your top-level

    tasks  build-*.xml  Can be included into build.xml.  Usually for grouping by target (dev, staging, live) or task (migrate, test, etc.)  build.properties  Technically an INI file that contains variables to be included by build files. Automated Deployment With Phing - Daniel Cousineau ZendCon '09 26
  17. Basic build.xml <?xml version="1.0" encoding="UTF-8"?> <project name="ZendCon" default="clean" basedir="."> <property

    file="build.properties" /> <target name="staging"> <phing phingfile="build-staging.xml" target="deploy" /> </target> </project> Automated Deployment With Phing - Daniel Cousineau ZendCon '09 27
  18. Basic build.properties source.directory = /src ## Database Configuration db.user =

    username db.pass = password db.host = localhost db.name = sample Automated Deployment With Phing - Daniel Cousineau ZendCon '09 28
  19. Techniques  Built in Phing Copy Task  Cross Platform

     Slow  Not over network  Rsync  Great for *NIX environments.  Almost guaranteed to be installed on  Linux, BSD, Mac OSX  Can be installed on Windows  Xcopy  Good for Windows environments  Faster than Phing Copy  Not over network  Version Control Checkout/Update  Syncs deleted files  User created files usually ignored Automated Deployment With Phing - Daniel Cousineau ZendCon '09 30
  20. Pitfalls  User created files are a HUGE pitfall 

    /htdocs/images/upload  Sync programs usually will delete content your deployment machine doesn’t have  What if user upload are mixed in with files you want to manage?  Solutions  Keep user created content completely separated. The further up the file tree and consolodated the better.  Separate static file server, Amazon S3, or other style CDNs Automated Deployment With Phing - Daniel Cousineau ZendCon '09 31
  21. Pitfalls  Cleanup Deleted Source Files  Usually only a

    problem when you have * include patterns  Also creates the previous user created file dillema Automated Deployment With Phing - Daniel Cousineau ZendCon '09 32
  22. Executing External Tools  Nearly all file transfer tools will

    be external commands  For this we need the Exec task <exec command="cp file1 file2" /> Automated Deployment With Phing - Daniel Cousineau ZendCon '09 33
  23. Rsync  So many different options you’re best off finding

    your own tutorials or reading MAN pages  rsync -aCvz -e 'ssh -i /path/to/ssh-key' ${project.basedir}/src user@domain: ${staging.deployment.directory}/ Automated Deployment With Phing - Daniel Cousineau ZendCon '09 34
  24. Rsync Options Of Note  -a archive-mode  Recursive copy,

    preserve everything, etc.  -C cvs-exclude  Ignore .cvs, .svn, and other version control artifacts  -v verbose  Know EXACTLY what’s going on  -z compress  Compress information transmitted  -e alternative remote shell  Use a custom SSH command (namely use key-pair) ZendCon '09 Automated Deployment With Phing - Daniel Cousineau 35
  25. Xcopy  Best when your live deployment process involves copying

    to a network share on Windows machines  xcopy ${project.basedir}${source.directory}\* ${staging.deployment.directory} /D /I /Y /S /E /Exclude:${project.basedir}\staging.deploy ment.exclude Automated Deployment With Phing - Daniel Cousineau ZendCon '09 36
  26. Xcopy Options Of Note  /D  Update only those

    files that are different (timestamps)  /I  Creates target directories if they don’t exist  /Y  Do not prompt  /S  Copy all directories and sub-directories…  /E  …Even if the directories are empty  /Exclude  Exclude files based on glob patterns ZendCon '09 Automated Deployment With Phing - Daniel Cousineau 37
  27. Techniques  Check incoming domain  www.domain.com means load production

    configuration  localhost/domain.com means load development configuration  Check for an environment file  Contents of DOCUMENT_ROOT/.env determine configuration  Copy over during deployment Automated Deployment With Phing - Daniel Cousineau ZendCon '09 40
  28. Check Incoming Domain  Pros  No chance for error

     Cons  Detection is a weak link  Especially when development, staging, and live have different web servers (e.g. Apache to IIS) Automated Deployment With Phing - Daniel Cousineau ZendCon '09 41
  29. Check for an Environment File  Pros  Consistent regardless

    of Server or OS changes  Easy to repair  Quick FTP or SSH  Easy Testing  Just swap file contents  Cons  Forget to copy changes? Automated Deployment With Phing - Daniel Cousineau ZendCon '09 42
  30. Copy Over During Deployment  Pros  Images and CSS

    now manageable  Reduce redundancy  Simple to repurpose regular push command  Cons  Difficult to manage  Forget to copy changes? Automated Deployment With Phing - Daniel Cousineau ZendCon '09 43
  31. Which Is Best?  Depends on your application architecture 

    Depends on your environment  You’ll know what’s best for your project  I use a combination of Environment File and Copy Over During Deployment Automated Deployment With Phing - Daniel Cousineau ZendCon '09 44
  32. Database Deployment Philosophy  “Versions” often referred to as “Deltas”

     Each Delta has an UP and a DOWN script  UP makes the changes  DOWN reverts the changes  Each change should be a non-destructive schema change  Unless of course you need data alteration Automated Deployment With Phing - Daniel Cousineau ZendCon '09 46
  33. DBDeploy Philosophy  Each delta is 2 native SQL scripts

     Separated by --//@undo  Database version is stored in a special table  Beware corruption! Automated Deployment With Phing - Daniel Cousineau ZendCon '09 47
  34. DBDeploy Under The Hood  Connect to the database, read

    from changelog table, get the most current revision installed  Retrieve all delta files newer that the current revision  Revision numbers are based off of alphabetic sorting, name your files accordingly  Pull all the “UP” changes and concatenate them to a migration script  Up to YOU to run the migration script Automated Deployment With Phing - Daniel Cousineau ZendCon '09 48
  35. Installing DBDeploy  Is Phing already installed? Great! So is

    DBDeploy…  Create the changelog table  Track the current version of your DB CREATE TABLE changelog ( change_number BIGINT NOT NULL, delta_set VARCHAR(10) NOT NULL, start_dt TIMESTAMP NOT NULL, complete_dt TIMESTAMP NULL, applied_by VARCHAR(100) NOT NULL, description VARCHAR(500) NOT NULL ); ALTER TABLE changelog ADD CONSTRAINT Pkchangelog PRIMARY KEY (change_number, delta_set); Automated Deployment With Phing - Daniel Cousineau ZendCon '09 49
  36. Basic Delta: 01_init.sql --// CREATE TABLE IF NOT EXISTS `users`

    ( `id` int(10) unsigned NOT NULL auto_increment, `handle` varchar(25) NOT NULL default '', PRIMARY KEY (`id`), UNIQUE KEY `users_handle_index` (`handle`) ) ENGINE=InnoDB DEFAULT; --//@UNDO DROP TABLE IF EXISTS `users`; --// Automated Deployment With Phing - Daniel Cousineau ZendCon '09 50
  37. Run Migration  First add a task to your Phing

    build file <target name="migrate"> </target> Automated Deployment With Phing - Daniel Cousineau ZendCon '09 51
  38. Run Migration  Generate the SQL migration file <target name="migrate">

    <dbdeploy url="mysql:host=${db.host};dbname=${db.name}" userid="${db.user}" password="${db.pass}" dir="${project.basedir}/db/deltas" outputfile="${project.basedir}/up.sql" undooutputfile="${project.basedir}/down.sql" /> </target> Automated Deployment With Phing - Daniel Cousineau ZendCon '09 52
  39. Run Migration  Execute the SQL script <target name="migrate"> <dbdeploy

    url="mysql:host=${db.host};dbname=${db.name}" userid="${db.user}" password="${db.pass}" dir="${project.basedir}/db/deltas" outputfile="${project.basedir}/uup.sql" undooutputfile="${project.basedir}/down.sql" /> <exec command="/usr/bin/mysql -h${db.local.host} -u${db.local.user} -p${db.local.pass} ${db.local.name} < ${project.basedir}/up.sql" dir="${project.basedir}" checkreturn="true"> </target> Automated Deployment With Phing - Daniel Cousineau ZendCon '09 53
  40. Pitfalls  Make sure you have a good CLI app

    for loading a SQL file  /usr/bin/mysql  mysql.exe  Build script travelling across operating systems?  Write your own Phing task to execute the migration output?  Was the changelog table created in the first place? Automated Deployment With Phing - Daniel Cousineau ZendCon '09 54
  41. Doctrine Database Migrations  Integrated into the Doctrine CLI tool

     ./doctrine migrate  Same philosophies  BUT, deltas are PHP objects that contain an UP and a DOWN method  Run using the Phing exec task Automated Deployment With Phing - Daniel Cousineau ZendCon '09 55
  42. Further Resources  The people around you  More people

    than you know automate their deployment  There are many, many different techniques  My techniques may suck for your particular setup  #phpc on freenode  Many of the speakers hang out there  Many smart people hang out there  I HANG OUT THERE! Automated Deployment With Phing - Daniel Cousineau ZendCon '09 58
  43. Further Resources  Blogs  http://phpdeveloper.org  Documentation  http://phing.info

     http://dbdeploy.com  Google  Experimentation  Pushing to a local directory  Pushing to a virtual machine Automated Deployment With Phing - Daniel Cousineau ZendCon '09 59