SlideShare ist ein Scribd-Unternehmen logo
1 von 78
Downloaden Sie, um offline zu lesen
Building and deploying PHP apps with
>< ><
Michiel Rook
PHP Johannesburg April 2014
About me
• Freelance PHP & Java contractor / consultant
• PHP since '99
• Phing project lead
• Dutch Web Alliance
• http://www.linkedin.com/in/michieltcs
• @michieltcs
This talk
• Why a build tool
• What is Phing
• Usage
• Various examples
• Deployments
• Extending Phing
Why a build tool?
This is PHP!?
Repetitive tasks
• Version control
• Database changes
• Testing
• Minifying
• Packaging
• Uploading
• Deploying
• Configuring
Good programmers are lazy
Good programmers automate repeatable
things
Automate!
• Easier handover
• Improves quality
• Reduces errors
• Saves time
• Consolidate scripts, reduce technical debt
What is Phing?
Phing is AWESOME
What is Phing?
• “PHing Is Not GNU make; it's a PHP project build system
or build tool based on Apache Ant.”
• XML build files
• Mostly cross-platform
• Integrates various popular (PHP) tools
• Lots. Of. Tasks.
"Phing is good glue"
The basics
Installing Phing
• PEAR installation
$ pear channel-discover pear.phing.info
$ pear install [--alldeps] phing/phing
• Optionally, install the documentation package
$ pear install phing/phingdocs
• Composer
• Phar package
Build file
• XML
• Contains standard elements
• Task: performs a specific function (copy, git commit, etc.)
• Target: collection of tasks, can optionally depend on other
targets
• Project: root node, contains multiple targets
Example build file
<project name="Example" default="world">
<echo>Hi!</echo>
<target name="hello">
<echo>Hello</echo>
</target>
<target name="world" depends="hello">
<echo>World!</echo>
</target>
</project>
Example build file
$ phing [-f build.xml]
Buildfile: /home/michiel/phing/build.xml
[echo] Hi!
Example > hello:
[echo] Hello
Example > world:
[echo] World!
BUILD FINISHED
Properties
• Simple key-value pairs
• ${attribute}
• Replaced by actual value
Properties
<project name="Example" default="default">
<target name="default">
<property file="build.properties" />
<property name="foo" value="bar" />
<echo>${foo}</echo>
</target>
</project>
Properties
$ phing
Buildfile: /home/michiel/phing/build.xml
Example > default:
[echo] bar
BUILD FINISHED
Fileset
• Denotes a group of files
• Include or exclude files based on patterns
• References: define once, use many
Fileset
<copy todir="build">
<fileset dir="./application">
<include name="**/*.php" />
<exclude name="**/*Test.php" />
</fileset>
</copy>
<fileset dir="./application" includes="**"/>
<fileset dir="./application" includes="**" id="files"/>
<fileset refid="files"/>
Fileset
• 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>
Conditions
• Nested elements that evaluate to booleans
• Used in "condition", "if" and "waitfor" tasks
Conditions
<if>
<equals arg1="${foo}" arg2="bar" />
<then>
<echo message="The value of property foo is bar" />
</then>
<else>
<echo message="The value of property foo is not bar" />
</else>
</if>
Conditions
<if>
<available file="composer.json" />
<then>
<exec checkreturn="true" command="composer install"
passthru="true" logoutput="true" dir="build" />
</then>
</if>
Examples
Examples
• Version control
• Unit testing
• Packaging
• Deployment
• Database migration
• Continuous integration
Version control
• Git
• SVN
• CVS
Version control
<svnexport
repositoryurl="svn://localhost/project/trunk/"
todir="/home/michiel/dev"/>
<svnlastrevision
repositoryurl="svn://localhost/project/trunk/"
propertyname="lastrev"/>
<echo>Last revision: ${lastrev}</echo>
Version control
<gitcommit
repository="/home/michiel/dev/phing"
message="Update documentation" allFiles="true"/>
<gitpush
repository="/home/michiel/dev/phing"
refspec="master" tags="true" />
PHPUnit
• Built-in support for most configuration options
• Gathers code coverage information
• Various output formats / reports
• PHPUnit 4.x support soon!
PHPUnit
• 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.
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>
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>
Documentation
• Phing currently integrates with popular documentation
tools
• phpDocumentor (2)
• ApiGen
• Also supports r(e)ST (reStructuredText)
<phpdoc2 title="Phing API Documentation" output="docs">
<fileset dir="../../classes">
<include name="**/*.php"/>
</fileset>
</phpdoc2>
phpDocumentor
Packaging
• Create bundles or packages
• tar
• zip
• phar
• PEAR
Tar / zip
<tar compression="gzip" destFile="package.tgz"
basedir="build"/>
<zip destfile="htmlfiles.zip">
<fileset dir=".">
<include name="**/*.html"/>
</fileset>
</zip>
Phar packages
<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>
SSH
<ssh username="john" password="smith"
host="webserver" command="ls" />
<scp username="john" password="smith"
host="webserver" todir="/www/htdocs/project/">
<fileset dir="test">
<include name="*.html"/>
</fileset>
</scp>
Jenkins
Jenkins
Jenkins
Putting it all together
Build & deploy script
Objectives:
• Perform syntax check
• Run tests
• Create package
• Deploy via SSH
• To selectable target / environment
• Update database
• Roll back
Syntax checks & tests
<phplint haltonfailure="true">
<fileset dir=".">
<include name="src/**" />
</fileset>
</phplint>
<phpunit haltonfailure="true">
<batchtest>
<fileset dir=".">
<include name="src/**/*Test.php" />
</fileset>
</batchtest>
</phpunit>
Packaging
<tstamp>
<format property="build.timestamp" pattern="%Y%m%d%H%M%S"/>
</tstamp>
<property name="build.release" value="${project.name}-${build.timestamp}" />
<property name="package.name" value="${build.release}.tar.gz" />
<tar destfile="artifacts/${package.name}" basedir="${build.dir.project}" />
Multiple targets
• Several deployment targets: testing, staging, production, ...
• One property file per target
• Select based on input
ssh.host=127.0.0.1
ssh.username=phing
ssh.key.private=development-ssh
ssh.key.public=development-ssh.pub
deploy.location=/home/phing/apps
Multiple targets
<input propertyname="deploy.target"
validArgs="testing,staging,production">
Enter target name
</input>
<property file="${deploy.target}.properties"/>
Uploading
<ssh host="${ssh.host}"
username="${ssh.username}"
privkeyfile="${ssh.key.private}"
pubkeyfile="${ssh.key.public}"
command="mkdir -p ${deploy.location.project}/${build.release}"
failonerror="true" />
<echo>Copying package</echo>
<scp host="${ssh.host}"
port="${ssh.port}"
username="${ssh.username}"
privkeyfile="${ssh.key.private}"
pubkeyfile="${ssh.key.public}"
todir="${deploy.location.project}/${build.release}"
file="${package.name.full}" />
Uploading
<echo>Extracting package</echo>
<ssh ...
command="cd ${deploy.location.project}/${build.release};
tar xzf ${package.name}"
failonerror="true" />
Symbolic links
• All releases stored in separate directories
• Symlink "current" to latest release
• Allows for easy (code) rollbacks
<echo>Creating symbolic link</echo>
<ssh ...
command="cd ${deploy.location.project};
if [ -h &quot;current&quot; ]; then
rm -f previous; mv current previous; fi;
ln -s ${build.release} current" />
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
)
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`;
--//
Database migration
<dbdeploy
url="sqlite:test.db"
dir="deltas"
outputfile="deploy.sql"
undooutputfile="undo.sql"/>
<pdosqlexec
src="deploy.sql"
url="sqlite:test.db"/>
[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
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 --
Database migration
-- Fragment begins: 1 --
DROP TABLE `post`;
--//
DELETE FROM changelog
WHERE change_number = 1
AND delta_set = 'Main';
-- Fragment ends: 1 --
Restart services
<ssh ...
command="sudo service apache2 reload"
failonerror="true" />
Rolling back
<trycatch>
<try>
<ssh ...
command="cd ${deploy.location.project};
rm -f current;
mv -f previous current"
failonerror="true" />
<echo>Rollback complete</echo>
</try>
<catch>
<echo>No previous version deployed!</echo>
</catch>
</trycatch>
Extending Phing
Writing your own task
• Extend from Task
• Contains main() method and optionally init()
• Setter method for each attribute in the build file
Our new task should
• Accept filesets
• Count number of lines in each file
• Fail the build if a file with zero lines is found
Our new task
<?php
require_once 'phing/Task.php';
class CountLinesTask extends Task
{
public function main()
{
$foundEmpty = false;
if ($foundEmpty) {
throw new BuildException("One or more files have zero lines");
}
}
}
Injecting file sets
private $_filesets = array();
/**
* Creator for _filesets
*
* @return FileSet
*/
public function createFileset()
{
$num = array_push($this->_filesets, new FileSet());
return $this->_filesets[$num-1];
}
Injecting file sets
foreach ($this->_filesets as $fileset) {
$files = $fileset->getDirectoryScanner($this->project)
->getIncludedFiles();
$dir = $fileset->getDir($this->project)->getAbsolutePath();
foreach ($files as $file) {
$path = realpath($dir . DIRECTORY_SEPARATOR . $file);
$lines = count(file($path));
$this->log($path . ": " . $lines . " line(s)");
if ($lines == 0) {
$foundEmpty = true;
}
}
}
Using the task
<project name="Count Lines" default="count">
<target name="count">
<taskdef name="countlines"
classpath="/home/michiel/tasks"
classname="CountLinesTask" />
<countlines>
<fileset dir=".">
<include name="**/*.txt" />
</fileset>
</countlines>
</target>
</project>
Using the task
Buildfile: /home/michiel/examples/count.xml
Count Lines > count:
[countlines] /home/michiel/examples/empty.txt: 0 line(s)
[countlines] /home/michiel/examples/lines.txt: 3 line(s)
Execution of target "count" failed for the following reason:
/home/michiel/examples/count.xml:7:20: One or more files have zero lines
BUILD FAILED
/home/michiel/examples/count.xml:7:20: One or more files have zero lines
Total time: 0.0454 seconds
Alternative: Ad Hoc
<target name="main">
<adhoc-task name="foo"><![CDATA[
class FooTask extends Task {
private $bar;
public function setBar($bar) {
$this->bar = $bar;
}
public function main() {
$this->log("In main(): " . $this->bar);
}
}
]]></adhoc-task>
<foo bar="TEST"/>
</target>
Where to go from here
• Tool versions
• Performance
• Documentation
• PHP 5.3/5.4/5.5
• IDE support
• CI integration
Questions?
Example code at https://github.com/mrook/phing-examples
Please leave feedback at https://joind.in/10411
Contact us on:
http://www.phing.info
#phing (freenode)
@phingofficial
Thank you!

Weitere ähnliche Inhalte

Was ist angesagt?

Putting Phing to Work for You
Putting Phing to Work for YouPutting Phing to Work for You
Putting Phing to Work for Youhozn
 
Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Michiel Rook
 
Best Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentBest Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentShahar Evron
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsAdam Culp
 
Propel Your PHP Applications
Propel Your PHP ApplicationsPropel Your PHP Applications
Propel Your PHP Applicationshozn
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Clark Everetts
 
Zend con 2016 bdd with behat for beginners
Zend con 2016   bdd with behat for beginnersZend con 2016   bdd with behat for beginners
Zend con 2016 bdd with behat for beginnersAdam Englander
 
PHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBeneluxPHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBeneluxNick Belhomme
 
Zend Framework 1.8 workshop
Zend Framework 1.8 workshopZend Framework 1.8 workshop
Zend Framework 1.8 workshopNick Belhomme
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stackKris Buytaert
 
Virtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 MayVirtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 MayPuppet
 
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)Puppet
 
Modulesync- How vox pupuli manages 133 modules, Tim Meusel
Modulesync- How vox pupuli manages 133 modules, Tim MeuselModulesync- How vox pupuli manages 133 modules, Tim Meusel
Modulesync- How vox pupuli manages 133 modules, Tim MeuselPuppet
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is DockerNick Belhomme
 
Virtual Bolt Workshop - Dell - April 8 2020
Virtual Bolt Workshop - Dell - April 8 2020Virtual Bolt Workshop - Dell - April 8 2020
Virtual Bolt Workshop - Dell - April 8 2020Puppet
 
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...Puppet
 
Applying software engineering to configuration management
Applying software engineering to configuration managementApplying software engineering to configuration management
Applying software engineering to configuration managementBart Vanbrabant
 
Building a Dynamic Website Using Django
Building a Dynamic Website Using DjangoBuilding a Dynamic Website Using Django
Building a Dynamic Website Using DjangoNathan Eror
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend frameworkAlan Seiden
 

Was ist angesagt? (20)

Putting Phing to Work for You
Putting Phing to Work for YouPutting Phing to Work for You
Putting Phing to Work for You
 
Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)Phing - A PHP Build Tool (An Introduction)
Phing - A PHP Build Tool (An Introduction)
 
Best Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentBest Practices in PHP Application Deployment
Best Practices in PHP Application Deployment
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
 
Propel Your PHP Applications
Propel Your PHP ApplicationsPropel Your PHP Applications
Propel Your PHP Applications
 
Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016Php Dependency Management with Composer ZendCon 2016
Php Dependency Management with Composer ZendCon 2016
 
Zend con 2016 bdd with behat for beginners
Zend con 2016   bdd with behat for beginnersZend con 2016   bdd with behat for beginners
Zend con 2016 bdd with behat for beginners
 
PHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBeneluxPHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBenelux
 
Zend Framework 1.8 workshop
Zend Framework 1.8 workshopZend Framework 1.8 workshop
Zend Framework 1.8 workshop
 
11 tools for your PHP devops stack
11 tools for your PHP devops stack11 tools for your PHP devops stack
11 tools for your PHP devops stack
 
Virtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 MayVirtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 May
 
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)
Puppet Virtual Bolt Workshop - 23 April 2020 (Singapore)
 
Modulesync- How vox pupuli manages 133 modules, Tim Meusel
Modulesync- How vox pupuli manages 133 modules, Tim MeuselModulesync- How vox pupuli manages 133 modules, Tim Meusel
Modulesync- How vox pupuli manages 133 modules, Tim Meusel
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
Virtual Bolt Workshop - Dell - April 8 2020
Virtual Bolt Workshop - Dell - April 8 2020Virtual Bolt Workshop - Dell - April 8 2020
Virtual Bolt Workshop - Dell - April 8 2020
 
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
Easily Manage Patching and Application Updates with Chocolatey + Puppet - Apr...
 
Applying software engineering to configuration management
Applying software engineering to configuration managementApplying software engineering to configuration management
Applying software engineering to configuration management
 
Building a Dynamic Website Using Django
Building a Dynamic Website Using DjangoBuilding a Dynamic Website Using Django
Building a Dynamic Website Using Django
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend framework
 
Django
DjangoDjango
Django
 

Ähnlich wie Building and Deploying PHP apps with Phing

Getting Started With Jenkins And Drupal
Getting Started With Jenkins And DrupalGetting Started With Jenkins And Drupal
Getting Started With Jenkins And DrupalPhilip Norton
 
Putting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your lifePutting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your lifeBoyan Borisov
 
Building com Phing - 7Masters PHP
Building com Phing - 7Masters PHPBuilding com Phing - 7Masters PHP
Building com Phing - 7Masters PHPiMasters
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesAlfresco Software
 
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20Michael Lihs
 
Creating Custom Templates for Joomla! 2.5
Creating Custom Templates for Joomla! 2.5Creating Custom Templates for Joomla! 2.5
Creating Custom Templates for Joomla! 2.5Don Cranford
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011Bachkoutou Toutou
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeMario IC
 
Continous delivery with Jenkins and Chef
Continous delivery with Jenkins and ChefContinous delivery with Jenkins and Chef
Continous delivery with Jenkins and Chefdefrag2
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014Ramon Navarro
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009Jason Davies
 
Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程jeffz
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with PuppetJoe Ray
 
Improving QA on PHP projects - confoo 2011
Improving QA on PHP projects - confoo 2011Improving QA on PHP projects - confoo 2011
Improving QA on PHP projects - confoo 2011Michelangelo van Dam
 
Continuous Delivery - Automate & Build Better Software with Travis CI
Continuous Delivery - Automate & Build Better Software with Travis CIContinuous Delivery - Automate & Build Better Software with Travis CI
Continuous Delivery - Automate & Build Better Software with Travis CIwajrcs
 
PHP language presentation
PHP language presentationPHP language presentation
PHP language presentationAnnujj Agrawaal
 

Ähnlich wie Building and Deploying PHP apps with Phing (20)

Getting Started With Jenkins And Drupal
Getting Started With Jenkins And DrupalGetting Started With Jenkins And Drupal
Getting Started With Jenkins And Drupal
 
Putting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your lifePutting "Phings" together - how to automate your life
Putting "Phings" together - how to automate your life
 
Building com Phing - 7Masters PHP
Building com Phing - 7Masters PHPBuilding com Phing - 7Masters PHP
Building com Phing - 7Masters PHP
 
BP-6 Repository Customization Best Practices
BP-6 Repository Customization Best PracticesBP-6 Repository Customization Best Practices
BP-6 Repository Customization Best Practices
 
Write php deploy everywhere
Write php deploy everywhereWrite php deploy everywhere
Write php deploy everywhere
 
Improving qa on php projects
Improving qa on php projectsImproving qa on php projects
Improving qa on php projects
 
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
 
Write php deploy everywhere tek11
Write php deploy everywhere   tek11Write php deploy everywhere   tek11
Write php deploy everywhere tek11
 
Creating Custom Templates for Joomla! 2.5
Creating Custom Templates for Joomla! 2.5Creating Custom Templates for Joomla! 2.5
Creating Custom Templates for Joomla! 2.5
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011
 
Agiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As CodeAgiles Peru 2019 - Infrastructure As Code
Agiles Peru 2019 - Infrastructure As Code
 
Continous delivery with Jenkins and Chef
Continous delivery with Jenkins and ChefContinous delivery with Jenkins and Chef
Continous delivery with Jenkins and Chef
 
Resource registries plone conf 2014
Resource registries plone conf 2014Resource registries plone conf 2014
Resource registries plone conf 2014
 
Codeigniter
CodeigniterCodeigniter
Codeigniter
 
CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009CouchDB for Web Applications - Erlang Factory London 2009
CouchDB for Web Applications - Erlang Factory London 2009
 
Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程Documentation Insight技术架构与开发历程
Documentation Insight技术架构与开发历程
 
Provisioning with Puppet
Provisioning with PuppetProvisioning with Puppet
Provisioning with Puppet
 
Improving QA on PHP projects - confoo 2011
Improving QA on PHP projects - confoo 2011Improving QA on PHP projects - confoo 2011
Improving QA on PHP projects - confoo 2011
 
Continuous Delivery - Automate & Build Better Software with Travis CI
Continuous Delivery - Automate & Build Better Software with Travis CIContinuous Delivery - Automate & Build Better Software with Travis CI
Continuous Delivery - Automate & Build Better Software with Travis CI
 
PHP language presentation
PHP language presentationPHP language presentation
PHP language presentation
 

Kürzlich hochgeladen

Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineeringssuserb3a23b
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...confluent
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesPhilip Schwarz
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...Technogeeks
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Angel Borroy López
 

Kürzlich hochgeladen (20)

Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
Odoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting ServiceOdoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting Service
 
Software Coding for software engineering
Software Coding for software engineeringSoftware Coding for software engineering
Software Coding for software engineering
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
Catch the Wave: SAP Event-Driven and Data Streaming for the Intelligence Ente...
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
Advantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your BusinessAdvantages of Odoo ERP 17 for Your Business
Advantages of Odoo ERP 17 for Your Business
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
Folding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a seriesFolding Cheat Sheet #4 - fourth in a series
Folding Cheat Sheet #4 - fourth in a series
 
What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...What is Advanced Excel and what are some best practices for designing and cre...
What is Advanced Excel and what are some best practices for designing and cre...
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva2.pdf Ejercicios de programación competitiva
2.pdf Ejercicios de programación competitiva
 
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
Alfresco TTL#157 - Troubleshooting Made Easy: Deciphering Alfresco mTLS Confi...
 

Building and Deploying PHP apps with Phing