Phing all the things

93
Phing All The Things - Omni Adams

description

Phing is a build system that lets you do all sorts of neat things quickly and easily. If you find yourself manually running complicated processes or frequently having to look up command line parameters for your tools, Phing can help make you more efficient. If your deployments have many error-prone steps or you find yourself dealing with fragile procedures, Phing can help keep your sanity.

Transcript of Phing all the things

Page 1: Phing all the things

Phing All The Things - Omni Adams

Page 2: Phing all the things

Phing All The Things - Omni Adams

lazydevelopment

Page 3: Phing all the things

Phing All The Things - Omni Adams

Page 4: Phing all the things

Phing All The Things - Omni Adams

Stay DRY

Page 5: Phing all the things

Phing All The Things - Omni Adams

Page 6: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 7: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 8: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 9: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 10: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 11: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing testBuildfile: /Users/Omni/phing-example/build.xml [property] Loading /Users/Omni/phing-example/build.properties

phing-example > test:

PHPUnit 3.7.13 by Sebastian Bergmann.

Configuration read from /Users/Omni/phing-example/phpunit.xml..............................Time: 0 seconds, Memory: 7.25Mb

OK (30 tests, 52 assertions)

BUILD FINISHEDTotal time: 0.3155 seconds

Page 12: Phing all the things

Phing All The Things - Omni Adams

F.............................Time: 0 seconds, Memory: 7.25Mb

There was 1 failure:

1) GitTest::testGetCommitInfoLOL cats have clogged the tubes!/Users/Omni/phing-example/tests/GitTest.php:51

FAILURES!Tests: 30, Assertions: 51, Failures: 1.Execution of target "test" failed for the following reason: /Users/Omni/phing-example/build.xml:102:46: Task exited with code 1

BUILD FAILED/Users/Omni/phing-example/build.xml:102:46: Task exited with code 1Total time: 0.5653 seconds

Page 13: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 14: Phing all the things

Phing All The Things - Omni Adams

<?xml version="1.0" encoding="UTF-8"?> <project name="phing-the-things" default="test"> <target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true" /> </target> </project>

Page 15: Phing all the things

Phing All The Things - Omni Adams

F.............................Time: 0 seconds, Memory: 7.25Mb

There was 1 failure:

1) GitTest::testGetCommitInfoLOL cats have clogged the tubes!/Users/Omni/phing-example/tests/GitTest.php:51

FAILURES!Tests: 30, Assertions: 51, Failures: 1.

BUILD FINISHEDTotal time: 0.5619 seconds

Page 16: Phing all the things

Phing All The Things - Omni Adams

Page 17: Phing all the things

Phing All The Things - Omni Adams

● strict● colors● groups● command line flags

Page 18: Phing all the things

Phing All The Things - Omni Adams

<target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true"> <arg value="--exclude-group=integration" /> </exec> </target>

Page 19: Phing all the things

Phing All The Things - Omni Adams

<target name="test"> <exec executable="phpunit" passthru="true" checkreturn="true"> <arg value="${phpunitFlag}" /> </exec> </target>

Page 20: Phing all the things

Phing All The Things - Omni Adams

Page 21: Phing all the things

Phing All The Things - Omni Adams

<property name="test" value="--group=smoke" /> <property name="outputDir" value="./docs" />

Page 22: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing test -DphpunitFlag=--group=smokeBuildfile: /Users/Omni/phing-example/build.xml [property] Loading /Users/Omni/phing-example/build.properties

phing-example > test:PHPUnit 3.7.13 by Sebastian Bergmann.

Configuration read from /Users/Omni/phing-example/phpunit.xml........Time: 0 seconds, Memory: 7.25Mb

OK (8 tests, 12 assertions)

BUILD FINISHEDTotal time: 0.1058 seconds

Page 23: Phing all the things

Phing All The Things - Omni Adams

