Building and deploying PHP applications with Phing
The document is about building and deploying PHP applications using Phing, a PHP project build tool. It discusses the advantages of using a build tool to automate repetitive tasks, the capabilities of Phing including scripting with XML build files, and various examples of its application in version control, unit testing, and deployment processes. Additionally, it covers extending Phing through custom tasks, mappers, and filters, while highlighting integration with continuous integration tools like Jenkins.
Overview of building PHP applications using Phing, tools for automation, and the speaker's background.
Discusses the necessity of build tools in software development: repetition, automation, and error reduction.
Introduces Phing as a PHP build tool based on Apache Ant with minimal dependencies and rich task integration.
Instructions on installing Phing, creating XML build files, using properties and filesets for configuration.
Utilizes mappers and filters for file operations during copying or moving, including transformations and filtering.
Demonstrates various use-cases for Phing including version control, unit testing, and reporting with PHPUnit.
Integration with documentation tools and examples of packaging applications in different formats such as TAR and PHAR.
Describes strategies for deploying applications, including copying files via SSH or FTP and using symbolic links.
Steps for managing database migrations with delta scripts, changelog tracking, and applying SQL changes.
Integration of Phing with CI tools like Jenkins for automated builds, testing, and deployments.
Techniques for adding new tasks and extensions to Phing for enhanced functionality and performance.Plans for improving Phing: performance, documentation, IDE support, and more tasks.
Final remarks, resource links, and invitation for questions on utilizing Phing effectively.
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
Why Use ABuild 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 ABuild 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 PhingDo
• 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 PhingDo
• 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 PhingDo
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
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
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
Copying to aserver
• 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
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