Upload
michiel-rook
View
39.498
Download
3
Embed Size (px)
DESCRIPTION
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!
Citation preview
Building and deploying PHP applicationswith Phing
Michiel Rook
PHP UK Conference 2012
About me
Building and deploying PHP applications with Phing
• Freelance PHP & Java contractor / consultant
• PHP since ’99
• Phing project lead
• http://www.linkedin.com/in/michieltcs
• @michieltcs
This Talk
Building and deploying PHP applications with Phing
• Why use a build tool
• What is Phing
• Usage
• Various examples
• Extending Phing
Why Use A Build Tool?
Why Use A Build Tool
Building and deploying PHP applications with Phing
Repetitionhttp://www.flickr.com/photos/andrewmalone/5162632817/
Repetition
Building and deploying PHP applications with Phing
• We are human
• We get bored
• We forget things
• We make mistakes
Repetition
Building and deploying PHP applications with Phing
• Version control
• (Unit) Testing
• Configuring
• Packaging
• Uploading
• DB changes
• ...
Repetition
Building and deploying PHP applications with Phing
• Version control
• (Unit) Testing
• Configuring
• Packaging
• Uploading
• DB changes
• ...
• Boring!
Why Use A Build Tool
Building and deploying PHP applications with Phing
Automate!http://www.flickr.com/photos/patrick_h/6209981673/
Automate!
Building and deploying PHP applications with Phing
• Developers, testers, administrators...
• Easier handover to new team members
• Improves quality
• Reduces errors
• Saves time
• Consolidate scripts, reduce technical debt
What Is Phing
Building and deploying PHP applications with Phing
http://www.flickr.com/photos/canucksfan604/5471322484/
What Is Phing
Building and deploying PHP applications with Phing
• PHing Is Not GNU make; it’s a PHP project build system or build toolbased on Apache Ant.
• Originally developed by Binarycloud
• Ported to PHP5 by Hans Lellelid
• 2004: my first commit
• 2009: lead
What Can Phing Do
Building and deploying PHP applications with Phing
• Scripting using XML build files
• Human readable
• Mostly cross-platform
• Minimal dependencies
• Interface to various popular (PHP) tools
What Can Phing Do
Building and deploying PHP applications with Phing
• Scripting using XML build files
• Human readable
• Mostly cross-platform
• Minimal dependencies
• Interface to various popular (PHP) tools
• ”Good glue”
What Can Phing Do
Building and deploying PHP applications with Phing
Why Use Phing
Building and deploying PHP applications with 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
The Basics
Installing Phing
Building and deploying PHP applications with Phing
• PEAR installation
$ pear channel-discover pear.phing.info$ pear install [--alldeps] phing/phing
• Optionally, install the documentation package
$ pear install phing/phingdocs
Build Files
Building and deploying PHP applications with Phing
• 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
Example Build File
Building and deploying PHP applications with Phing
<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
Properties
Building and deploying PHP applications with Phing
• Simple key-value files (.ini)
## build.propertiesversion=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>
Filesets
Building and deploying PHP applications with Phing
• 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"/>
Filesets
Building and deploying PHP applications with Phing
• 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>
Mappers & Filters
Building and deploying PHP applications with Phing
• Transform files during copy/move/...
• Mappers
• Change filename
• Flatten directories
• Filters
• Strip comments, white space
• Replace values
• Perform XSLT transformation
• Translation (i18n)
Mappers & Filters
Building and deploying PHP applications with Phing
<copy todir="${build}"><fileset refid="files"/><mapper type="glob" from="*.txt" to="*.new.txt"/><filterchain>
<replaceregexp><regexp pattern="\r\n" replace="\n"/><expandproperties/>
</replaceregexp></filterchain>
</copy>
Examples
Examples
Building and deploying PHP applications with Phing
• Version control
• Unit testing
• Packaging
• Deployment
• Database migration
• Continuous integration
Version Control
Building and deploying PHP applications with Phing
• (CVS), SVN, Git
<svncopyusername="michiel"password="test"repositoryurl="svn://localhost/phing/trunk/"todir="svn://localhost/phing/tags/1.0"/>
<svnexportrepositoryurl="svn://localhost/project/trunk/"todir="/home/michiel/dev"/>
<svnlastrevisionrepositoryurl="svn://localhost/project/trunk/"propertyname="lastrev"/>
<echo>Last revision: ${lastrev}</echo>
PHPUnit
Building and deploying PHP applications with Phing
• Built-in support for most configuration options
• Gathers code coverage information
• Various output formats (JUnit / Clover)
• Reporting (JUnit style)
PHPUnit Example
Building and deploying PHP applications with Phing
• 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 inclass HelloWorldTest): Failed asserting that two strings are equal.
PHPUnit Example
Building and deploying PHP applications with Phing
• 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>
PHPUnit Example
Building and deploying PHP applications with Phing
• 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>
Documentation
Building and deploying PHP applications with Phing
• 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>
DocBlox
Building and deploying PHP applications with Phing
Packaging
Building and deploying PHP applications with Phing
• 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="[email protected]"/><element key="role" value="lead"/>
</element></mapping>
</pearpkg>
Packaging - TAR / ZIP
Building and deploying PHP applications with Phing
<tar compression="gzip" destFile="package.tgz"basedir="build"/>
<zip destfile="htmlfiles.zip"><fileset dir=".">
<include name="**/*.html"/></fileset>
</zip>
Packaging - PHAR
Building and deploying PHP applications with Phing
<pharpackagecompression="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="[email protected]" />
</element></element>
</metadata></pharpackage>
Putting it all together - deployments
Copying to a server
Building and deploying PHP applications with Phing
• SSH
<scp username="john" password="smith"host="webserver" todir="/www/htdocs/project/"><fileset dir="test">
<include name="*.html"/></fileset>
</scp>
• FTP
<ftpdeployhost="server01"username="john"password="smit"dir="/var/www"><fileset dir=".">
<include name="*.html"/></fileset>
</ftpdeploy>
Symbolic links
Building and deploying PHP applications with Phing
• 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"/>
Multiple servers / targets
Building and deploying PHP applications with Phing
• 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="..."/>
Database Migration
Building and deploying PHP applications with Phing
• 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
)
Database Migration
Building and deploying PHP applications with Phing
• Delta scripts with do (up) & undo (down) parts
--//
CREATE TABLE ‘post‘ (‘title‘ VARCHAR(255),‘time_created‘ DATETIME,‘content‘ MEDIUMTEXT
);
--//@UNDO
DROP TABLE ‘post‘;
--//
Database Migration
Building and deploying PHP applications with Phing
<dbdeployurl="sqlite:test.db"dir="deltas"outputfile="deploy.sql"undooutputfile="undo.sql"/>
<pdosqlexecsrc="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
Database Migration
Building and deploying PHP applications with Phing
-- 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 changelogSET complete_dt = NOW()WHERE change_number = 1AND delta_set = ’Main’;
-- Fragment ends: 1 --
Database Migration
Building and deploying PHP applications with Phing
-- Fragment begins: 1 --
DROP TABLE ‘post‘;
--//
DELETE FROM changelogWHERE change_number = 1AND delta_set = ’Main’;
-- Fragment ends: 1 --
Phing & Jenkins
Building and deploying PHP applications with Phing
• Continuous integration
• Phing plugin
• Build periodically or after each commit
• Verify and test the build
• Deploy results
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
Building and deploying PHP applications with Phing
• Numerous extension points
• Tasks
• Types
• Selectors
• Filters
• Mappers
• Loggers
• ...
Sample Task
Building and deploying PHP applications with Phing
• 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);}
}
Sample Task
Building and deploying PHP applications with Phing
• 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>
Ad Hoc Extension
Building and deploying PHP applications with Phing
• 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>
Future Improvements
Building and deploying PHP applications with Phing
• More tasks & support
• Better performance
• PHAR package (including popular dependencies)
• More documentation
• Increased test coverage
• IDE support
Future Improvements
Building and deploying PHP applications with Phing
• More tasks & support
• Better performance
• PHAR package (including popular dependencies)
• More documentation
• Increased test coverage
• IDE support
• Pull requests! :-)
Helpful Links
Building and deploying PHP applications with Phing
• 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
Questions?
Building and deploying PHP applications with Phing
http://joind.in/4954
http://www.phing.info
#phing (freenode)
@phingofficial
Thank you!