SlideShare a Scribd company logo
1 of 15
Download to read offline
PHPBenelux - Using Phing




          10-5-2011
          ~30 mins

       Marco de Krijger
About me

Marco de Krijger

    http://www.linkedin.com/in/marcodekrijger

    mdekrijger@e-sites.nl
Contents

   What is Phing
   Why using Phing
   Features
   Example Phing build file
   Phing and CI
   Extending Phing
   Questions
What is Phing
   Phing homepage: http://phing.info
    “PHing Is Not GNU make; it's a PHP project
    build system or build tool based on Apache Ant”
   Phing is like a jigsaw
    puzzle. It has a lots
    of easy to use building
    blocks to cover everything
    between a code base and
    a live production
    environment
Why using Phing

   Phing homepage:
    “If you find yourself writing custom scripts to
    handle the packaging, deploying, or testing of
    your applications”
   A shared platform that is maintained →
    less programming && less communication with
    (new) developers                       I'm not needed,
                                               so I can be empty

    “An excellent developer
    makes himself needless”
Features
In a nutshell
Example deployment

   “Phing look and feel” Info target
   e-sites library (ESL)
       Deploy ESL
       Revert version
<?xml version="1.0" encoding="UTF-8"?>
                                       Deployment code
<project name="ESL" default="info">

<target name="deployMinor">
<version releasetype="Minor" file="VERSION" property="version"/>
<svncommit workingcopy="." message="Updated VERSION file to ${version}" username="user" password="password"/>
<svncopy repositoryurl="http://svn.dev/library/esl/Branches/v1" todir="http://svn.dev/library/esl/Tags/release-${version}" username="user"
password="password"/>
<svnupdate todir="." username="user" password="password"/>
<phingcall target="deploy"/>
</target>


<target name="deploy" description="Deploy ESL" depends="tarball">
<fail unless="version" message="Please specify version to export e.g. -Dversion=1.0.0" />
<phingcall target="deployserver">
<property name="host" value="dev"/>
</phingcall>
<!-- clean up mess →
<delete dir="/tmp/eslpackage" quiet="true"/>
</target>

<target name="tarball">
<fail unless="version" message="Please specify version to export e.g. -Dversion=1.0.0" />
<!-- this is to check if SVN tag exists →
<svnlastrevision repositoryurl="http://svn.dev/library/esl/Tags/release-${version}" propertyname="tag" username="user" password="password"/>
<property name="build.dir" value="/tmp/eslpackage" />
<delete dir="${build.dir}" quiet="true"/>
<svnexport username="user" password="password" repositoryurl="http://svn.dev/library/esl/Tags/release-${version}" todir="${build.dir}"/>
<delete file="${build.dir}/build.xml"/>
<tar destfile="/tmp/eslpackage/esl.tar" compression="gzip">
<fileset dir="${build.dir}">
<include name="**/**" />
</fileset>
</tar>
</target>

<target name="deployserver" if="host,version">
<scp username="esites" host="${host}" todir="/tmp" file="/tmp/eslpackage/esl.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub"
privkeyfile="/var/www/.ssh/id_rsa"/>
<!-- untar and symlink →
<ssh username="esites" host="${host}" command="mkdir /var/www/includes/ESL-${version}; cd /var/www/includes/ESL-${version}; tar -zvxf /tmp/esl.tar; ln
-s ./ESL-${version} /var/www/includes/ESLv1_tmp; mv -Tf /var/www/includes/ESLv1_tmp /var/www/includes/ESLv1;rm -f /tmp/esl.tar"
pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/>
</target>
Phing and CI

   Example with Jenkins (Hudson) “building ESL”
       Execute unit tests
       Codesniffer for standards
       PHPMD for mess detection
       Code coverage report for unit test
       PHPDepend stats



                                    +
<?xml version="1.0" encoding="UTF-8"?>
<project name="ESL">
<target name="build" description="Build ESL">
                                                Jenkins build file
<mkdir dir="./reports"/>

<fileset dir="./ESL" id="php.fileset">
<include name="**/*.php"/>
</fileset>

<!-- Set up coverage db →
<coverage-setup database="./reports/coverage.db">
<fileset refid="php.fileset"/>
</coverage-setup>

