SlideShare uma empresa Scribd logo
1 de 78
Baixar para ler offline
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!

Mais conteúdo relacionado

Mais procurados

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
 

Mais procurados (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
 

Semelhante a 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
 

Semelhante a 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
 

Último

Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
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
 
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
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsSafe Software
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
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
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Rob Geurden
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Andreas Granig
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
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
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 

Último (20)

Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
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 - ...
 
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
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Powering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data StreamsPowering Real-Time Decisions with Continuous Data Streams
Powering Real-Time Decisions with Continuous Data Streams
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
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)
 
Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...Simplifying Microservices & Apps - The art of effortless development - Meetup...
Simplifying Microservices & Apps - The art of effortless development - Meetup...
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 
Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024Automate your Kamailio Test Calls - Kamailio World 2024
Automate your Kamailio Test Calls - Kamailio World 2024
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
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
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 

Building and Deploying PHP apps with Phing