自動集成有不少種方案,本例用到的工具是Jenkins(前身Hudson)+Gradle+Jetty,關於Gradle可參考上一篇,Gradle常見問題。html
本例項目名稱: WAPweb
本例用的是最新版Jetty9,在安全上作了升級,直接放在webapps目錄部署不能成功,須要在webapps目錄下添加文件jenkins.xml,內容以下:spring
<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/Jettyvim
WAR包:直接拷貝到Jetty的webapps目錄便可,Jetty會監測變化進行熱部署,無需手動從新啓動jetty。spring-mvc
vim /jetty9/start.ini ##找到#--exec取消註釋,修改以下: --exec -XX:MaxPermSize=512m
主要設置包括三項:安全
源碼管理SCM,本例用的是SVN,必要胡設置有一項是SVN地址,另外一項是項目相對存放路徑;服務器
觸發策略mvc
Poll SCM:根據SVN版本的變化選擇是否須要進行項目集成;app
本例是天天上午10點和下午3點,週一到週五(H 10,15 * * 1-5),用的是cron語法,詳細請參考Jenkins說明;eclipse
執行Gradle構建腳本
##進入項目目錄 cd ${WORKSPACE}/WAP ##賦予gradlew執行權限 chmod +x ./gradlew ##執行單元測試 ./gradlew test
配置如圖:
//======================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
結果如圖:
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
#完!