<!-- Execute unit tests →
<phpunit bootstrap="./bootstrap.php" codecoverage="true">
<formatter type="clover" todir="reports"/>
<formatter type="xml" todir="reports"/>
<batchtest>
<fileset id="unittests" dir="./tests">
<include name="**/*Test.php"/>
</fileset>
</batchtest>
</phpunit>

<!-- Do codesniffing →
<phpcodesniffer standard="Esites" format="checkstyle">
<fileset refid="php.fileset"/>
<formatter type="checkstyle" outfile="./reports/checkstyle.xml"/>
</phpcodesniffer>

<!-- Do PMD checks →
<phpmd rulesets="Esites">
<fileset refid="php.fileset"/>
<formatter type="xml" outfile="./reports/pmd.xml"/>
</phpmd>

<!-- Copy paste detection →
<phpcpd>
<fileset refid="php.fileset"/>
<formatter type="pmd" outfile="./reports/cpd.xml"/>
</phpcpd>

<!-- Get PHPDepend stats →
<phpdepend>
<fileset refid="php.fileset"/>
<logger type="jdepend-xml" outfile="./reports/jdepend.xml"/>
<logger type="jdepend-chart" outfile="./reports/dependencies.svg"/>
<logger type="overview-pyramid" outfile="./reports/overview-pyramid.svg"/>
<analyzer type="coderank-mode" value="method"/>
</phpdepend>

</target>
</project>
Jenkins graphs
            And...
           PHPCPD Copy paste
            detection
           PHPunit test results
Extending Phing

   Example
    Existing SSH task is incomplete. We want
    to capture SSH output for string matching
        Add your task/class to defaults.properties
        Create user directory in tasks
        Create your own task with setters and
         main method
<?xml version="1.0" encoding="UTF-8"?>
                                                 Custom task
<project name="ESL" default="build">

<property name="dir.source" value="/var/www/html/workingcopies/mdkrijger/personal/esltest" />
<property name="dir.destination" value="/tmp/phingdemo" />

<target name="compare" description="Compare 2 fixed directories">
<!-- Create package (tarball) →
<tar destfile="tarball.tar" compression="gzip">
 <fileset dir="${dir.source}">
 <include name="**/**" />
 </fileset>
</tar>
<!-- upload it to production environment →
<scp username="esites" host="dev" todir="/tmp" file="tarball.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/>
<!-- Extract the uploaded image, display its activity →
<ssh username="esites" host="dev" command="mkdir /tmp/phingdemo; cd /tmp/phingdemo; tar -zxvf /tmp/tarball.tar"
pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/>
<!-- This is the custom task →
<!-- get directory sizes →
<sshterm username="esites" host="devlocal" display="false" property="size1" command="du -bs ${dir.destination} | egrep -o '([0-9]*)'"
pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/>
<exec command="du -bs ${dir.source} | egrep -o '([0-9]*)'" outputproperty="size2"/>
<!-- compare them →
<if>
<not>
<equals arg1="${size1}" arg2="${size2}"/>
</not>
<then>
<fail message="Directories are not in sync! Size source: ${size2}, Size destination: ${size1}"/>
</then>
<else>
<echo message="Directories are in sync"/>
</else>
</if>
</target>

<target name="clean">
<delete dir="/tmp/phingdemo"/>
<delete file="/tmp/tarball.tar"/>
</target>

<target name="break">
<copy file="/tmp/tarball.tar" tofile="${dir.destination}/tarball.tar" overwrite="true"/>
</target>
</project>
Further reading

   Phing website
    http://phing.info
   Jenkins CI
    http://jenkins-ci.org
   Setting up Phing under Jenkins
    http://bit.ly/9EgmN
   This presentation
    http://www.slideshare.net/mdekrijger/phing-7900127
Questions?

   If any

More Related Content

What's hot

What's hot (20)

Build Automation of PHP Applications
Build Automation of PHP ApplicationsBuild Automation of PHP Applications
Build Automation of PHP Applications
 
Automated Deployment With Phing
Automated Deployment With PhingAutomated Deployment With Phing
Automated Deployment With Phing
 
Best Practices in PHP Application Deployment
Best Practices in PHP Application DeploymentBest Practices in PHP Application Deployment
Best Practices in PHP Application Deployment
 
