phing搭建本身的部署系統

什麼是部署?

部署,在我看來是讓代碼在真實的服務器上跑起來,可以對外提供指望的服務和功能。
例如簡單的web項目:單臺服務器, 數據庫和web服務器都在一臺機器上。
只須要將代碼copy到服務器上,保證代碼裏的數據庫配置和服務器上的web配置正確。
再打開瀏覽器,訪問該應用, 可以正常訪問和使用,部署就結束了。php

部署到這裏真的結束了嗎?
代碼升級,從新copy代碼,忘記修改配置文件,致使服務沒法訪問怎麼辦?
訪問量增長,項目須要部署到N臺機器,難道還手工copy?
開發流程完善,須要有本地環境,測試環境,QA測試環境,線上環境等多個不一樣環境配置,
每一個都要人工修改配置不累死?
代碼出了問題,怎麼回滾?html

部署系統應該支持哪些功能

  1. 多機器文件同步
  2. 多環境配置
  3. 代碼回滾

利用phing搭建本身的部署系統

安裝 phing

支持 pear, composer, phar安裝。能夠根據開發機已經部署哪一種包管理程序來選擇。參考官網安裝說明
若是是經過composer, 安裝到當前項目下,那麼執行./vendor/phing/phing/bin/phing -h,便會出現幫助列表。web

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, 即可看到以下輸出:bash

Buildfile: /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>標籤,即可讀取外部配置文件做爲變量:app

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

那麼,針對不一樣環境讀取不一樣配置文件,只須要將不一樣環境使用的配置文件名做爲變量輸入便可:composer

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

注:input標籤,會在執行 phing 命令後,等待繼續輸入, 輸入內容做爲變量 envssh

更多的入門說明參考: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

相關文章
相關標籤/搜索