首先说下本文用的两个工具:
Phing是一个PHP项目构建系统或建立一个基于工具的Apache Ant.你可以做任何它,你可以做一个传统的构建系统,如GNU make工具,它的使用简单的XML构建文件和可扩展PHP的“任务”类使其易于使用和高度灵活的构建框架
PHPUnit是一个面向PHP程序员的测试框架,这是一个xUnit的体系结构的单元测试框架
现在开始正题,我们先构建自己的发布publish.xml,大致如下:
<?xml version="1.0" encoding="UTF-8"?> <project name="test" default="publish"> <property name="NAME" value="test" /> <property name="MODULE" value="test" /> <property name="RSYNC" value="/usr/bin/rsync" /> <php expression="date('Y-m-d-H-i-s')" returnProperty="TIME"/> <php expression="date('YmdHis')" returnProperty="VERSION" /> <property name="HISTORY_DIR" value="/publish/publish_history/${NAME}/${TIME}"/> <!---从git拉取最新代码--> <target name="pull"> <echo msg="Fulling latest code from repository, this might take a few minutes."/> <mkdir dir="${HISTORY_DIR}" mode="0754"/> <exec level="info" command="cd /publish/${NAME} && git pull origin master" checkreturn="true" logoutput="true"/> </target> <!---生成要发布的代码快照--> <target name="rsync_local" depends="pull"> <echo msg="Rsyncing files to publish_history folder" /> <exec level="info" command="cd /publish/${NAME} && ${RSYNC} -avzR --progress --exclude-from=${EXCLUDE_FILE} * ${HISTORY_DIR}" checkreturn="true" logoutput="false" /> <exec level="info" command="cd ${HISTORY_DIR} && echo ======${VER_DESC}====== >> ./version.txt" checkreturn="true" logoutput="false" /> <exec level="info" command="cd /publish/${NAME} && git log --stat -1 --no-merges >> ${HISTORY_DIR}/version.txt" checkreturn="true" logoutput="false"/> </target> <!---替换测试域名为正式域名--> <target name="replace" depends="rsync_local"> <echo msg="Replacing special string apitest.xtgxiso.com to api.xtgxiso.com" /> <exec level="info" command="grep -rl 'apitest.xtgxiso.com' ${HISTORY_DIR} | while read file ; do sed -i 's/apitest\.xtgxiso\.com/api.xtgxiso.com/g' $file; done" checkreturn="true" logoutput="true"/> </target> <!---替换常量为动态时间,防止CDN缓存--> <target name="update" depends="replace"> <echo msg="Change css version to now timestamp" /> <exec level="info" command="grep -rl '#VERSION#' ${HISTORY_DIR} | while read file ; do sed -i 's/#VERSION#/${VERSION}/g' $file; done" checkreturn="true" logoutput="true"/> </target> <!---删除git代码库系统文件--> <target name="clean" depends="update"> <echo msg="Cleaning some no need files" /> <exec level="info" command="cd ${NAME} && find ./ -name '.gitignore' | xargs rm -f" checkreturn="true" logoutput="true"/> </target> <!---将代码发布到执行单元测试的线上机器--> <target name="rsync_remote" depends="clean"> <echo msg="Rsyncing updated files to remote host" /> <exec level="info" command="cd ${HISTORY_DIR} && ${RSYNC} -avzR --progress --exclude-from '/publish/exclude.txt' * root@192.168.1.128::test/" checkreturn="true" logoutput="false"/> <exec level="info" command="cd ${HISTORY_DIR} && ${RSYNC} -v root@192.168.1.128::test/" checkreturn="true" logoutput="true"/> </target> <!---执行单元测试,如果通过,继续,否则停止发布--> <target name="phpunit" depends="rsync_remote"> <echo msg="phpunit start" /> <ssh failonerror="true" username="test" password="test123456" host="192.168.1.128" port="22" display="true" command="/shell/phpunit.php" /> </target> <!---发布到线上--> <target name="rsync_product" depends="phpunit"> <echo msg="Rsyncing updated files to rsync_product host" /> <exec level="info" command="cd ${HISTORY_DIR} && ${RSYNC} -avzR --progress --exclude-from '/publish/exclude.txt' * root@192.168.1.129::test/" checkreturn="true" logoutput="false"/> <exec level="info" command="cd ${HISTORY_DIR} && ${RSYNC} -v root@192.168.1.129::test/" checkreturn="true" logoutput="true"/> </target> <target name="publish" depends="rsync_product"> </target> </project>
2:在执行单元测试的主机上写要布时运行的脚本(/shell/phpunit.php),内容大致如下:
#!/usr/local/php7/bin/php <?php $output = shell_exec('/shell/phpunit.sh'); $pos = stripos($output,"Failures"); if ($pos === false) { fwrite(STDOUT,$output."\n"); }else{ fwrite(STDOUT,'<font color="red">'.$output."</font>\n"); fwrite(STDERR,$output."\n"); }
3:phpunit.sh脚本内容如下:
#!/bin/bash cd /www/test/tests/ /usr/local/php7/bin/php /usr/local/bin/phpunit --stop-on-failure --verbose --debug
4:发布脚本如下(new_publish.sh):
#!/bin/bash PHING='/usr/bin/phing'; display_usage(){ echo "Usage:" $0 "<xml file> <version description>"; } if [[ $1 =~ '^-(h|-help)$' ]] || [ $# -eq 0 ] || [ $# -lt 2 ]; then display_usage exit fi BUILDXML=$1 TARGET=$3 if [[ ! -x $PHING ]]; then echo -e "\e[1;31mError:\e[0m phing does not exist."; exit; fi if [[ ! -f $BUILDXML ]]; then echo -e "\e[1;31mError:\e[0m There is no build.xml[$BUILDXML]."; exit; fi $PHING -f $BUILDXML -DVER_DESC=$2
这样我们就配置好了简单的发布和单元测试集成系统.
发布命令如下:
./new_publish.sh build.xml test