Propel Your PHP Applications
Propel Your PHP ApplicationsPropel Your PHP Applications
Propel Your PHP Applications
 
Practical PHP Deployment with Jenkins
Practical PHP Deployment with JenkinsPractical PHP Deployment with Jenkins
Practical PHP Deployment with Jenkins
 
Zend Framework 1.8 workshop
Zend Framework 1.8 workshopZend Framework 1.8 workshop
Zend Framework 1.8 workshop
 
Vagrant move over, here is Docker
Vagrant move over, here is DockerVagrant move over, here is Docker
Vagrant move over, here is Docker
 
PHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBeneluxPHP Quality Assurance Workshop PHPBenelux
PHP Quality Assurance Workshop PHPBenelux
 
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
 
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
 
Laravel 4 package development
Laravel 4 package developmentLaravel 4 package development
Laravel 4 package development
 
New EEA Plone Add-ons
New EEA Plone Add-onsNew EEA Plone Add-ons
New EEA Plone Add-ons
 
Building a Dynamic Website Using Django
Building a Dynamic Website Using DjangoBuilding a Dynamic Website Using Django
Building a Dynamic Website Using Django
 
Virtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 MayVirtual Bolt Workshop - 6 May
Virtual Bolt Workshop - 6 May
 
Django Introduction & Tutorial
Django Introduction & TutorialDjango Introduction & Tutorial
Django Introduction & Tutorial
 
Continuous Quality Assurance
Continuous Quality AssuranceContinuous Quality Assurance
Continuous Quality Assurance
 
Lean Php Presentation
Lean Php PresentationLean Php Presentation
Lean Php Presentation
 
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)
 
Ansible project-deploy (NomadPHP lightning talk)
Ansible project-deploy (NomadPHP lightning talk)Ansible project-deploy (NomadPHP lightning talk)
Ansible project-deploy (NomadPHP lightning talk)
 

Similar to Phing

IzPack at LyonJUG'11
IzPack at LyonJUG'11IzPack at LyonJUG'11
IzPack at LyonJUG'11
julien.ponge
 
Apache ant
Apache antApache ant
Apache ant
koniik
 
From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012
Carlos Sanchez
 
Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)
LumoSpark
 

Similar to Phing (20)

Write php deploy everywhere tek11
Write php deploy everywhere   tek11Write php deploy everywhere   tek11
Write php deploy everywhere tek11
 
Write php deploy everywhere
Write php deploy everywhereWrite php deploy everywhere
Write php deploy everywhere
 
IzPack at LyonJUG'11
IzPack at LyonJUG'11IzPack at LyonJUG'11
IzPack at LyonJUG'11
 
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
 
Apache ant
Apache antApache ant
Apache ant
 
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
 
"I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more."I have a framework idea" - Repeat less, share more.
"I have a framework idea" - Repeat less, share more.
 
From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012From Dev to DevOps - Codemotion ES 2012
From Dev to DevOps - Codemotion ES 2012
 
Advanced Eclipse Workshop (held at IPC2010 -spring edition-)
Advanced Eclipse Workshop (held at IPC2010 -spring edition-)Advanced Eclipse Workshop (held at IPC2010 -spring edition-)
Advanced Eclipse Workshop (held at IPC2010 -spring edition-)
 
Deployment Tactics
Deployment TacticsDeployment Tactics
Deployment Tactics
 
Introduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release updateIntroduction to InSpec and 1.0 release update
Introduction to InSpec and 1.0 release update
 
Php Power Tools
Php Power ToolsPhp Power Tools
Php Power Tools
 
Burn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websitesBurn down the silos! Helping dev and ops gel on high availability websites
Burn down the silos! Helping dev and ops gel on high availability websites
 
Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)Web development automatisation for fun and profit (Artem Daniliants)
Web development automatisation for fun and profit (Artem Daniliants)
 
Phing i Fabric - Budowanie i deployment aplikacji webowych
Phing i Fabric - Budowanie i deployment aplikacji webowychPhing i Fabric - Budowanie i deployment aplikacji webowych
Phing i Fabric - Budowanie i deployment aplikacji webowych
 
Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013Puppet: Eclipsecon ALM 2013
Puppet: Eclipsecon ALM 2013
 
