PHP 持續整合簡介 – 系統建構篇
持续整合感觉上是一个很专业的名词,老实说我虽然以前常听到它,但却没有真正去了解过它;因为我一直认为只有需要编译的软件才需要这样的技术,在 Web 开发上其实并没有什么实际的用处。
不过随着工作内容的复杂度增高,我渐渐发现我错了。其实持续整合最重要的是让我们的工作维持在正确的方向,每天都能产出可以稳定运作的最新版本;尤其在多人团队开发时,这样的技术可以确保大家的工作在发生冲突时,可以尽快被发现而解决。
相关的观念我想网络上的前辈都提了很多了,这里我推荐浅谈 CI, Continuous Integration (持续整合) 一文。
接下来,我将为大家介绍持续整合所会使用到的环境,及如何建置它。
环境准备
要能做好持续整合,首先就要先准备好 CI 服务器。这个服务器的环境,要尽可能接近上线系统的环境;这样我们在做完建置和测试并发布程序后,才能确保它在正式上线时不会出问题。
这里推荐大家使用 VM 虚拟机器来建构 CI 服务器,因为这样一来不但可以同时模拟多种上线环境,而且也不需要准备太多的机器。
另外 CI 服务器也需要能够执行 Java ,因为接下来提到的 CI 平台软件需要透过 Java 来执行,所以也请大家先在 CI 服务器上安装好 JDK 。
还有我们也需要一个版本控制系统,不过通常我们不会将它安装在 CI 服务器上,而是安装在我们另行准备的 SCM 服务器。
不过虽然版本控制系统可以不必装在 CI 服务器上,但是我们还是得在 CI 服务器上安装对应的 client 端的命令列维护程序,例如 svn 或 git 等。这边就不详细列出安装过程了,请大家自行依照自己的平台来安装对应的版本。
CI 平台
CI 服务器最重要的角色就是 CI 平台了,我找到了两个较为有名的 CI 平台: CruiseControl 及 Hudson 。而在多方比较及网络上前辈的推荐之下,我选择了 Hudson 这个建置容易而且设定也容易的 CI 平台。
但在写这篇文章时,因为 Oracle 申请了 Hudson 的商标,让 Hudson 开发者决定把名称改为 Jenkins ;后续的内容里,我还是先保留 Hudson 这个名称。
注:可以参考 10 reasons to switch from CruiseControl to Hudson 一文。
这边提供三种安装及执行的方式:
一、透过支持 Servlet 的 Web Container 执行:
1. 安装支持 Servlet 的 Web Container (例如 Apache Tomcat) 。
2. 下载 hudson.war 。
3. 将 hudson.war 放在 webapps 目录中并启动服务器。
4. 在浏览器上开启网址 http://127.0.0.1:8080/hudson 看到 Hudson 的起始画面时即安装成功。
二、 Unix like 系统安装
在没有安装 Web Container 的环境下,我们也可以让 Hudson 透过 daemon 的服务方式来执行。
可以参考在 Hudson 官方首页上的连结,上面有提供各种操作系统的安装方法,以 Ubuntu/Debian 为例:
1. 加入 apt-key :
2. wget -O /tmp/key http://hudson-ci.org/debian/hudson-ci.org.key
sudo apt-key add /tmp/key
3. 安装最新版本的 hudson package :
4. wget -O /tmp/hudson.deb http://hudson-ci.org/latest/debian/hudson.deb
sudo dpkg --install /tmp/hudson.deb
这样就能把 hudson 的服务安装在服务器上了。
和上一个方法不同,我们直接浏览 http://127.0.0.1:8080/ 就可以看到 Hudson 的起始画面了。
三、 Windows 系统安装
在 Windows 上安装好 JDK 后 (别忘记设定 JAVA_HOME 系统变量) ,就可以透过命令列的 java 指令来执行 Hudson :
java -jar hudson.war
这时一样浏览 http://127.0.0.1:8080/ 就能看到 Hudson 的起始画面。
当然这个方法必须得开启一个命令列窗口,相当不方便。我们可以透过 Hudson 提供的功能,来将它注册为 Windows 服务。
在 Hudson 的起始画面左方选单选择「 Manage Hudson (管理Hudson) 」,然后再选择「 Install as Windows Service 」;接着在「 Installation Directory 」的部份输入要安装的路径,例如 C:\hudson ,最后按下「 Install 」。
没有意外的话,就可以在 Windows 的服务里看到 Hudson 正在执行中了。
注:在 1.38x 版以后,我发现 Hudson 可以在管理画面上直接更新,通常在安装后不久, Hudson 就会在画面上方提醒你。
加入 Plugin
安装好 Hudson 后,其实它并不能马上为我们工作,因为我们必须先安装一些必要的 Plugin 才行。
在「 Manage Hudson (管理 Hudson) 」的画面上选择「Manage Plugins (管理插件) 」,并点选「 Available (有效的) 」页签 ;接着找到以下 plugin ,勾选后按下最下方的「 Install (安装) 」。
· Checkstyle (用来显示程序代码格式的分析结果)
· Clover (用来显示程序代码涵盖率的分析结果)
· DRY (用来显示程序是否为复制贴上的分析结果)
· Green Balls (让建置结果以绿色或红色的饼图示呈现)
· JDepend (用来显示程序中类别相依性的分析结果)
· xUnit (用来显示自动化测试的结果)
· Phing (用来呼叫 Phing 以建置 PHP 项目)
安装完后, Hudson 需要重新启动,这时只要按下「 Restart When No Jobs are Running (当没有任何工作正在执行时重新启动) 」钮即可。
准备好 CI 平台后,接下来就是准备建置与测试的工具了。
PHP 建置与测试的工具
接下来所有的 PHP 工具都可以透过 PEAR 安装,因此请确定 CI 服务器上安装了 PEAR 。另外为了避免权限问题,请记得切换到 root 身份来安装所有工具。
建置工具 Phing
一般来说, Hudson 可以搭配各种不同的建置工具,例如 Apache Ant 、 NAnt 等。另外也有高手仿照 Apache Ant ,用 PHP 写了一个相当优秀的建置工具,那就是 Phing 。
这边暂时不对 Phing 做详细介绍,大家有兴趣的话可以参考官方手册,以下先看如何安装 Phing 。
安装 Phing
Phing 有两种安装方式,一种就是直接透过 PEAR 安装:
pear channel-discover pear.phing.info
pear install phing/phing
另一种则是下载 package 档手动安装:
wget http://www.phing.info/get/phing-2.4.4.tgz
unzip phing-2.4.4.tgz -d /opt/
ln -s /opt/phing-2.4.4 /opt/phing
设定 Hudson 对 Phing 的支持
如果 Phing 是用 PEAR 安装的话,基本上可以不需要对 Hudson 做任何设定。但如果是手动安装的话,就要在 Hudson 中设定 Phing 的执行位置。
在起始页右方的选单点下「」,再选择「配置系统」,接着跳到「 Phing 」区块 (在安装 Phing Plugin 后就会出现) 。
按下「 Phing installation 」后面的「新增」钮,在「 name 」后面输入「 Phing 2.4.4 」 (视前面手动安装的版本而定) ;在「 PHING_HOME 」后面输入「 /opt/phing 」,也就是 Phing 安装的目录;最后在「 PHP Command 」后面输入 php 的执行文件路径,例如「 /usr/bin/php 」 (Windows 的话就是 php.exe 的所在路径) 。
测试框架
持续整合最重要的一环就是做自动化测试,在 PHP 上当然首推 PHPUnit 这个自动化测试框架。
而 PHPUnit 也一样透过 PEAR 就可以安装:
pear channel-discover pear.symfony-project.com
pear install symfony/YAML
pear channel-discover pear.phpunit.de
pear channel-discover components.ez.no
pear install -o phpunit/phpunit
程序代码分析工具
除了自动化测试之外,程序代码分析也是持续整合很重要的一环。这里有三种工具可以帮我们分析 PHP 程序代码:
PHP_CodeSniffer 主要是帮我们检查程序代码的 Coding Style ,安装方法如下:
pear install PHP_CodeSniffer
PHP Copy/Paste Detector 顾名思义就是用来检查程序里有没有透过复制贴上所产生的重复程序代码,安装方法如下 (要先安装好 PHPUnit ) :
pear install phpunit/phpcpd
PHP Depend 则是用来检查类别相依性的工具,安装方法如下:
pear channel-discover pear.pdepend.org
pear install pdepend/PHP_Depend-beta
API 文件产生工具
在 PHP 中,当然就是透过 PHPDocumentor 来产生 API 文件 (当然我们的批注也要以 PHPDoc 格式来撰写) ,其安装方法如下:
pear install PhpDocumentor
这样一来,我们就完成了基本的系统建置。当然持续整合可以使用的工具不只这些而已,但在刚接触的前提下,我们就以这些工具为优先学习的对象吧。
下一篇我们将介绍如何建立一个建置工作。