phing搭建自己的部署系统

标签: deploy phing | 发表时间:2015-02-28 17:35 | 作者:俊森
出处:http://segmentfault.com/blogs

什么是部署?

部署,在我看来是让代码在真实的服务器上跑起来,能够对外提供期望的服务和功能。
例如简单的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,可以写入单独配置文件
简单易用,但是不能支持连续回滚

参考链接

phing 官方示例文档
Building and deploying PHP applications with Phing -by phing lead
Deploy and Release your Applications with Phing

相关 [phing 系统] 推荐:

phing搭建自己的部署系统

- - SegmentFault 最新的文章
部署,在我看来是让代码在真实的服务器上跑起来,能够对外提供期望的服务和功能. 例如简单的web项目:单台服务器, 数据库和web服务器都在一台机器上. 只需要将代码copy到服务器上,保证代码里的数据库配置和服务器上的web配置正确. 再打开浏览器,访问该应用, 能够正常访问和使用,部署就结束了. 代码升级,重新copy代码,忘记修改配置文件,导致服务无法访问怎么办.

壳系统

- Vernsu - It Talks-魏武挥的blog
经常有人被我问到“你用什么浏览器”时的答案是:傲游啦360啦,但事实上,这些都不是真正的浏览器,从技术角度讲,充其量只是在IE浏览器上加一个壳罢了. 在国外,壳浏览器是以“皮肤”的形式存在,纯属为了美化浏览器而用. 但在中国,壳浏览器成了一门生意. 奇虎的主要收入来源并非来自那个由于一场商战而赫赫有名的安全卫士,而是来自于360浏览器(它有两个版本,分别以IE和Chrome为内核).

秒杀系统

- - 开源软件 - ITeye博客
秒杀系统架构分析与实战. (反馈非常好的文章,推荐). (1)查询商品;(2)创建订单;(3)扣减库存;(4)更新订单;(5)付款;(6)卖家发货. (1)低廉价格;(2)大幅推广;(3)瞬时售空;(4)一般是定时上架;(5)时间短、瞬时并发量高;. 假设某网站秒杀活动只推出一件商品,预计会吸引1万人参加活动,也就说最大并发请求数是10000,秒杀系统需要面对的技术挑战有:.

Ext文件系统

- Haides - 博客园-首页原创精华区
  虽然从Ext2到Ext4,找数据的方式发生了变化,但是,磁盘的布局还是非常相似的. 其实这个东西也不需要变化,因为现在也没什么特别巧妙的方式,而且磁盘的吞吐量、效率的瓶颈也不在这里. 当然,这里排除那些根据自身文件特点设计的数据库,毕竟还是为了支持通用文件.   Boot在第一个块,放的应该是引导程序,超级块就放在了第二个块上,如果不是可以在mount的时候通过参数sb来设置.

HBase 系统架构

- - 博客园_首页
HBase是Apache Hadoop的数据库,能够对大型数据提供随机、实时的读写访问. HBase的目标是存储并处理大型的数据. HBase是一个开源的,分布式的,多版本的,面向列的存储模型. 5 可在廉价PC Server搭建大规模结构化存储集群. HBase是Google BigTable的开源实现,其相互对应如下:.

Linux系统监控

- - CSDN博客系统运维推荐文章
查看所有的进程和端口使用情况:. 查看nginx并发(连接数)进程数:. 查看当网络连接状态中,已建立连接的数量:. 查看系统tcp连接中各个状态的连接数. 输出每个ip的连接数,以及总的各个状态的连接数. df -hl 查看磁盘使用情况 . df -hl 查看磁盘剩余空间. df -h 查看每个根路径的分区大小.

mysql 权限系统

- - 数据库 - ITeye博客
mysql 权限系统控制一个用户是否能进行连接,以及连接后能够针对那些对象进行什么操作. mysql权限控制包含两个阶段. 2:检查用户是否具有所执行动作的权限. 本文实例,运行于 MySQL 5.0 及以上版本. MySQL 赋予用户权限命令的简单格式可概括为:. 一、grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利.

银行核心系统-贷款系统【信贷系统】

- - ITeye博客
一、         贷款业务. 贷款按期限分为短期、中期与长期贷款,短期贷款是指期限在1年以内的贷款,中期贷款是指期限在1年(含1年)至3年(含3年)之间的贷款,长期贷款是指期限超过3年的贷款. 贷款的种类目前有个人助学贷款和个人住房贷款:. l     个人助学贷款:须提供两位担保人,无须质押物,贷款额度不超过人民币10万元.

理解Linux系统负荷

- Adam - 阮一峰的网络日志
如果你的电脑很慢,你或许想查看一下,它的工作量是否太大了. 在Linux系统中,我们一般使用uptime命令查看(w命令和top命令也行). (另外,它们在苹果公司的Mac电脑上也适用. 你在终端窗口键入uptime,系统会返回一行信息. 这行信息的后半部分,显示"load average",它的意思是"系统的平均负荷",里面有三个数字,我们可以从中判断系统负荷是大还是小.

iPhone通知系统改进

- armgod - 月光博客
  不管是对比 Android 还是 WebOS ,iOS 的通知系统都只能用低能来形容,也是最让用户不满意的地方之一. 简单列举一些iOS的通知系统不足的地方. 你必须记得是哪个程序通知的你,不记得的话就只能在满屏的 app 中找到上一条或者上几条通知,实在是一件痛苦的事情. 不管你现在做什么都会被打断,只要来了通知就弹出,并且置顶获取焦点,比如你正在玩切水果,刚要破记录了,来一个短信,游戏暂停,短信置顶,节奏都被打乱了.