MuleSoft ESB Payload Encrypt Decrypt using anypoint enterprise security
MuleSoft ESB Payload Encrypt Decrypt using anypoint enterprise securityMuleSoft ESB Payload Encrypt Decrypt using anypoint enterprise security
MuleSoft ESB Payload Encrypt Decrypt using anypoint enterprise security
 
Algotitmo Moinho
Algotitmo MoinhoAlgotitmo Moinho
Algotitmo Moinho
 
Introduction to puppet - Hands on Session at HPI Potsdam
Introduction to puppet - Hands on Session at HPI PotsdamIntroduction to puppet - Hands on Session at HPI Potsdam
Introduction to puppet - Hands on Session at HPI Potsdam
 

Recently uploaded

Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
baharayali
 
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
baharayali
 
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
baharayali
 
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
baharayali
 

Recently uploaded (18)

A373 true knowledge Not according to true knowledge, knowledge/true knowledg...
A373 true knowledge  Not according to true knowledge, knowledge/true knowledg...A373 true knowledge  Not according to true knowledge, knowledge/true knowledg...
A373 true knowledge Not according to true knowledge, knowledge/true knowledg...
 
Codex Singularity: Search for the Prisca Sapientia
Codex Singularity: Search for the Prisca SapientiaCodex Singularity: Search for the Prisca Sapientia
Codex Singularity: Search for the Prisca Sapientia
 
Spirituality: Beyond Dogmatic Texts - Audio Book
Spirituality: Beyond Dogmatic Texts - Audio BookSpirituality: Beyond Dogmatic Texts - Audio Book
Spirituality: Beyond Dogmatic Texts - Audio Book
 
Deerfoot Church of Christ Bulletin 5 26 24
Deerfoot Church of Christ Bulletin 5 26 24Deerfoot Church of Christ Bulletin 5 26 24
Deerfoot Church of Christ Bulletin 5 26 24
 
A Chronology of the Resurrection Appearances
A Chronology of the Resurrection AppearancesA Chronology of the Resurrection Appearances
A Chronology of the Resurrection Appearances
 
Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
Expert kala ilam, Black magic specialist in Indonesia and Kala ilam expert in...
 
2024 Wisdom Touch Tour Houston Slide Deck
2024 Wisdom Touch Tour Houston Slide Deck2024 Wisdom Touch Tour Houston Slide Deck
2024 Wisdom Touch Tour Houston Slide Deck
 
Life Lessons to Learn ~ A Free Full-Color eBook (English).pdf
Life Lessons to Learn ~ A Free Full-Color eBook (English).pdfLife Lessons to Learn ~ A Free Full-Color eBook (English).pdf
Life Lessons to Learn ~ A Free Full-Color eBook (English).pdf
 
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
Expert kala ilam, Black magic specialist in Russia and Kala jadu expert in It...
 
308 David Displeased the Lord 309 What Will it Take for God to Get Your Atten...
308 David Displeased the Lord 309 What Will it Take for God to Get Your Atten...308 David Displeased the Lord 309 What Will it Take for God to Get Your Atten...
308 David Displeased the Lord 309 What Will it Take for God to Get Your Atten...
 
The_Chronological_Life_of_Christ_Part_101_Misordered_Priorities
The_Chronological_Life_of_Christ_Part_101_Misordered_PrioritiesThe_Chronological_Life_of_Christ_Part_101_Misordered_Priorities
The_Chronological_Life_of_Christ_Part_101_Misordered_Priorities
 
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
Expert kala ilam, Kala jadu specialist in Spain and Black magic specialist in...
 
The Story of 'Chin Kiam Siap' ~ An AI Generated Story ~ English & Chinese.pptx
The Story of 'Chin Kiam Siap' ~ An AI Generated Story ~ English & Chinese.pptxThe Story of 'Chin Kiam Siap' ~ An AI Generated Story ~ English & Chinese.pptx
The Story of 'Chin Kiam Siap' ~ An AI Generated Story ~ English & Chinese.pptx
 
The Prophecy of Enoch in Jude 14-16_.pptx
The Prophecy of Enoch in Jude 14-16_.pptxThe Prophecy of Enoch in Jude 14-16_.pptx
The Prophecy of Enoch in Jude 14-16_.pptx
 
