转载

phing搭建自己的部署系统

什么是部署?

部署,在我看来是让代码在真实的服务器上跑起来,能够对外提供期望的服务和功能。

例如简单的web项目:单台服务器, 数据库和web服务器都在一台机器上。

只需要将代码copy到服务器上,保证代码里的数据库配置和服务器上的web配置正确。

再打开浏览器,访问该应用, 能够正常访问和使用,部署就结束了。

部署到这里真的结束了吗?

代码升级,重新copy代码,忘记修改配置文件,导致服务无法访问怎么办?

访问量增加,项目需要部署到N台机器,难道还手工copy?

开发流程完善,需要有本地环境,测试环境,QA测试环境,线上环境等多个不同环境配置,

每个都要人工修改配置不累死?

代码出了问题,怎么回滚?

部署系统应该支持哪些功能

  1. 多机器文件同步
  2. 多环境配置
  3. 代码回滚

利用phing搭建自己的部署系统

安装 phing

支持 pear , composer , phar 安装。可以根据开发机已经部署哪种包管理程序来选择。参考官网 安装说明

如果是通过composer, 安装到当前项目下,那么执行 ./vendor/phing/phing/bin/phing -h ,便会出现帮助列表。

phing 快速入门

输出 HelloWorld:

phing 通过 xml 文件配置执行任务, 创建 deploy.xml 文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="dist">     <target name="dist">         <echo msg="Hello World!" />     </target> </project> 

定义了一个 project ,默认执行 dist 任务, dist 任务通过 target 标签定义,

echo 标签只是简单的输出 msg 属性中的值

执行 ./vendor/phing/phing/bin/phing -f ./deploy.xml , 便可看到如下输出:

Buildfile: /Users/hubiao/project/phing/./deploy.xml  HelloWorld > dist:       [echo] Hello World!       BUILD FINISHED       Total time: 0.0666 seconds 

将HelloWorld放入配置文件

将常见变量放入单独的配置文件,便于维护。创建 deploy.properties 文件,定义一个变量: string ,文件内容只有一行: string=Echo HelloWorld By Config File

修改 deploy.xml ,添加 <property> 标签,便可读取外部配置文件作为变量:

<?xml version="1.0" encoding="UTF-8"?> <project name="HelloWorld" default="dist">     <property file="deploy.properties"/>     <target name="dist">         <echo msg="${string}" />     </target> </project> 

那么,针对不同环境读取不同配置文件,只需要将不同环境使用的配置文件名作为变量输入即可:

<input message="please input env:" propertyName="env" > </input> <property file="${env}.properties"/> 

注: input 标签,会在执行 phing 命令后,等待继续输入, 输入内容作为变量 env

更多的入门说明参考: phing Getting Start

文件同步

phing 支持 ftpscp 上传文件

使用 scp , 需要php安装 ssh2.so 扩展

例如: scp 一个目录

<scp username="vagrant" password="vagrant" host="192.168.33.21" todir="/www">     <fileset dir="./src">         <include name="**/**" />     </fileset> </scp> 

加速 scp :本地压缩

<tar compression="gzip" destfile="package.tgz" basedir="./src"/> <scp username="${ssh.username}" password="${ssh.password}" host="${ssh.host}" todir="${releases_dir}/${build.time}" file="./package.tgz" /> <ssh username="${ssh.username}"      password="${ssh.password}"      host="${ssh.host}"      display="true"      command="tar -C ${releases_dir}/${build.time} -zxf ${releases_dir}/package.tgz" /> 

先使用 tar压缩文件,再执行 scp , 最后通过 ssh 在远程服务器上解压文件。

注: 一次 ssh 只能执行一次命令。 批量执行需要通过其他方式,例如 bash script

多环境部署

不同环境使用不同的配置文件,可以使用 <input> 读取环境变量(前文已经说明)或者 -D 参数指定变量, ./vendor/phing/phing/bin/phing -D env=dev -f phing.xml

代码回滚

每次部署代码时,创建个新目录,保证目录名不重复,可以是时间戳或版本号。

web根目录通过软链接指向最新目录, 例如: /var/www -> /deploy_dir/1423432343

上次提交的目录 /var/back -> /deploy_dir/1423400000

回滚时, 只需复制重命名链接: cp -P /var/back /var/www 便可。

完整的 target 实现:

<target name="quick_rollback">     <echo message="unlink ${deploy_dir}"/>     <ssh username="${ssh.username}"      password="${ssh.password}"      host="${ssh.host}"      display="true"      command="unlink ${deploy_dir}" />     <echo message="roll back"/>     <ssh username="${ssh.username}"      password="${ssh.password}"      host="${ssh.host}"      display="true"      command="cp -P ${back_link} ${deploy_dir}" /> </target>  

其中 $deploy_dir$back_link 分别是 /var/www /var/back ,可以写入单独配置文件

简单易用,但是不能支持连续回滚

参考链接

正文到此结束
Loading...