網站製作學習誌

記錄學習製作網站的一切

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 平台: CruiseControlHudson 。而在多方比較及網路上前輩的推薦之下,我選擇了 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 的起始畫面時即安裝成功。

Hudson 起始頁

二、 Unix like 系統安裝

在沒有安裝 Web Container 的環境下,我們也可以讓 Hudson 透過 daemon 的服務方式來執行。

可以參考在 Hudson 官方首頁上的連結,上面有提供各種作業系統的安裝方法,以 Ubuntu/Debian 為例:

  1. 加入 apt-key :

    1
    2
    
    wget -O /tmp/key http://hudson-ci.org/debian/hudson-ci.org.key
    sudo apt-key add /tmp/key
  2. 安裝最新版本的 hudson package :

    1
    2
    
    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 :

1
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 」。

Hudson 管理頁

沒有意外的話,就可以在 Windows 的服務裡看到 Hudson 正在執行中了。

Windows 服務

註:在 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 安裝:

1
2
pear channel-discover pear.phing.info
pear install phing/phing

另一種則是下載 package 檔手動安裝:

1
2
3
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 就可以安裝:

1
2
3
4
5
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 ,安裝方法如下:

1
pear install PHP_CodeSniffer

PHP Copy/Paste Detector 顧名思義就是用來檢查程式裡有沒有透過複製貼上所產生的重複程式碼,安裝方法如下 (要先安裝好 PHPUnit ) :

1
pear install phpunit/phpcpd

PHP Depend 則是用來檢查類別相依性的工具,安裝方法如下:

1
2
pear channel-discover pear.pdepend.org
pear install pdepend/PHP_Depend-beta

API 文件產生工具

在 PHP 中,當然就是透過 PHPDocumentor 來產生 API 文件 (當然我們的註解也要以 PHPDoc 格式來撰寫) ,其安裝方法如下:

1
pear install PhpDocumentor

這樣一來,我們就完成了基本的系統建置。當然持續整合可以使用的工具不只這些而已,但在剛接觸的前提下,我們就以這些工具為優先學習的對象吧。

下一篇我們將介紹如何建立一個建置工作。

Comments