使用 TeamCity 實現持續整合(CI)
持續整合(Continuous Integration),也就是我們經常說的 CI,是現代軟體開發技術的基礎。本文論述瞭如何使用 TeamCity 持續整合工具來實現專案的持續整合。
為我們什麼需要 CI
目前,CI 已在當前業界被許多軟體開發團隊所採用,是一種在整個軟體開發生命週期內保證程式碼質量的常見做法。它是一種開發實踐,旨在幫助開發團隊應對軟體開發過程中的如下挑戰:
- 自動檢查 :當軟體開發團隊在週期性的新增或修改後的程式碼後,CI 伺服器能持續地獲取新增或修改後簽入的原始碼,並可以對這些變更的程式碼進行質量或者編碼規範的檢查。常用的工具有 PMD、SonarQube、CheckStyle、FindBugs等。
- 自動構建 :CI 系統會依照預先制定的配置計劃,或某一特定事件,自動檢出程式碼,並對目標軟體進行構建。這裡的計劃,可以是週期性的時間點,比如10分鐘或者1小時構建一次,也可以根據特定事件來觸發構建,比如使用者主動發出構建命令,或者根據程式碼的變更來觸發構建。構建工具可以選擇 Maven 或者 Ant 等。
- 自動測試 :構建檢查完成後,可以執行預先制定的一套測試規則,也可以在執行構建的過程中進行測試用例的測試,前提是專案團隊採用了測試驅動開發(Test-Driven Development,TDD)。常用的測試工具,有 JUnit、JWebUnit、Selenium 等。
- 自動部署 :當自動化檢查和測試成功完成,將打包軟體、構件部署到一個執行環境或者軟體倉庫。這樣,構件才能更迅速地提供給使用者使用。
- 及時提醒:當上面定義的任何一個階段進行過程中發現出錯或者預設事件得到觸發,都能夠及時通知給相應的專案干係人來進行處理。比如,在構建過程發生了錯誤,CI 伺服器可以郵件通知開發人員來進行修復;自動化部署完成了,CI 伺服器通知會測試人員可以進行測試了,等待。除了郵件,提醒的方式可以是簡訊、桌面通知器,也可以是音響大喇叭。
簡言之,CI 是在敏捷開發過程中,實現速度、效率、質量的軟體開發實踐,可以持續為使用者交付可用的軟體產品。更多詳情可以參考《為什麼我們迫切需要持續整合(Continuous Integration)》。
TeamCity 簡介
正如 TeamCity 官網的自我介紹的那樣,TeamCity 是一款強大的開箱機用 CI 工具(“Powerful Continuous Integration out of the box”)。其特性包括:
- Technology Awareness
- Key Integrations
- Cloud Integrations
- Continuous Integration
- Configuration
- Build History
- Build Infrastructure
- Code Quality Tracking
- VCS Interoperability
- Extensibility and Customization
- System Maintenance
- User Management
- Pre-Tested Commit
TeamCity 分免費專業版授權(Professional Server License)和收費企業版授權(Enterprise Server License)。兩者在功能上完全一致,只是在使用的數量上會有限制,其中,免費版授權包含20 個 build configuration 以及 3 個 build agent。可以單獨購買構建代理授權( Build Agent License),含1個 build agent以及10個build configuration,費用是 299美元。企業版授權在build configuration 上是無限的,可以購買3 到 100 不等的 build agent,費用大概在1999至21999美元之間。
對於試用使用者或者小團隊而言,Professional Server License 足夠了。
使用 TeamCity 實現 CI
下面介紹下 TeamCity 的常見用法。本例使用版本為 TeamCity Professional 10.0.4。
建立專案,關聯原始碼
在建立一個專案(Project)後,可以將專案與相應的原始碼進行關聯。原始碼管理工具支援 Git、CVS、Subversion 等。本例使用的專案是 necc_country,使用的原始碼管理工具為 Subversion。
在 VCS Roots 下,新增一個原始碼關聯的地址: svn://10.30.22.18:32881/unengli/biz/gov/necc/branches/country
。
建立構建配置
構建配置(Build Configurations),是指專案構建過程中,一些列的步驟計劃。比如,可以是程式碼質量檢查、Maven 構建、釋出等等步驟。
我們選擇點選“Edit”按鈕,在“Build Steps”中來設定一些構建計劃。
1. 程式碼質量檢查
使用 SonarQube 來進行程式碼質量檢查。
其中,
- SonarQube Runner Parameters:是 SonarQube 的一些配置引數,包括 SonarQube 伺服器的IP等。
- Sources location:專案原始碼的位置。
- Modules:需要檢查的模組。
2. Maven 構建專案
使用 Maven 來專案的構建。可以自定義 Maven 的 Goals,比如:
clean install -Dmaven.test.skip=true
或者
clean package
等。如果是採用 TDD 的開發方式,建議不要使用-Dmaven.test.skip=true
來過濾掉測試步驟。
3. 部署專案
可以使用 FTP Upload 或者 SSH Upload 等方式將釋出包釋出到部署環境中。在本例,由於 CI 和部署的環境是在同一臺主機上,使用 FTP Upload 即可。
其中,
- Deployment Credentials:部署主機的使用者名稱和密碼。
- Target host:是目標部署環境的位置,這裡的位置是指 使用者的相對路徑位置,比如設定位置為
10.30.22.18:/necc_simulation/gov-tomcat-necc/webapps/gov
,使用的使用者為dev
,那麼,最終部署到主機的絕對路徑為/home/dev/necc_simulation/gov-tomcat-necc/webapps/gov
。 - Paths to sources:待部署釋出包的位置,這裡
%teamcity.build.workingDir%/web/gov/target/gov
中的%teamcity.build.workingDir%
是 TeamCity 構建的工作區間。
4. 重啟 Web 容器
在本例中,我們將專案部署到了 Tomcat 容器中,部署完之後,需要重啟 Tomcat。這裡,我們使用 SSH Exec 來執行一段重啟服 Tomcat 的指令碼。
其中,
- Deployment Target:Tomcat 容器所在的主機。
- Deployment Credentials:部署主機的使用者名稱和密碼。
- SSH Commands:在主機上執行的指令碼。
# 切換到 Tomcat 安裝目錄的 bin 目錄下
cd /home/dev/necc_simulation/gov-tomcat-necc/bin
# 是列印當前的工作目錄
pwd
# 殺掉使用特定埠的 Tomcat 程序,即關閉當前程式
/sbin/fuser -k -n tcp 6060
# 給指令碼賦予可以執行的許可權
chmod 775 startup.sh
# 刪除舊的日誌
rm -rf ../logs/*
# 檢視 Java 版本
java -version
# 啟動
./startup.sh
觸發構建
可以採用自動觸發,或者手動觸發來執行構建。
點選右上角的“Run”即可手動觸發來執行構建。
在將專案與相應的原始碼進行關聯後,預設會生成一個“VCS Trigger”,即,只要有變更提交到程式碼管理伺服器上,就會自動觸發構建。當然,也可以自行新增多種觸發器。
報告
可以檢視整個構建過程的情況,包括構建花費的時間等。
[11:50:33]Finalize build settings
[11:50:38]The build is removed from the queue to be prepared for the start
[11:50:38]Collecting changes in 1 VCS root
[11:50:38]Starting the build on the agent Default Agent
[11:50:38]Clearing temporary directory: /home/unengli/TeamCity/buildAgent/temp/buildTmp
[11:50:38]Publishing internal artifacts
[11:50:38]Using vcs information from agent file: a774be4779f9ea86.xml
[11:50:38]Clean build enabled: removing old files from /home/unengli/TeamCity/buildAgent/work/a774be4779f9ea86
[11:50:38]Checkout directory: /home/unengli/TeamCity/buildAgent/work/a774be4779f9ea86
[11:50:38]Updating sources: server side checkout (3m:08s)
[11:53:47]Step 1/5: maven build (Maven) (3m:33s)
[11:57:21]Step 2/5: deploy gov、ent to 18 test server (SSH Upload)
[11:57:21]Step 3/5: deploy ent to 40 (SSH Upload)
[11:57:21]Step 4/5: deploy to tomcat 7 gov (FTP Upload) (39s)
[11:58:00]Step 5/5: restart tomcat (SSH Exec)
[11:58:00]Publishing internal artifacts
[11:58:01]Build finished