自動集成有很多種方案,本例用到的工具是Jenkins(前身Hudson)+Gradle+Jetty,關於Gradle可參考上一篇,Gradle常見問題。
本例項目名稱: WAP
Jetty
安裝Jenkins
本例用的是最新版Jetty9,在安全上做了升級,直接放在webapps目錄部署不能成功,需要在webapps目錄下添加文件jenkins.xml,內容如下:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Set name="contextPath">/jenkins</Set>
<Set name="war"><SystemProperty name="jetty.home" default="."/>/webapps/jenkins.war</Set>
<Get name="securityHandler">
<Set name="loginService">
<New class="org.eclipse.jetty.security.HashLoginService">
<Set name="name">Jenkins Realm</Set>
<Set name="config"><SystemProperty name="jetty.home" default="."/>/etc/realm.properties</Set>
</New>
</Set>
</Get>
</Configure>
詳見:https://wiki.jenkins-ci.org/display/JENKINS/Jetty
Jetty發布項目
WAR包:直接拷貝到Jetty的webapps目錄即可,Jetty會監測變化進行熱部署,無需手動重新啟動jetty。
在Jetty啟動項目時有可能遇到OOME錯誤,解決方法:
vim /jetty9/start.ini
##找到#--exec取消注釋,修改如下:
--exec
-XX:MaxPermSize=512m
Jenkins配置
主要設置包括三項:
-
源碼管理SCM,本例用的是SVN,必要胡設置有一項是SVN地址,另一項是項目相對存放路徑;
-
觸發策略
Poll SCM:根據SVN版本的變化選擇是否需要進行項目集成;
本例是每天上午10點和下午3點,周一到周五(H 10,15 * * 1-5),用的是cron語法,詳細請參考Jenkins說明;
-
執行Gradle構建腳本
##進入項目目錄 cd ${WORKSPACE}/WAP ##賦予gradlew執行權限 chmod +x ./gradlew ##執行單元測試 ./gradlew test
配置如圖:
Gradle - build.gradle測試和部署部分
//======================Test集成測試===========================
test {
//測試結果,默認為成功!
ext.testResult = true
testLogging.showStandardStreams = true
// 使用 TestNG ,默認是JUnit
useTestNG()
// 設置JVM運行時參數
minHeapSize = "128m"
maxHeapSize = "512m"
jvmArgs '-XX:MaxPermSize=256m'
//一組測試完成,如果有一組測試是失敗的則設置整體結果為失敗
afterSuite { descriptor, result ->
if (result.resultType == TestResult.ResultType.FAILURE) {
testResult = false
}
}
}
/**
* 單元測試完成,如果成功則部署應用到測試環境的Jetty webapps目錄,Jetty會自動熱部署!
*/
task testCompleted <<{
if (test.testResult) {
try {
logger.lifecycle("Build war package!" )
//編譯、打包
war.execute()
//COPY到部署目錄進行部署
//可根據不版本分別分發到不同開發過程服務器,如M,BETA類型等
//本例只發布到集成測試服務器
//發布目錄,可通過gradle.properties配置
def projectBuildDir = "/webapps/"
def warname = projectName + '-' + version + '.war'
def fromdir = buildDir.toString() + "/libs/" + warname
copy{
logger.lifecycle("Copy war from: $fromdir To : $projectBuildDir")
from fromdir
into projectBuildDir
rename { String fileName ->
projectName + '.war'
}
}
} catch (Exception ex) {
logger.error("Error!" + ex.message )
}
}
}
//在執行完集成測試后執行testCompleted任務,根據測試結果判斷是否需要部署。
test.finalizedBy testCompleted
查看集成測試報告
測試報告地址:
http://xxx/jenkins/job/WAP/ws/WAP/target/reports/tests/index.html
結果如圖:
構建控制台輸出Console Output
Started by an SCM change
Building in workspace /home/hadoop/.hudson/jobs/WAP/workspace
Updating https://192.168.0.140/svn/JENKINS-TEST/WAP at revision '2013-07-10T15:28:28.900 +0800'
U src/main/webapp/WEB-INF/spring-mvc.xml
U src/main/webapp/tologin.html
At revision 12
[workspace] $ /bin/sh -xe /tmp/hudson166417485787384228.sh
+ cd /home/hadoop/.hudson/jobs/WAP/workspace/WAP
+ chmod +x ./gradlew
+ ./gradlew test
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:compileTestJava UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:buildDashboard UP-TO-DATE
:testCompleted
Build war package!
Copy war from: /home/xxx/.hudson/jobs/WAP/workspace/WAP/target/libs/wap-1.0.war To : /usr/local/jetty9/webapps/
BUILD SUCCESSFUL
Total time: 35.719 secs
Finished: SUCCESS
#完!