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!
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. This Talk
• Why use a build tool
• What is Phing
• Usage
• Various examples
• Extending Phing
Building and deploying PHP applications with Phing
5. Why Use A Build Tool
Repetition
http://www.flickr.com/photos/andrewmalone/5162632817/
Building and deploying PHP applications with Phing
6. Repetition
• We are human
• We get bored
• We forget things
• We make mistakes
Building and deploying PHP applications with Phing
7. Repetition
• Version control
• (Unit) Testing
• Configuring
• Packaging
• Uploading
• DB changes
• ...
Building and deploying PHP applications with Phing
8. Repetition
• Version control
• (Unit) Testing
• Configuring
• Packaging
• Uploading
• DB changes
• ...
• Boring!
Building and deploying PHP applications with Phing
9. Why Use A Build Tool
Automate!
http://www.flickr.com/photos/patrick_h/6209981673/
Building and deploying PHP applications with Phing
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. What Is Phing
http://www.flickr.com/photos/canucksfan604/5471322484/
Building and deploying PHP applications with Phing
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. 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. 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. What Can Phing Do
Building and deploying PHP applications with Phing
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
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. 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. 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. 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. 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. 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. 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. 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
27. Examples
• Version control
• Unit testing
• Packaging
• Deployment
• Database migration
• Continuous integration
Building and deploying PHP applications with Phing
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. 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. 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. 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. 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. 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. DocBlox
Building and deploying PHP applications with Phing
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. 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
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. 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. 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. 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. 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. 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. 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. 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. 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. Phing & Jenkins
Building and deploying PHP applications with Phing
49. Phing & Jenkins
Building and deploying PHP applications with Phing
50. Phing & Jenkins
Building and deploying PHP applications with Phing
53. Extending Phing
• Numerous extension points
• Tasks
• Types
• Selectors
• Filters
• Mappers
• Loggers
• ...
Building and deploying PHP applications with Phing
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. 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. 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. 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. 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. 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. Questions?
http://joind.in/4954
http://www.phing.info
#phing (freenode)
@phingofficial
Thank you!
Building and deploying PHP applications with Phing