composer=/opt/composer.phar server1.user=oadams server1.url=www.example.lan <target name="properties-example"> <exec executable="${composer}" /> <exec executable="ssh" passthru="true"> <arg value="-t" /> <arg value="${server1.user}@${server1.url}" /> <arg value="sudo /sbin/service httpd restart" /> </exec> </target>

Page 24: Phing all the things

Phing All The Things - Omni Adams

firstthings fir

st

Page 25: Phing all the things

Phing All The Things - Omni Adams

author=Omni title=Phing All The Things

<property name="author" value="Other Guy" /> <property file="build.properties" /> <property name="title" value="Phing-A-Ling" />

Page 26: Phing all the things

Phing All The Things - Omni Adams

Page 27: Phing all the things

Phing All The Things - Omni Adams

<patternset id="files"> <include name="**/*.php" /> <exclude name="vendor/**" /> </patternset> <target name="phpcs"> <phpcodesniffer standard="./coding_rules.xml" format="full" showWarnings="true"> <fileset dir="."> <patternset refid="files" /> </fileset> </phpcodesniffer> </target>

Page 28: Phing all the things

Phing All The Things - Omni Adams

Page 29: Phing all the things

Phing All The Things - Omni Adams

<target name="document" depends="require-doc"> <mkdir dir="${doc}/api" /> <exec executable="${doc}/api" passthru="true" /> <arg value="--directory=." /> <arg value="--ignore=vendor/*" /> <arg value="--ignore=src/*" /> <arg value="--progressbar" /> <arg value="--target=${doc}/api" /> <arg value="--title=API documentation" /> </exec> </target>

Page 30: Phing all the things

Phing All The Things - Omni Adams

<target name="document" depends="require-doc"> <mkdir dir="${doc}/api" /> <exec executable="${doc}/api" passthru="true" /> <arg value="--directory=." /> <arg value="--ignore=vendor/*" /> <arg value="--ignore=src/*" /> <arg value="--progressbar" /> <arg value="--target=${doc}/api" /> <arg value="--title=API documentation" /> </exec> </target>

Page 31: Phing all the things

Phing All The Things - Omni Adams

<target name="document" depends="require-doc"> <mkdir dir="${doc}/api" /> <exec executable="${doc}/api" passthru="true" /> <arg value="--directory=." /> <arg value="--ignore=vendor/*" /> <arg value="--ignore=src/*" /> <arg value="--progressbar" /> <arg value="--target=${doc}/api" /> <arg value="--title=API documentation" /> </exec> </target>

Page 32: Phing all the things

Phing All The Things - Omni Adams

<target name="document" depends="require-doc"> <mkdir dir="${doc}/api" /> <exec executable="${doc}/api" passthru="true" /> <arg value="--directory=." /> <arg value="--ignore=vendor/*" /> <arg value="--ignore=src/*" /> <arg value="--progressbar" /> <arg value="--target=${doc}/api" /> <arg value="--title=API documentation" /> </exec> </target>

Page 33: Phing all the things

Phing All The Things - Omni Adams

<exec executable="ps" outputProperty="ps-output"> <arg value="x" /> <arg value="|" /> <arg value="grep" /> <arg value="selenium" /> <arg value="|" /> <arg value="grep" /> <arg value="-v" /> <arg value="grep" /> ... </exec>

Page 34: Phing all the things

Phing All The Things - Omni Adams

<exec executable="ps" outputProperty="ps-output"> <arg line="x |grep selen |grep -v 'grep\|phing'" /> </exec>

Page 35: Phing all the things

Phing All The Things - Omni Adams

Page 36: Phing all the things

Phing All The Things - Omni Adams

Page 37: Phing all the things

Phing All The Things - Omni Adams

Page 38: Phing all the things

Phing All The Things - Omni Adams

<target name="build" depends="test" />

<target name="coverage" depends="require-doc" /> <exec executable="phpunit" passthru="true" /> <arg value="--coverage-html=${doc}/coverage" /> <arg value="${phpunitFlag}" /> </exec> </target>

Page 39: Phing all the things

Phing All The Things - Omni Adams

