Skip to content

Instantly share code, notes, and snippets.

@ericmdev
Created September 12, 2016 00:08
Show Gist options
  • Save ericmdev/a1de6ccca170c9906778a9faa030af9c to your computer and use it in GitHub Desktop.
Save ericmdev/a1de6ccca170c9906778a9faa030af9c to your computer and use it in GitHub Desktop.
A base phing build file
remote.user =
remote.host =
remote.deploy-directory =
release.branch = master
git.repository-url =
ssh.public-key =
ssh.private-key =
<?xml version="1.0" encoding="UTF-8"?>
<project name="Project Name" basedir="." default="">
<resolvepath propertyName="project.path" file="." />
<target name="init" hidden="true">
<tstamp>
<format property="TSTAMP" pattern="%s" />
</tstamp>
<property name="builddir" value="${project.path}/build" />
<if>
<isset property="environment" />
<else>
<property name="environment" value="develop" />
</else>
</if>
<if>
<available file="${project.path}/build.${environment}.properties" />
<then>
<property file="build.${environment}.properties" />
</then>
<else>
<property file="build.properties" />
</else>
</if>
</target>
<target name="clean" depends="init" description="Cleans the build directory and prepares it for a new build.">
<if>
<isset property="clean.path" />
<then>
<delete dir="${clean.path}" quiet="true" />
<mkdir dir="${clean.path}" />
</then>
<else>
<delete dir="${builddir}" quiet="true" />
<mkdir dir="${builddir}" />
</else>
</if>
</target>
<target name="rollback" depends="init" description="Rollback release to previous version">
<if>
<and>
<available file="${builddir}/previous-version" />
<not>
<isset property="release" />
</not>
</and>
<then>
<loadfile property="release" file="${builddir}/previous-version" />
</then>
<else>
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="ls -1 '${remote.deploy-directory}/' | tail -n+2"
display="false"
property="available-releases"
/>
<echo msg="Available releases to rollback to:" />
<echo msg="${available-releases}" />
<propertyprompt
propertyName="release"
promptText="Which release to rollback to"
/>
</else>
</if>
<trycatch property="fatal-error">
<try>
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="[ -d '${remote.deploy-directory}/${release}' ] || return 1"
failonerror="true"
/>
</try>
<catch>
<fail message="Could not find release '${release}' on remote server. Exiting." />
</catch>
</trycatch>
<phingcall target="remote:symlink-relative">
<property name="link" value="current" />
<property name="dir" value="${remote.deploy-directory}" />
<property name="todir" value="${release}" />
</phingcall>
</target>
<target name="deploy" depends="init" description="Deploys application to environment.">
<propertyprompt
propertyName="release.branch"
defaultValue="master"
promptText="Which branch to build release"
useExistingValue="true"
/>
<propertyprompt
propertyName="release.name"
defaultValue="${release.branch}.${TSTAMP}"
useExistingValue="true"
promptText="Name for this release"
/>
<property name="build.path" value="${builddir}/${release.name}" />
<phingcall target="clean">
<property name="clean.path" value="${build.path}" />
</phingcall>
<echo msg="Building new release." />
<phingcall target="git-clone">
<property name="dir" value="${build.path}" />
<property name="branch" value="${release.branch}" />
<property name="repository" value="${git.repository-url}" />
</phingcall>
<phingcall target="git-submodule">
<property name="dir" value="${build.path}" />
</phingcall>
<phingcall target="archive">
<property name="dir" value="${build.path}" />
<property name="name" value="${release.name}" />
<property name="filenamepath" value="${build.path}/${release.name}.tar.gz" />
</phingcall>
<echo msg="Copying release to remote host." />
<phingcall target="copy-to-remote">
<property name="file" value="${build.path}/${release.name}.tar.gz" />
</phingcall>
<phingcall target="remote:untar">
<property name="file" value="${remote.deploy-directory}/${release.name}.tar.gz" />
<property name="dir" value="${remote.deploy-directory}/" />
</phingcall>
<echo msg="Moving the active release symlink to this release on remote host." />
<phingcall target="remote:symlink-relative">
<property name="link" value="current" />
<property name="dir" value="${remote.deploy-directory}" />
<property name="todir" value="${release.name}" />
</phingcall>
<phingcall target="remote:clean">
<property name="file" value="${remote.deploy-directory}/${release.name}.tar.gz" />
</phingcall>
<delete file="${builddir}/previous-version" quiet="true" />
<php function="file_put_contents">
<param value="${builddir}/previous-version" />
<param value="${release.name}" />
</php>
<echo msg="Deployment of release '${release.name}' is complete." />
</target>
<target name="setup-dev" depends="init">
<propertyprompt
propertyName="develop-branch"
defaultValue="develop"
useExistingValue="true"
promptText="Branch to checkout for development"
/>
<phingcall target="git-checkout">
<property name="branch" value="${develop-branch}" />
<property name="dir" value="${project.path}" />
</phingcall>
<phingcall target="git-submodule">
<property name="dir" value="${project.path}" />
</phingcall>
</target>
<target name="git-clone" hidden="true">
<exec
command="git clone -b ${branch} ${repository} ${dir}"
passthru="true"
/>
</target>
<target name="git-checkout" hidden="true">
<exec
returnProperty="git-checkout-branch-exists"
command="git show-ref --quiet --verify -- 'refs/remotes/origin/${branch}'"
dir="${dir}"
passthru="true"
/>
<if>
<equals arg1="${git-checkout-branch-exists}" arg2="0" />
<then>
<exec
command="git checkout --track -b ${branch} origin/${branch}"
dir="${dir}"
passthru="true"
/>
</then>
<else>
<exec
command="git checkout -b ${branch}"
dir="${dir}"
passthru="true"
/>
</else>
</if>
</target>
<target name="git-submodule" hidden="true">
<exec
command="git submodule update --init --recursive"
dir="${dir}"
passthru="true"
/>
</target>
<target name="archive" hidden="true">
<tar
destfile="${filenamepath}"
compression="gzip"
includeemptydirs="true"
prefix="${name}"
>
<fileset dir="${dir}">
<include name="**/**" />
<!-- Build related files. -->
<exclude name="build.xml" />
<exclude name="phpunit.xml" />
<exclude name="build.properties" />
<!-- VCS related files. -->
<exclude name="**/.git/**" />
<exclude name="**/.git*" />
<exclude name="**/.svn/**" />
<exclude name="**/.svn*" />
</fileset>
</tar>
</target>
<target name="copy-to-remote" hidden="true">
<scp
username="${remote.user}"
host="${remote.host}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
file="${file}"
todir="${remote.deploy-directory}"
/>
</target>
<target name="remote:untar" hidden="true">
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="tar -xzf '${file}' -C '${dir}'"
/>
</target>
<target name="remote:symlink-relative" hidden="true">
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="cd '${dir}' &amp;&amp; rm -f '${link}' &amp;&amp; ln -s -f '${todir}' '${link}'"
/>
</target>
<target name="remote:symlink" hidden="true">
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="rm -f '${link}'; ln -s -f '${todir}' '${link}'"
/>
</target>
<target name="remote:clean" hidden="true">
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="rm -f '${file}'"
/>
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="rm -rf `find '${remote.deploy-directory}/*' -maxdepth 0 -mindepth 0 -type d | sort -r | tail -n+6`"
/>
</target>
<target name="remote:copy" hidden="true">
<ssh
username="${remote.user}"
pubkeyfile="${ssh.public-key}"
privkeyfile="${ssh.private-key}"
host="${remote.host}"
command="cp '${file}' '${destination}'"
/>
</target>
</project>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment