Your SlideShare is downloading. ×
0
Building and deploying PHP applications               with Phing                Michiel Rook            PHP UK Conference ...
About me  • Freelance PHP & Java contractor / consultant  • PHP since ’99  • Phing project lead  • http://www.linkedin.com...
This Talk  • Why use a build tool  • What is Phing  • Usage  • Various examples  • Extending Phing                        ...
Why Use A Build Tool?
Why Use A Build Tool                                 Repetition              http://www.flickr.com/photos/andrewmalone/516...
Repetition  • We are human  • We get bored  • We forget things  • We make mistakes                       Building and depl...
Repetition  • Version control  • (Unit) Testing  • Configuring  • Packaging  • Uploading  • DB changes  • ...              ...
Repetition  • Version control  • (Unit) Testing  • Configuring  • Packaging  • Uploading  • DB changes  • ...  • Boring!   ...
Why Use A Build Tool                                 Automate!               http://www.flickr.com/photos/patrick_h/620998...
Automate!  • Developers, testers, administrators...  • Easier handover to new team members  • Improves quality  • Reduces ...
What Is Phing                http://www.flickr.com/photos/canucksfan604/5471322484/                                       ...
What Is Phing  • PHing Is Not GNU make; it’s a PHP project build system or build tool    based on Apache Ant.  • Originall...
What Can Phing Do  • Scripting using XML build files  • Human readable  • Mostly cross-platform  • Minimal dependencies  • ...
What Can Phing Do  • Scripting using XML build files  • Human readable  • Mostly cross-platform  • Minimal dependencies  • ...
What Can Phing Do                    Building and deploying PHP applications with Phing
Why Use Phing  • Ant?  • Rich set of tasks  • Integration with PHP specific tools  • Allows you to stay in the PHP infrastr...
The Basics
Installing Phing  • PEAR installation    $ pear channel-discover pear.phing.info    $ pear install [--alldeps] phing/phing...
Build Files  • Phing uses XML build files  • Contain standard elements       • Task: code that performs a specific function ...
Example Build File  <project name="Example" default="world">      <target name="hello">          <echo>Hello</echo>      <...
Properties  • Simple key-value files (.ini)  ## build.properties  version=1.0  • Can be expanded by using ${key} in the bui...
Filesets  • Constructs a group of files to process  • Supported by most tasks   <fileset dir="./application" includes="**"/...
Filesets  • Selectors allow fine-grained matching on certain attributes  • contains, date, file name & size, ...   <fileset ...
Mappers & Filters  • Transform files during copy/move/...  • Mappers      • Change filename      • Flatten directories  • Fi...
Mappers & Filters  <copy todir="${build}">      <fileset refid="files"/>      <mapper type="glob" from="*.txt" to="*.new.t...
Examples
Examples  • Version control  • Unit testing  • Packaging  • Deployment  • Database migration  • Continuous integration    ...
Version Control  • (CVS), SVN, Git  <svncopy     username="michiel"     password="test"     repositoryurl="svn://localhost...
PHPUnit  • Built-in support for most configuration options  • Gathers code coverage information  • Various output formats (...
PHPUnit Example  • Stop the build when a test fails  <phpunit haltonfailure="true" haltonerror="true"      bootstrap="my_b...
PHPUnit Example  • Determine which files to include in the coverage report  <coverage-setup database="reports/coverage.db">...
PHPUnit Example  • Generate some reports  <phpunitreport infile="reports/testsuites.xml"      format="frames" todir="repor...
Documentation  • Phing currently integrates with popular documentation tools      • DocBlox      • PhpDocumentor      • Ap...
DocBlox          Building and deploying PHP applications with Phing
Packaging  • Create bundles or packages  • Phing supports most popular formats: tar (pear), zip, phar  <pearpkg name="demo...
Packaging - TAR / ZIP   <tar compression="gzip" destFile="package.tgz"       basedir="build"/>   <zip destfile="htmlfiles....
Packaging - PHAR  <pharpackage          compression="gzip"          destfile="test.phar"          stub="stub.php"         ...
Putting it all together - deployments
Copying to a server  • SSH  <scp username="john" password="smith"      host="webserver" todir="/www/htdocs/project/">     ...
Symbolic links  • All releases stored in ”backup” directory  • Symlink application directory to latest release (similar to...
Multiple servers / targets  • Several deployment targets: testing, staging, production, ...  • Keep one property file per t...
Database Migration  • Set of delta SQL files (1-create-post.sql)  • Tracks current version of your db in changelog table  •...
Database Migration  • Delta scripts with do (up) & undo (down) parts  --//  CREATE TABLE ‘post‘ (      ‘title‘ VARCHAR(255...
Database Migration  <dbdeploy      url="sqlite:test.db"      dir="deltas"      outputfile="deploy.sql"      undooutputfile...
Database Migration  -- Fragment begins: 1 --  INSERT INTO changelog      (change_number, delta_set, start_dt, applied_by, ...
Database Migration  -- Fragment begins: 1 --  DROP TABLE ‘post‘;  --//  DELETE FROM changelog                             ...
Phing & Jenkins  • Continuous integration  • Phing plugin  • Build periodically or after each commit  • Verify and test th...
Phing & Jenkins                  Building and deploying PHP applications with Phing
Phing & Jenkins                  Building and deploying PHP applications with Phing
Phing & Jenkins                  Building and deploying PHP applications with Phing
Demonstration
Extending Phing
Extending Phing  • Numerous extension points      • Tasks      • Types      • Selectors      • Filters      • Mappers     ...
Sample Task  • Extends from Task  • Contains main() method and optionally init()  • Setter method for each attribute in th...
Sample Task  • Use taskdef to make Phing aware of your new task  <project name="Example" default="default">      <taskdef ...
Ad Hoc Extension  • Define a task within your build file  <target name="main">      <adhoc-task name="foo"><![CDATA[      cl...
Future Improvements  • More tasks & support  • Better performance  • PHAR package (including popular dependencies)  • More...
Future Improvements  • More tasks & support  • Better performance  • PHAR package (including popular dependencies)  • More...
Helpful Links  • http://pear.php.net/  • http://www.docblox-project.org/  • http://www.dbdeploy.com/  • http://www.jenkins...
Questions?             http://joind.in/4954             http://www.phing.info                #phing (freenode)            ...
Upcoming SlideShare
Loading in...5
×

Building and deploying PHP applications with Phing

41,116

Published on

Slides for my talk at the PHP UK Conference 2012.

Some of the examples discussed during the talk can be found at http://www.touchdownconsulting.nl/conferences/phing-phpuk2012-examples.tgz

If you attended, please leave me some feedback at http://joind.in/4954 - thanks!

Published in: Technology

Transcript of "Building and deploying PHP applications with Phing"

  1. 1. Building and deploying PHP applications with Phing Michiel Rook PHP UK Conference 2012
  2. 2. About me • Freelance PHP & Java contractor / consultant • PHP since ’99 • Phing project lead • http://www.linkedin.com/in/michieltcs • @michieltcs Building and deploying PHP applications with Phing
  3. 3. This Talk • Why use a build tool • What is Phing • Usage • Various examples • Extending Phing Building and deploying PHP applications with Phing
  4. 4. Why Use A Build Tool?
  5. 5. Why Use A Build Tool Repetition http://www.flickr.com/photos/andrewmalone/5162632817/ Building and deploying PHP applications with Phing
  6. 6. Repetition • We are human • We get bored • We forget things • We make mistakes Building and deploying PHP applications with Phing
  7. 7. Repetition • Version control • (Unit) Testing • Configuring • Packaging • Uploading • DB changes • ... Building and deploying PHP applications with Phing
  8. 8. Repetition • Version control • (Unit) Testing • Configuring • Packaging • Uploading • DB changes • ... • Boring! Building and deploying PHP applications with Phing
  9. 9. Why Use A Build Tool Automate! http://www.flickr.com/photos/patrick_h/6209981673/ Building and deploying PHP applications with Phing
  10. 10. Automate! • Developers, testers, administrators... • Easier handover to new team members • Improves quality • Reduces errors • Saves time • Consolidate scripts, reduce technical debt Building and deploying PHP applications with Phing
  11. 11. What Is Phing http://www.flickr.com/photos/canucksfan604/5471322484/ Building and deploying PHP applications with Phing
  12. 12. What Is Phing • PHing Is Not GNU make; it’s a PHP project build system or build tool based on Apache Ant. • Originally developed by Binarycloud • Ported to PHP5 by Hans Lellelid • 2004: my first commit • 2009: lead Building and deploying PHP applications with Phing
  13. 13. What Can Phing Do • Scripting using XML build files • Human readable • Mostly cross-platform • Minimal dependencies • Interface to various popular (PHP) tools Building and deploying PHP applications with Phing
  14. 14. What Can Phing Do • Scripting using XML build files • Human readable • Mostly cross-platform • Minimal dependencies • Interface to various popular (PHP) tools • ”Good glue” Building and deploying PHP applications with Phing
  15. 15. What Can Phing Do Building and deploying PHP applications with Phing
  16. 16. Why Use Phing • Ant? • Rich set of tasks • Integration with PHP specific tools • Allows you to stay in the PHP infrastructure • Easy to extend • Embed PHP code directly in the build file Building and deploying PHP applications with Phing
  17. 17. The Basics
  18. 18. Installing Phing • PEAR installation $ pear channel-discover pear.phing.info $ pear install [--alldeps] phing/phing • Optionally, install the documentation package $ pear install phing/phingdocs Building and deploying PHP applications with Phing
  19. 19. Build Files • Phing uses XML build files • Contain standard elements • Task: code that performs a specific function (svn checkout, mkdir, etc.) • Target: groups of tasks, can optionally depend on other targets • Project: root node, contains multiple targets Building and deploying PHP applications with Phing
  20. 20. Example Build File <project name="Example" default="world"> <target name="hello"> <echo>Hello</echo> </target> <target name="world" depends="hello"> <echo>World!</echo> </target> </project> Buildfile: /home/michiel/phing/simple.xml Example > hello: [echo] Hello Example > world: [echo] World! BUILD FINISHED Building and deploying PHP applications with Phing
  21. 21. Properties • Simple key-value files (.ini) ## build.properties version=1.0 • Can be expanded by using ${key} in the build file $ phing -propertyfile build.properties ... <project name="Example" default="default"> <target name="default"> <property file="build.properties" /> <echo>${version}</echo> </target> </project> Building and deploying PHP applications with Phing
  22. 22. Filesets • Constructs a group of files to process • Supported by most tasks <fileset dir="./application" includes="**"/> <fileset dir="./application"> <include name="**/*.php" /> <exclude name="**/*Test.php" /> </fileset> • References: define once, use many <fileset dir="./application" includes="**" id="files"/> <fileset refid="files"/> Building and deploying PHP applications with Phing
  23. 23. Filesets • Selectors allow fine-grained matching on certain attributes • contains, date, file name & size, ... <fileset dir="${dist}"> <and> <filename name="**"/> <date datetime="01/01/2011" when="before"/> </and> </fileset> Building and deploying PHP applications with Phing
  24. 24. Mappers & Filters • Transform files during copy/move/... • Mappers • Change filename • Flatten directories • Filters • Strip comments, white space • Replace values • Perform XSLT transformation • Translation (i18n) Building and deploying PHP applications with Phing
  25. 25. Mappers & Filters <copy todir="${build}"> <fileset refid="files"/> <mapper type="glob" from="*.txt" to="*.new.txt"/> <filterchain> <replaceregexp> <regexp pattern="rn" replace="n"/> <expandproperties/> </replaceregexp> </filterchain> </copy> Building and deploying PHP applications with Phing
  26. 26. Examples
  27. 27. Examples • Version control • Unit testing • Packaging • Deployment • Database migration • Continuous integration Building and deploying PHP applications with Phing
  28. 28. Version Control • (CVS), SVN, Git <svncopy username="michiel" password="test" repositoryurl="svn://localhost/phing/trunk/" todir="svn://localhost/phing/tags/1.0"/> <svnexport repositoryurl="svn://localhost/project/trunk/" todir="/home/michiel/dev"/> <svnlastrevision repositoryurl="svn://localhost/project/trunk/" propertyname="lastrev"/> <echo>Last revision: ${lastrev}</echo> Building and deploying PHP applications with Phing
  29. 29. PHPUnit • Built-in support for most configuration options • Gathers code coverage information • Various output formats (JUnit / Clover) • Reporting (JUnit style) Building and deploying PHP applications with Phing
  30. 30. PHPUnit Example • Stop the build when a test fails <phpunit haltonfailure="true" haltonerror="true" bootstrap="my_bootstrap.php" printsummary="true"> <batchtest> <fileset dir="src"> <include name="**/*Test.php"/> </fileset> </batchtest> </phpunit> Buildfile: /home/michiel/phpunit/build.xml Demo > test: [phpunit] Total tests run: 1, Failures: 1, Errors: 0, Incomplete: 0, Skipped: 0, Time elapsed: 0.00591 s Execution of target "test" failed for the following reason: /home/michiel/phpunit/build.xml:3:44: Test FAILURE (testSayHello in class HelloWorldTest): Failed asserting that two strings are equal. Building and deploying PHP applications with Phing
  31. 31. PHPUnit Example • Determine which files to include in the coverage report <coverage-setup database="reports/coverage.db"> <fileset dir="src"> <include name="**/*.php"/> <exclude name="**/*Test.php"/> </fileset> </coverage-setup> • Gather code coverage and other data during the test run <phpunit codecoverage="true"> <formatter type="xml" todir="reports"/> <batchtest> <fileset dir="src"> <include name="**/*Test.php"/> </fileset> </batchtest> </phpunit> Building and deploying PHP applications with Phing
  32. 32. PHPUnit Example • Generate some reports <phpunitreport infile="reports/testsuites.xml" format="frames" todir="reports/tests"/> <coverage-report outfile="reports/coverage.xml"> <report todir="reports/coverage" title="Demo"/> </coverage-report> Building and deploying PHP applications with Phing
  33. 33. Documentation • Phing currently integrates with popular documentation tools • DocBlox • PhpDocumentor • ApiGen • Also supports r(e)ST (reStructuredText) <docblox title="Phing API Documentation" output="docs" quiet="true"> <fileset dir="../../classes"> <include name="**/*.php"/> </fileset> </docblox> Building and deploying PHP applications with Phing
  34. 34. DocBlox Building and deploying PHP applications with Phing
  35. 35. Packaging • Create bundles or packages • Phing supports most popular formats: tar (pear), zip, phar <pearpkg name="demo" dir="."> <fileset refid="files"/> <option name="outputdirectory" value="./build"/> <option name="description">Test package</option> <option name="version" value="0.1.0"/> <option name="state" value="beta"/> <mapping name="maintainers"> <element> <element key="handle" value="test"/> <element key="name" value="Test"/> <element key="email" value="test@test.nl"/> <element key="role" value="lead"/> </element> </mapping> </pearpkg> Building and deploying PHP applications with Phing
  36. 36. Packaging - TAR / ZIP <tar compression="gzip" destFile="package.tgz" basedir="build"/> <zip destfile="htmlfiles.zip"> <fileset dir="."> <include name="**/*.html"/> </fileset> </zip> Building and deploying PHP applications with Phing
  37. 37. Packaging - PHAR <pharpackage compression="gzip" destfile="test.phar" stub="stub.php" basedir="."> <fileset dir="hello"> <include name="**/**" /> </fileset> <metadata> <element name="version" value="1.0" /> <element name="authors"> <element name="John Doe"> <element name="e-mail" value="john@example.com" /> </element> </element> </metadata> </pharpackage> Building and deploying PHP applications with Phing
  38. 38. Putting it all together - deployments
  39. 39. Copying to a server • SSH <scp username="john" password="smith" host="webserver" todir="/www/htdocs/project/"> <fileset dir="test"> <include name="*.html"/> </fileset> </scp> • FTP <ftpdeploy host="server01" username="john" password="smit" dir="/var/www"> <fileset dir="."> <include name="*.html"/> </fileset> </ftpdeploy> Building and deploying PHP applications with Phing
  40. 40. Symbolic links • All releases stored in ”backup” directory • Symlink application directory to latest release (similar to Capistrano) • Allows for easy (code) rollbacks <svnlastrevision repositoryurl="${deploy.svn}" property="deploy.rev"/> <svnexport repositoryurl="${deploy.svn}" todir="/www/releases/build-${deploy.rev}"/> <symlink target="/www/releases/build-${deploy.rev}" link="/www/current"/> • Also on a remote server <ssh host="webserver" command="ln -s /www/releases/build-${deploy.rev} /www/current"/> Building and deploying PHP applications with Phing
  41. 41. Multiple servers / targets • Several deployment targets: testing, staging, production, ... • Keep one property file per target • Select property file based on input <input propertyname="env" validargs="testing,staging,production"> Enter environment name </input> <property file="${env}.properties"/> <ssh host="${deploy.host}" command="..."/> Building and deploying PHP applications with Phing
  42. 42. Database Migration • Set of delta SQL files (1-create-post.sql) • Tracks current version of your db in changelog table • Generates do and undo SQL files 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 ) Building and deploying PHP applications with Phing
  43. 43. Database Migration • Delta scripts with do (up) & undo (down) parts --// CREATE TABLE ‘post‘ ( ‘title‘ VARCHAR(255), ‘time_created‘ DATETIME, ‘content‘ MEDIUMTEXT ); --//@UNDO DROP TABLE ‘post‘; --// Building and deploying PHP applications with Phing
  44. 44. Database Migration <dbdeploy url="sqlite:test.db" dir="deltas" outputfile="deploy.sql" undooutputfile="undo.sql"/> <pdosqlexec src="deploy.sql" url="sqlite:test.db"/> Buildfile: /home/michiel/dbdeploy/build.xml Demo > migrate: [dbdeploy] Getting applied changed numbers from DB: mysql:host=localhost;dbname=demo [dbdeploy] Current db revision: 0 [dbdeploy] Checkall: [pdosqlexec] Executing file: /home/michiel/dbdeploy/deploy.sql [pdosqlexec] 3 of 3 SQL statements executed successfully BUILD FINISHED Building and deploying PHP applications with Phing
  45. 45. Database Migration -- Fragment begins: 1 -- INSERT INTO changelog (change_number, delta_set, start_dt, applied_by, description) VALUES (1, ’Main’, NOW(), ’dbdeploy’, ’1-create_initial_schema.sql’); --// CREATE TABLE ‘post‘ ( ‘title‘ VARCHAR(255), ‘time_created‘ DATETIME, ‘content‘ MEDIUMTEXT ); UPDATE changelog SET complete_dt = NOW() WHERE change_number = 1 AND delta_set = ’Main’; -- Fragment ends: 1 -- Building and deploying PHP applications with Phing
  46. 46. Database Migration -- Fragment begins: 1 -- DROP TABLE ‘post‘; --// DELETE FROM changelog WHERE change_number = 1 AND delta_set = ’Main’; -- Fragment ends: 1 -- Building and deploying PHP applications with Phing
  47. 47. Phing & Jenkins • Continuous integration • Phing plugin • Build periodically or after each commit • Verify and test the build • Deploy results Building and deploying PHP applications with Phing
  48. 48. Phing & Jenkins Building and deploying PHP applications with Phing
  49. 49. Phing & Jenkins Building and deploying PHP applications with Phing
  50. 50. Phing & Jenkins Building and deploying PHP applications with Phing
  51. 51. Demonstration
  52. 52. Extending Phing
  53. 53. Extending Phing • Numerous extension points • Tasks • Types • Selectors • Filters • Mappers • Loggers • ... Building and deploying PHP applications with Phing
  54. 54. Sample Task • Extends from Task • Contains main() method and optionally init() • Setter method for each attribute in the build file class SampleTask extends Task { private $var; public function setVar($v) { $this->var = $v; } public function main() { $this->log("value: " . $this->var); } } Building and deploying PHP applications with Phing
  55. 55. Sample Task • Use taskdef to make Phing aware of your new task <project name="Example" default="default"> <taskdef name="sample" classpath="/dev/src" classname="tasks.my.SampleTask" /> <target name="default"> <sample var="Hello World" /> </target> </project> Building and deploying PHP applications with Phing
  56. 56. Ad Hoc Extension • Define a task within your build file <target name="main"> <adhoc-task name="foo"><![CDATA[ class FooTest extends Task { private $bar; function setBar($bar) { $this->bar = $bar; } function main() { $this->log("In FooTest: " . $this->bar); } } ]]></adhoc-task> <foo bar="TEST"/> </target> Building and deploying PHP applications with Phing
  57. 57. Future Improvements • More tasks & support • Better performance • PHAR package (including popular dependencies) • More documentation • Increased test coverage • IDE support Building and deploying PHP applications with Phing
  58. 58. Future Improvements • More tasks & support • Better performance • PHAR package (including popular dependencies) • More documentation • Increased test coverage • IDE support • Pull requests! :-) Building and deploying PHP applications with Phing
  59. 59. Helpful Links • http://pear.php.net/ • http://www.docblox-project.org/ • http://www.dbdeploy.com/ • http://www.jenkins-ci.org/ • http://www.phing.info/docs/guide/stable/ • http://github.com/phingofficial/phing Building and deploying PHP applications with Phing
  60. 60. Questions? http://joind.in/4954 http://www.phing.info #phing (freenode) @phingofficial Thank you! Building and deploying PHP applications with Phing
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×