<target name="require-doc"> <if> <not> <isset property="doc" /> </not> <then> <fail name="doc isn't set in .properties file" /> </then> </if> </target>

Page 40: Phing all the things

Phing All The Things - Omni Adams

<property name="foo" value="not-test" /> <target name="example" depends="other-task"> <phingcall target="other-task"> <property name="foo" depends="test" /> <property name="bar" depends="test" /> </phingcall> <phingcall target="other-task" /> </target> <target name="other-task"> <echo message="${foo}" /> <echo message="${bar}" /> </target>

Page 41: Phing all the things

Phing All The Things - Omni Adams

Page 42: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate>

Page 43: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate>

Page 44: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate>

Page 45: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate>

Page 46: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate>

Page 47: Phing all the things

Phing All The Things - Omni Adams

<uptodate property="css-compiled" targetfile="style.css"> <srcfiles dir="styles" includes="**/*less" /> </uptodate> <target name="compile-css" unless="css-compiled"> <exec executable="lessc" passthru="true" checkreturn="true"> <arg value="-x" /> <arg value="styles/*less" /> <arg value="style.css" /> </exec> </target>

Page 48: Phing all the things

Phing All The Things - Omni Adams

Page 49: Phing all the things

Phing All The Things - Omni Adams

<available property="composer-exists" file="composer.phar" /> <target name="get-composer" unless="composer-exists"> <exec executable="curl" output="composer.php"> <arg value="-sS" /> <arg value="https://getcomposer.org/installer" /> <arg value="|" /> <arg value="php" /> </exec> <chmod file="composer.phar" perm="664" /> </target>

Page 50: Phing all the things

Phing All The Things - Omni Adams

<available property="composer-exists" file="composer.phar" /> <target name="get-composer" unless="composer-exists"> <exec executable="curl" output="composer.php"> <arg value="-sS" /> <arg value="https://getcomposer.org/installer" /> <arg value="|" /> <arg value="php" /> </exec> <chmod file="composer.phar" perm="775" /> </target>

Page 51: Phing all the things

Phing All The Things - Omni Adams

Page 52: Phing all the things

Phing All The Things - Omni Adams

Page 53: Phing all the things

Phing All The Things - Omni Adams

ASS

UMPTIONS

Page 54: Phing all the things

Phing All The Things - Omni Adams

Page 55: Phing all the things

Phing All The Things - Omni Adams

Page 56: Phing all the things

Phing All The Things - Omni Adams

Page 57: Phing all the things

Phing All The Things - Omni Adams

<target name="tag" depends="require-version"> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> <gitpush repository="." tags="true" quiet="true" /> </target>

Page 58: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing tagBuildfile: /Users/Omni/Sites/phing/build.xml [property] Loading /Users/Omni/Sites/phing/build.properties

phing-the-things > require-version:

[if] Error in IfTaskExecution of target "require-version" failed for the following reason: /Users/Omni/Sites/phing/build.xml:146:12: /Users/Omni/Sites/phing/build.xml:150:18: You must pass in a version: -Dversion=1.2.3BUILD FAILED/Users/Omni/Sites/phing/build.xml:146:12: /Users/Omni/Sites/phing/build.xml:150:18: You must pass in a version: -Dversion=1.2.3Total time: 1.5921 second

Page 59: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing tag-no-versionBuildfile: /Users/Omni/Sites/phing/build.xml [property] Loading /Users/Omni/Sites/phing/build.properties

phing-the-things > tag-no-version:

[gittag] git-tag command: /usr/bin/git tag -a -m'Tagged version ${version}' '${version}' [gittag] git-tag: tags for "." repository [gittag] git-tag output:

BUILD FINISHED

Total time: 0.2039 seconds

phing-the-things $ git tag${version}

Page 60: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version"> <version releasetype="${release}" file="version.txt" property="version" /> <exec executable="git" passthru="true"> <arg line="add version.txt" /> </exec> <exec executable="git" passthru="true"> <arg line="commit -m 'Updated version file to ${version}'" /> </exec> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 61: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version"> <version releasetype="${release}" file="version.txt" property="version" /> <exec executable="git" passthru="true"> <arg line="add version.txt" /> </exec> <exec executable="git" passthru="true"> <arg line="commit -m 'Updated version file to ${version}'" /> </exec> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 62: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version"> <version releasetype="${release}" file="version.txt" property="version" /> <exec executable="git" passthru="true"> <arg line="add version.txt" /> </exec> <exec executable="git" passthru="true"> <arg line="commit -m 'Updated version file to ${version}'" /> </exec> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 63: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version"> <version releasetype="${release}" file="version.txt" property="version" /> <exec executable="git" passthru="true"> <arg line="add version.txt" /> </exec> <exec executable="git" passthru="true"> <arg line="commit -m 'Updated version file to ${version}'" /> </exec> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 64: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version"> <version releasetype="${release}" file="version.txt" property="version" /> <exec executable="git" passthru="true"> <arg line="add version.txt" /> </exec> <exec executable="git" passthru="true"> <arg line="commit -m 'Updated version file to ${version}'" /> </exec> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 65: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing tag-version -Drelease=minorBuildfile: /Users/Omni/Sites/phing/build.xml [property] Loading /Users/Omni/Sites/phing/build.properties

phing-the-things > tag-version:

[master 4b48e9f] Updated version file to 0.1.0 1 file changed, 1 insertion(+), 1 deletion(-) [gittag] git-tag command: /usr/bin/git tag -a -m'Tagged version 0.1.0' '0.1.0' [gittag] git-tag: tags for "." repository [gittag] git-tag output:

BUILD FINISHEDTotal time: 0.3507 seconds

phing-the-things $ git tag0.0.10.1.0

Page 66: Phing all the things

Phing All The Things - Omni Adams

<target name="release-major"> <phingcall target="tag-version"> <property name="release" value="major" /> </phingcall> </target>

<target name="release-minor"> <phingcall target="tag-version"> <property name="release" value="minor" /> </phingcall> </target>

Page 67: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-svn"> <svncopy svnpath="${svnpath}" username="${svnuser}" password="${svnpass}" nocache="true" repositoryurl="svn://localhost/phing-the-things/trunk/" todir="svn://localhost/phing-the-things/tags/${version}" /> </target>

Page 68: Phing all the things

Phing All The Things - Omni Adams

<target name="tag-version-no-file"> <exec executable="git" outputProperty="latest-version"> <arg line="tag | sort -t. -k 1,1n -k 2,2n -k 3,3n | tail -1" /> </exec> <echo file="v.txt">${latest-version}</echo> <version releasetype="${release}" file="v.txt" property="version" /> <delete file="v.txt" /> <gittag annotate="true" name="${version}" repository="." message="Tagged version ${version}" /> </target>

Page 69: Phing all the things

Phing All The Things - Omni Adams

<property name="build-url" value="https://jenkins/job/phing/lastBuild/api/json" /> <target name="require-green-build-check"> <exec executable="curl" outputProperty="status"> <arg line='--silent ${build-url} |grep result |cut -d" -f4' /> </exec> <if> <not><equals arg1="${status}" arg2="SUCCESS" /></not> <then><fail message="Jenkins build is broken" /></then> </if> </target>

Page 70: Phing all the things

Phing All The Things - Omni Adams

<target name="deploy"> <phingcall target="require-release" /> <phingcall target="require-green-build-check" /> <phingcall target="tag-version-no-file" /> </target>

Page 71: Phing all the things

Phing All The Things - Omni Adams

Page 72: Phing all the things

Phing All The Things - Omni Adams

<target name="prepare"> <gitclone repository="git://server/phing-things.git" targetPath="build" /> <gitcheckout repository="build" branchname="${version}" quiet="true" /> <delete dir="build/tests" /> <delete file="build/build.xml" /> <tar destfile="build-${version}.tar.bz2" basedir="build" includeemptydir="true" compression="bzip2" /> <delete dir="build" /> </target>