Homosexuality and Ordination of Woman
Homosexuality and Ordination of WomanHomosexuality and Ordination of Woman
Homosexuality and Ordination of Woman
 
Catechism_05_Blessed Trinity based on Compendium CCC.pptx
Catechism_05_Blessed Trinity based on Compendium CCC.pptxCatechism_05_Blessed Trinity based on Compendium CCC.pptx
Catechism_05_Blessed Trinity based on Compendium CCC.pptx
 
Saint Vincent de Paul and Saint Louise de Marillac Played a Central Part in t...
Saint Vincent de Paul and Saint Louise de Marillac Played a Central Part in t...Saint Vincent de Paul and Saint Louise de Marillac Played a Central Part in t...
Saint Vincent de Paul and Saint Louise de Marillac Played a Central Part in t...
 
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
Expert kala ilam, Kala ilam specialist in Spain and Kala jadu expert in Germa...
 

Phing

  • 1. PHPBenelux - Using Phing 10-5-2011 ~30 mins Marco de Krijger
  • 2. About me Marco de Krijger http://www.linkedin.com/in/marcodekrijger mdekrijger@e-sites.nl
  • 3. Contents  What is Phing  Why using Phing  Features  Example Phing build file  Phing and CI  Extending Phing  Questions
  • 4. What is Phing  Phing homepage: http://phing.info “PHing Is Not GNU make; it's a PHP project build system or build tool based on Apache Ant”  Phing is like a jigsaw puzzle. It has a lots of easy to use building blocks to cover everything between a code base and a live production environment
  • 5. Why using Phing  Phing homepage: “If you find yourself writing custom scripts to handle the packaging, deploying, or testing of your applications”  A shared platform that is maintained → less programming && less communication with (new) developers I'm not needed, so I can be empty “An excellent developer makes himself needless”
  • 7. Example deployment  “Phing look and feel” Info target  e-sites library (ESL)  Deploy ESL  Revert version
  • 8. <?xml version="1.0" encoding="UTF-8"?> Deployment code <project name="ESL" default="info"> <target name="deployMinor"> <version releasetype="Minor" file="VERSION" property="version"/> <svncommit workingcopy="." message="Updated VERSION file to ${version}" username="user" password="password"/> <svncopy repositoryurl="http://svn.dev/library/esl/Branches/v1" todir="http://svn.dev/library/esl/Tags/release-${version}" username="user" password="password"/> <svnupdate todir="." username="user" password="password"/> <phingcall target="deploy"/> </target> <target name="deploy" description="Deploy ESL" depends="tarball"> <fail unless="version" message="Please specify version to export e.g. -Dversion=1.0.0" /> <phingcall target="deployserver"> <property name="host" value="dev"/> </phingcall> <!-- clean up mess → <delete dir="/tmp/eslpackage" quiet="true"/> </target> <target name="tarball"> <fail unless="version" message="Please specify version to export e.g. -Dversion=1.0.0" /> <!-- this is to check if SVN tag exists → <svnlastrevision repositoryurl="http://svn.dev/library/esl/Tags/release-${version}" propertyname="tag" username="user" password="password"/> <property name="build.dir" value="/tmp/eslpackage" /> <delete dir="${build.dir}" quiet="true"/> <svnexport username="user" password="password" repositoryurl="http://svn.dev/library/esl/Tags/release-${version}" todir="${build.dir}"/> <delete file="${build.dir}/build.xml"/> <tar destfile="/tmp/eslpackage/esl.tar" compression="gzip"> <fileset dir="${build.dir}"> <include name="**/**" /> </fileset> </tar> </target> <target name="deployserver" if="host,version"> <scp username="esites" host="${host}" todir="/tmp" file="/tmp/eslpackage/esl.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/> <!-- untar and symlink → <ssh username="esites" host="${host}" command="mkdir /var/www/includes/ESL-${version}; cd /var/www/includes/ESL-${version}; tar -zvxf /tmp/esl.tar; ln -s ./ESL-${version} /var/www/includes/ESLv1_tmp; mv -Tf /var/www/includes/ESLv1_tmp /var/www/includes/ESLv1;rm -f /tmp/esl.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/> </target>
  • 9. Phing and CI  Example with Jenkins (Hudson) “building ESL”  Execute unit tests  Codesniffer for standards  PHPMD for mess detection  Code coverage report for unit test  PHPDepend stats +
  • 10. <?xml version="1.0" encoding="UTF-8"?> <project name="ESL"> <target name="build" description="Build ESL"> Jenkins build file <mkdir dir="./reports"/> <fileset dir="./ESL" id="php.fileset"> <include name="**/*.php"/> </fileset> <!-- Set up coverage db → <coverage-setup database="./reports/coverage.db"> <fileset refid="php.fileset"/> </coverage-setup> <!-- Execute unit tests → <phpunit bootstrap="./bootstrap.php" codecoverage="true"> <formatter type="clover" todir="reports"/> <formatter type="xml" todir="reports"/> <batchtest> <fileset id="unittests" dir="./tests"> <include name="**/*Test.php"/> </fileset> </batchtest> </phpunit> <!-- Do codesniffing → <phpcodesniffer standard="Esites" format="checkstyle"> <fileset refid="php.fileset"/> <formatter type="checkstyle" outfile="./reports/checkstyle.xml"/> </phpcodesniffer> <!-- Do PMD checks → <phpmd rulesets="Esites"> <fileset refid="php.fileset"/> <formatter type="xml" outfile="./reports/pmd.xml"/> </phpmd> <!-- Copy paste detection → <phpcpd> <fileset refid="php.fileset"/> <formatter type="pmd" outfile="./reports/cpd.xml"/> </phpcpd> <!-- Get PHPDepend stats → <phpdepend> <fileset refid="php.fileset"/> <logger type="jdepend-xml" outfile="./reports/jdepend.xml"/> <logger type="jdepend-chart" outfile="./reports/dependencies.svg"/> <logger type="overview-pyramid" outfile="./reports/overview-pyramid.svg"/> <analyzer type="coderank-mode" value="method"/> </phpdepend> </target> </project>
  • 11. Jenkins graphs And...  PHPCPD Copy paste detection  PHPunit test results
  • 12. Extending Phing  Example Existing SSH task is incomplete. We want to capture SSH output for string matching  Add your task/class to defaults.properties  Create user directory in tasks  Create your own task with setters and main method
  • 13. <?xml version="1.0" encoding="UTF-8"?> Custom task <project name="ESL" default="build"> <property name="dir.source" value="/var/www/html/workingcopies/mdkrijger/personal/esltest" /> <property name="dir.destination" value="/tmp/phingdemo" /> <target name="compare" description="Compare 2 fixed directories"> <!-- Create package (tarball) → <tar destfile="tarball.tar" compression="gzip"> <fileset dir="${dir.source}"> <include name="**/**" /> </fileset> </tar> <!-- upload it to production environment → <scp username="esites" host="dev" todir="/tmp" file="tarball.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/> <!-- Extract the uploaded image, display its activity → <ssh username="esites" host="dev" command="mkdir /tmp/phingdemo; cd /tmp/phingdemo; tar -zxvf /tmp/tarball.tar" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/> <!-- This is the custom task → <!-- get directory sizes → <sshterm username="esites" host="devlocal" display="false" property="size1" command="du -bs ${dir.destination} | egrep -o '([0-9]*)'" pubkeyfile="/var/www/.ssh/id_rsa.pub" privkeyfile="/var/www/.ssh/id_rsa"/> <exec command="du -bs ${dir.source} | egrep -o '([0-9]*)'" outputproperty="size2"/> <!-- compare them → <if> <not> <equals arg1="${size1}" arg2="${size2}"/> </not> <then> <fail message="Directories are not in sync! Size source: ${size2}, Size destination: ${size1}"/> </then> <else> <echo message="Directories are in sync"/> </else> </if> </target> <target name="clean"> <delete dir="/tmp/phingdemo"/> <delete file="/tmp/tarball.tar"/> </target> <target name="break"> <copy file="/tmp/tarball.tar" tofile="${dir.destination}/tarball.tar" overwrite="true"/> </target> </project>
  • 14. Further reading  Phing website http://phing.info  Jenkins CI http://jenkins-ci.org  Setting up Phing under Jenkins http://bit.ly/9EgmN  This presentation http://www.slideshare.net/mdekrijger/phing-7900127
  • 15. Questions?  If any