silverstripe-installer/build.xml
2012-11-17 13:49:07 +13:00

549 lines
22 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!-- Installation instructions:
sudo pear channel-discover pear.phing.info
sudo pear install phing/phing
sudo pear install pear/VersionControl_Git-0.4.4
phing help
-->
<project name="silverstripe-installer" default="tag" phingVersion="2.4.5">
<!-- Load in the custom tasks -->
<taskdef name="findRepos" classname="tools.FindRepositoriesTask" classpath="${project.basedir}" />
<taskdef name="ssmodules" classname="tools.LoadModulesTask" classpath="${project.basedir}" />
<taskdef name="sschanglog" classname="tools.CreateChangelog" classpath="${project.basedir}" />
<taskdef name="gitstash" classname="tools.GitStashTask" classpath="${project.basedir}" />
<taskdef name="updateTranslationsTask" classname="tools.UpdateTranslationsTask" classpath="${project.basedir}" />
<property name="basedir" value="." override="true" />
<property name="dependent-modules-file" value="dependent-modules" override="true" />
<property name="changelog-definitions-file" value="changelog-definitions" override="true" />
<property name="ni_build" value="false" override="true"/> <!-- Prompt if local changes would be overwritten by update -->
<property name="changelogSort" value="type" override="true"/>
<property name="archivedest" value="." />
<available file="${dependent-modules-file}" property="dependent-modules-file-exists" />
<available file="${changelog-definition-file}" property="changelog-definition-file-exists" />
<!--
=================================================================
Helper Targets
=================================================================
-->
<target name="help">
<echo>
SilverStripe Project Build
------------------------------------
This build file contains targets to assist in creating new SilverStripe builds and releases.
Run "phing -l" to get a full list of available targets.
Options:
-Dbasedir = . (the base directory to operate on)
-Ddependent-modules-file = dependent-modules (the file of dependent modules to use when updating modules)
-Dchangelog-definitions-file = changelog-definitions (the file of changelog-definitions to use when generating the changelog)
-DchangelogSort = type (sort the changelog file by commit type)
-Dni_build = false (non-interactive build, overwrite local changes without prompting)
-Dmodurl (the URL of a single module to load when using add_modules)
-Dmodule (the name of the module directory to create the module in when using add_modules)
-Darchivename (the name of the created archive file)
-Darchivedest (the destination directory to put the archive)
-Dtagname (the name of the tag/branch to check out or to create as a new tag)
-DincludeBaseDir (whether or not to include the base dir in a git checkout operation)
</echo>
</target>
<target name="_gitRepositories">
<findRepos TargetDir="${basedir}" />
</target>
<target name="_gitBinary" description="find the git binary and set it">
<exec command="which git" outputProperty="gitPath1" />
</target>
<target name="_tagTask" if="tagname,reponame,gitPath1"
description="Tag a git repo with a specific tag.">
<gittag
repository="${reponame}"
name="${tagname}"
gitPath="${gitPath1}"
force="true" /> <!-- allow overwrite of existing tags-->
<echo msg="git tag '${tagname}' added to '${reponame}' git repository" />
</target>
<target name="_pushTask" if="reponame,gitPath1"
description="Push all local tags">
<ssgitpush
repository="${reponame}"
tags="true"
gitPath="${gitPath1}" />
<echo msg="pushed all tags to '${reponame}' git repository" />
</target>
<target name="_checkoutTask" if="reponame,gitPath1,tagname"
description="Checkout the specified tag on all working copies">
<echo msg="checking out ${reponame}"/>
<gitstash repository="${reponame}" gitPath="${gitPath1}" />
<ssgitcheckout
repository="${reponame}"
branchname="${tagname}"
gitPath="${gitPath1}" />
<gitstash repository="${reponame}" gitPath="${gitPath1}" pop="true" />
<echo msg="checked out ${tagname} tag/branch in '${reponame}' git repository" />
</target>
<target name="_createDependentModulesFile" unless="dependent-modules-file-exists">
<copy file="${dependent-modules-file}.default" tofile="${dependent-modules-file}" />
</target>
<target name="_createChangelogDefinitionsFile" unless="changelog-definitions-file-exists">
<copy file="${changelog-definitions-file}.default" tofile="${changelog-definitions-file}" />
</target>
<!--
=================================================================
Main Targets
=================================================================
-->
<target name="phpunit"
description="Runs unit tests as defined through phpunix.xml. Requires the 'phpunit' binary.">
<if>
<available file="${basedir}/vendor/bin/phpunit" />
<then>
<property name="phpunit_bin" value="vendor/bin/phpunit" />
</then>
<else>
<property name="phpunit_bin" value="phpunit" />
</else>
</if>
<exec command="${phpunit_bin}" checkreturn="true" passthru="true" />
</target>
<target name="behat" if="basedir"
description="Runs behaviour tests through Behat, on the 'framework' and 'cms' modules (if available). Requires phpunit, composer and behat.">
<if>
<available file="${basedir}/framework/" type="dir" />
<then>
<echo msg="Testing 'framework' module" />
<exec command="vendor/bin/behat --ansi @framework" checkreturn="true" passthru="true" />
</then>
</if>
<if>
<available file="${basedir}/cms/" type="dir" />
<then>
<echo msg="Testing 'cms' module" />
<exec command="vendor/bin/behat --ansi @cms" checkreturn="true" passthru="true" />
</then>
</if>
</target>
<target name="tag" if="basedir"
description="Creates a new git tag in all the nested working copies (optionally pushes the created tag)"
depends="_gitRepositories,_gitBinary">
<if>
<isset property="tagname"/>
<then>
<echo msg="Using '${tagname}' tag"/>
</then>
<else>
<input propertyName="tagname" promptChar=":">Please enter the name of the tag</input>
<echo msg="Using '${tagname}' tag"/>
</else>
</if>
<!-- find all git repos and run the tagTask on them -->
<foreach list="${GitReposList}" param="reponame" target="_tagTask" />
<input propertyName="pushToOrigin" defaultValue="no" validArgs="yes,no" promptChar=":">Push local tags to origin?</input>
<if>
<equals arg1="${pushToOrigin}" arg2="yes" casesensitive="false" trim="true"/>
<then>
<phingCall target="pushtags" />
</then>
</if>
</target>
<target name="pushtags" if="basedir"
description="Pushes all local tags to their respective origin repositories"
depends="_gitRepositories,_gitBinary">
<foreach list="${GitReposList}" param="reponame" target="_pushTask" />
</target>
<target name="checkout" if="basedir"
description="Switches all working copies to the specified tag or branch"
depends="_gitRepositories,_gitBinary">
<if>
<isset property="tagname"/>
<then>
<echo msg="Using '${tagname}' tag/branch"/>
</then>
<else>
<input propertyName="tagname" defaultValue="HEAD" promptChar=":">Please enter the name of the tag or branch you wish to checkout</input>
<echo msg="Using '${tagname}' tag/branch"/>
</else>
</if>
<if>
<isset property="includeBaseDir"/>
<then>
<echo msg="Including BaseDir in checkout: ${includeBaseDir}"/>
</then>
<else>
<input propertyName="includeBaseDir" validArgs="yes,no" promptChar=":">Include the base dir '${basedir}' in checkout?</input>
<echo msg="Including BaseDir in checkout: ${includeBaseDir}"/>
</else>
</if>
<if>
<isfalse value="${includeBaseDir}"/>
<then><!-- get a list of git repos without the base dir -->
<findRepos TargetDir="${basedir}" includeTarget="${includeBaseDir}"/>
</then>
</if>
<!-- find all git repos and run the checkoutTask on them -->
<foreach list="${GitReposList}" param="reponame" target="_checkoutTask" />
</target>
<target name="archive" if="basedir" description="Creates a gzip archive from the current folder (removes any version control files)">
<if>
<not><isset property="version"/></not>
<then><input propertyName="version" defaultValue="x.y.z" promptChar=":">Please choose a version</input></then>
</if>
<if>
<isset property="archivename"/>
<then>
<echo msg="Creating '${archivename}' archive"/>
</then>
<else>
<property name="archivename" value="SilverStripe" />
</else>
</if>
<!-- Copy into a new folder, and tar the whole folder in order to avoid toplevel extracts -->
<php function="sys_get_temp_dir" returnProperty="systmp" />
<property name="tmp" value="${systmp}/archiveTask/" />
<delete dir="${tmp}" failonerror="false" quiet="true" />
<copy todir="${tmp}/${archivename}-cms-v${version}">
<fileset dir="${basedir}">
<include name="**/**" />
<exclude name="assets/**" />
<exclude name="mysite/local.conf.php" />
<exclude name="mysite/db.conf.php" />
<exclude name="**/*.log" />
<exclude name="**/.svn/**" />
<exclude name="**/.git/**" />
<exclude name="**/.project" /> <!-- remove eclipse configuration file -->
<exclude name="**/.buildpath" />
<exclude name="**/.settings" />
<exclude name="**/.idea/**" /> <!-- remove phpstorm configuration file -->
<exclude name="tools/**" />
<exclude name="**/tests/**" />
<exclude name="cms/docs/**" />
<exclude name="framework/docs/**" />
<exclude name="build.xml" />
<exclude name="dependent-modules*" />
<exclude name="changelog-definitions*" />
<exclude name="_ss_environment.php" />
<exclude name="*.tar.gz" />
<exclude name="*.zip" />
<exclude name="behat.yml" />
<exclude name="composer.*" />
</fileset>
<fileset dir="${basedir}">
<include name="assets/Uploads" />
<include name="assets/.htaccess" />
<include name="assets/web.config" />
</fileset>
</copy>
<copy todir="${tmp}/${archivename}-framework-v${version}">
<fileset dir="${basedir}">
<include name="**/**" />
<exclude name="assets/**" />
<exclude name="mysite/local.conf.php" />
<exclude name="mysite/db.conf.php" />
<exclude name="**/*.log" />
<exclude name="**/.svn/**" />
<exclude name="**/.git/**" />
<exclude name="**/.project" /> <!-- remove eclipse configuration file -->
<exclude name="**/.buildpath" />
<exclude name="**/.settings" />
<exclude name="**/.idea/**" /> <!-- remove phpstorm configuration file -->
<exclude name="tools/**" />
<exclude name="**/tests/**" />
<exclude name="cms/docs/**" />
<exclude name="framework/docs/**" />
<exclude name="build.xml" />
<exclude name="dependent-modules*" />
<exclude name="changelog-definitions*" />
<exclude name="_ss_environment.php" />
<exclude name="*.tar.gz" />
<exclude name="*.zip" />
<exclude name="behat.yml" />
<exclude name="composer.*" />
<exclude name="cms/**" />
</fileset>
<fileset dir="${basedir}">
<include name="assets/Uploads" />
<include name="assets/.htaccess" />
<include name="assets/web.config" />
</fileset>
</copy>
<!-- Write version info to the core folders (shouldn't be in version control) -->
<echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/framework/silverstripe_version" />
<echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/cms/silverstripe_version" />
<echo msg="${version}" file="${tmp}/${archivename}-cms-v${version}/framework/silverstripe_version" />
<!-- remove any pre-existing archives -->
<delete file="${archivedest}/${archivename}-cms-v${version}.tar.gz" failonerror="false" quiet="true" />
<delete file="${archivedest}/${archivename}-cms-v${version}.zip" failonerror="false" quiet="true" />
<delete file="${archivedest}/${archivename}-framework-v${version}.tar.gz" failonerror="false" quiet="true" />
<delete file="${archivedest}/${archivename}-framework-v${version}.zip" failonerror="false" quiet="true" />
<!-- create tar archive - CMS -->
<tar destfile="${archivedest}/${archivename}-cms-v${version}.tar.gz" compression="gzip">
<fileset dir="${tmp}">
<include name="${archivename}-cms-v${version}/**" />
</fileset>
</tar>
<!-- create zip archive - CMS -->
<zip destfile="${archivedest}/${archivename}-cms-v${version}.zip">
<fileset dir="${tmp}">
<include name="${archivename}-cms-v${version}/**" />
</fileset>
</zip>
<!-- create tar archive - Framework -->
<tar destfile="${archivedest}/${archivename}-framework-v${version}.tar.gz" compression="gzip">
<fileset dir="${tmp}">
<include name="${archivename}-framework-v${version}/**" />
</fileset>
</tar>
<!-- create zip archive - Framework -->
<zip destfile="${archivedest}/${archivename}-framework-v${version}.zip">
<fileset dir="${tmp}">
<include name="${archivename}-framework-v${version}/**" />
</fileset>
</zip>
<!-- clear the temp file -->
<delete file="${tmp}" failonerror="false" quiet="true" />
<echo msg="Created archive: ${archivedest}/${archivename}-cms-v${version}.tar.gz" />
<echo msg="##teamcity[publishArtifacts '${archivename}-cms-v${version}.tar.gz']" />
<echo msg="Created archive: ${archivedest}/${archivename}-cms-v${version}.zip" />
<echo msg="##teamcity[publishArtifacts '${archivename}-cms-v${version}.zip']" />
<echo msg="Created archive: ${archivedest}/${archivename}-framework-v${version}.tar.gz" />
<echo msg="##teamcity[publishArtifacts '${archivename}-framework-v${version}.tar.gz']" />
<echo msg="Created archive: ${archivedest}/${archivename}-framework-v${version}.tar.gz" />
<echo msg="##teamcity[publishArtifacts '${archivename}-framework-v${version}.zip']" />
</target>
<target name="upload-release"
description="Uploads archives previously created through 'ping archive' to a public webhost, and notifies a group of people of the new release. Requires working public key auth on the release destination.">
<if>
<not><isset property="version"/></not>
<then><input propertyName="version" defaultValue="x.y.z" promptChar=":">Please choose a version</input></then>
</if>
<property name="release_dest" value="qa-servers@homer:/sites/ssorg-v2/www/assets/releases/" />
<property name="release_url" value="http://silverstripe.org/assets/releases/" />
<property name="release_notify_list" value="all@silverstripe.com,everyone@silverstripe.com.au" />
<exec command="scp -P 2222 SilverStripe-cms-v${version}.tar.gz SilverStripe-framework-v${version}.tar.gz SilverStripe-cms-v${version}.zip SilverStripe-framework-v${version}.zip ${release_dest}" checkreturn="true" logoutput="true" />
<mail from="reports@silverstripe.com" tolist="${release_notify_list}" subject="SilverStripe ${version} has been uploaded">A new SilverStripe release is ready, and although it hasn't been publicly announced yet, is available at the following locations:
${release_url}SilverStripe-cms-v${version}.tar.gz
${release_url}SilverStripe-framework-v${version}.tar.gz
${release_url}SilverStripe-cms-v${version}.zip
${release_url}SilverStripe-framework-v${version}.zip
Thanks,
Your friendly automated release script.
</mail>
</target>
<target name="upload-nightly"
description="Uploads archives previously created through 'phing archive' to a public webhost">
<property name="nightly_dest" value="qa-servers@homer:/sites/ssorg-v2/www/assets/nightlies/" />
<exec command="scp -P 2222 SilverStripe-*.tar.gz ${nightly_dest}" />
<exec command="scp -P 2222 SilverStripe-*.zip ${nightly_dest}" />
</target>
<target name="update_modules"
description="Checks out repositories defined in the 'dependent-modules' file into the current directory"
depends="_createDependentModulesFile">
<ssmodules file="${basedir}/${dependent-modules-file}" noninteractive="${ni_build}"/>
</target>
<target name="add_module" description="Checks out a module at a specific repository URL. Usage: phing add_module -Dmodule=blog -Dmodurl=http://path/to/svn.">
<if>
<isset property="modurl"/>
<then>
<echo msg="Downloading module from '${modurl}'"/>
</then>
<else>
<input propertyName="modurl" promptChar=":">Please enter the module's git or svn URL</input>
<echo msg="Downloading module from '${modurl}'"/>
</else>
</if>
<if>
<isset property="module"/>
<then>
<echo msg="Creating new '${module}' module"/>
</then>
<else>
<input propertyName="module" promptChar=":">Please enter the module's name (i.e. the folder to module should be created in)</input>
<echo msg="Creating new '${module}' module"/>
</else>
</if>
<ssmodules name="${module}" url="${modurl}" />
</target>
<target name="changelog"
description="Create a changelog.md file from the repositories specified in the 'changelog-definitions' file"
depends="_createChangelogDefinitionsFile"
if="basedir,changelogSort">
<sschanglog definitions="${changelog-definitions-file}" baseDir="${basedir}" sort="${changelogSort}"/>
<echo msg="${changelogOutput}" />
</target>
<target name="translations-staging-setup">
<propertyprompt propertyName="module"
promptText="Module name?"
useExistingValue="true"
defaultValue="framework" />
<propertyprompt propertyName="getlocalization.${module}.project"
promptText="getlocalization project"
useExistingValue="true"
defaultValue="sapphire" />
<propertyprompt propertyName="getlocalization.${module}.user"
promptText="getlocalization username"
useExistingValue="true"
defaultValue="silverstripe" />
<propertyprompt propertyName="getlocalization.${module}.password"
promptText="getlocalization password"
useExistingValue="true" />
<exec command="git checkout master" dir="${module}" checkreturn="true" />
<exec command="git fetch origin" dir="${module}" checkreturn="true" />
<exec command="git branch --force --track translation-staging origin/translation-staging" dir="${module}" checkreturn="true" />
<exec command="git checkout translation-staging" dir="${module}" checkreturn="true" />
</target>
<target name="translations-staging-teardown">
<exec command="git checkout master" dir="${module}" checkreturn="true" />
</target>
<target name="translations-update-git-masterfile"
description="Collect translation on a module, commit them into a specialized branch and push to the origin repository."
depends="translations-staging-setup">
<exec command="git merge --strategy recursive -X theirs origin/master" dir="${module}" checkreturn="true" />
<exec command="php framework/cli-script.php dev/tasks/i18nTextCollectorTask module=${module}" passthru="true" checkreturn="true" />
<exec command="git status --short" dir="${module}" outputProperty="git.status.${module}" />
<if>
<istrue value="${git.status.${module}}" />
<then>
<exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git commit -m 'MINOR Updated translations master'" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git merge origin/master" dir="${module}" checkreturn="true" />
</then>
</if>
</target>
<target name="translations-update-gl-masterfile"
description="Pushes translation master files to getlocalization.com"
depends="translations-staging-setup">
<exec command="curl --fail --form file=@${module}/lang/en.yml --form name='lang/en.yml' --user ${getlocalization.${module}.user}:${getlocalization.${module}.password} https://api.getlocalization.com/${getlocalization.${module}.project}/api/update-master/" passthru="true" checkreturn="true" />
<exec command="git checkout master" dir="${module}" checkreturn="true" />
</target>
<target name="translations-update-gl-contribs" description="Update translations in working copy from getlocalization.com, and commit changes to a specialized branch and push to origin repository. Note: The API requests can take a couple of minutes."
depends="translations-staging-setup">
<exec command="git stash" dir="${module}" />
<updateTranslationsTask
glProductName="${getlocalization.${module}.project}"
glUser="${getlocalization.${module}.user}"
glPassword="${getlocalization.${module}.password}"
modulePath="${module}"
/>
<exec command="git status --short" dir="${module}" outputProperty="git.status.${module}" />
<if>
<istrue value="${git.status.${module}}" />
<then>
<exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git add javascript/lang/*" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git commit -m 'MINOR Updated translations'" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git push origin translation-staging" dir="${module}" checkreturn="true" />
</then>
</if>
<exec command="git checkout master" dir="${module}" checkreturn="true" />
<exec command="git stash pop" dir="${module}" />
</target>
<target name="translations-mergeback"
description="Copies changes from the translation staging branch back to the current branch. Doesn't use 'git merge' because the staging branch works on master. Usage: phing -Dmodule=[module] translations-mergeback">
<php function="sys_get_temp_dir" returnProperty="systmp" />
<property name="tmp" value="${systmp}/translationsMergebackTask/" />
<exec command="git fetch origin" dir="${module}" checkreturn="true" />
<exec command="git branch --force --track translation-staging origin/translation-staging" dir="${module}" checkreturn="true" />
<exec command="git checkout translation-staging" dir="${module}" checkreturn="true" />
<copy todir="${tmp}/${module}">
<fileset dir="${module}/lang" />
</copy>
<exec command="git checkout 3.0" dir="${module}" checkreturn="true" />
<copy todir="${module}/lang" overwrite="true">
<fileset dir="${tmp}/${module}/" />
</copy>
<exec command="git add lang/*" dir="${module}" passthru="true" checkreturn="true" />
<exec command="git commit -m 'Updated translations'" dir="${module}" passthru="true" checkreturn="true" />
<echo msg="Done! Please review the commit before pushing it, ensure no malicious code has been injected." />
</target>
<target name="translations-sync"
description="Wrapper task to handle updating translations and master files, using the getlocalization.com API, committing to a specialized branch in the working copy and pushing to the origin repository. ">
<foreach list="framework,cms" param="module" target="translations-update-git-masterfile" />
<foreach list="framework,cms" param="module" target="translations-update-gl-masterfile" />
<foreach list="framework,cms" param="module" target="translations-update-gl-contribs" />
</target>
</project>