Page 73: Phing all the things

Phing All The Things - Omni Adams

<target name="deploy"> <phingcall target="require-release" /> <phingcall target="require-green-build-check" /> <phingcall target="tag-version-no-file" /> <phingcall target="prepare" /> </target>

Page 74: Phing all the things

Phing All The Things - Omni Adams

<target name="upload"> <exec executable="scp" checkreturn="true"> <arg value="build-${version}.tar.bz2" /> <arg value="${server}:/var/www/" /> </exec> <exec executable="ssh" checkreturn="true" passthru="true"> <arg value="${server}" /> <arg value="cd /var/www;tar -xjf build-${version}.tar.bz2" /> </exec> </target>

Page 75: Phing all the things

Phing All The Things - Omni Adams

<target name="deploy"> <phingcall target="require-release" /> <phingcall target="require-green-build-check" /> <phingcall target="tag-version-no-file" /> <phingcall target="prepare" /> <phingcall target="upload" /> </target>

Page 76: Phing all the things

Phing All The Things - Omni Adams

<target name="go-live" depends="require-version"> <exec executable="ssh" checkreturn="true" passthru="true"> <arg value="${server}" /> <arg value="cd /var/www; ln -sf build-${version} app" /> </exec> </target>

Page 77: Phing all the things

Phing All The Things - Omni Adams

<target name="deploy"> <phingcall target="require-release" /> <phingcall target="require-green-build-check" /> <phingcall target="tag-version-no-file" /> <phingcall target="prepare" /> <phingcall target="upload" /> <phingcall target="go-live" /> </target>

Page 78: Phing all the things

Phing All The Things - Omni Adams

San

ityC

hec

k

Page 79: Phing all the things

Phing All The Things - Omni Adams

Page 80: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing go-live -Dversion=1.2.3

Page 81: Phing all the things

Phing All The Things - Omni Adams

phing-the-things$ phing go-live -Dversion=1.2.3

Page 82: Phing all the things

Phing All The Things - Omni Adams

!$monitored == !$exist

Page 83: Phing all the things

Phing All The Things - Omni Adams

Page 84: Phing all the things

Phing All The Things - Omni Adams

<?php require_once 'phing/Task.php'; class UpdateNewRelicTask extends Task { public function init() { // Runs when task is imported } public function main() { // Runs when task is executed } }

Page 85: Phing all the things

Phing All The Things - Omni Adams

<taskdef name="newrelic" classname="UpdateNewRelicTask" /> <target name="update-new-relic"> <newrelic /> </target>

Page 86: Phing all the things

Phing All The Things - Omni Adams

<taskdef name="newrelic" classname="UpdateNewRelicTask" /> <target name="update-new-relic"> <newrelic /> </target>

Page 87: Phing all the things

Phing All The Things - Omni Adams

class UpdateNewRelicTask extends Task { protected $version;

public function setVersion($version) { $this->version = $version; } }

Page 88: Phing all the things

Phing All The Things - Omni Adams

<target name="update-new-relic"> <newrelic version="${version}" /> </target>

Page 89: Phing all the things

Phing All The Things - Omni Adams

public function main() { $options = array( CURLOPT_POSTFIELDS => array( 'deployment[application_id]' => $this->appId, 'deployment[description]' => $this->version ), CURLOPT_HTTPHEADER => array( 'x-api-key: ' . $this->apiKey ), CURLOPT_URL => $this->url, ); ...}

Page 90: Phing all the things

Phing All The Things - Omni Adams

public function main() { ... $ch = curl_init(); curl_setopt_array($ch, $options); curl_exec($ch); curl_close($ch);}

Page 91: Phing all the things

Phing All The Things - Omni Adams

Page 92: Phing all the things

Phing All The Things - Omni Adams

Page 93: Phing all the things

Phing All The Things - Omni Adams

• Omni Adams• @omnicolor• http://omni-spot.blogspot.com• [email protected]• https://joind.in/11182