用Jenkins+Gradle+Jetty實現持續集成、測試、部署

自動集成有不少種方案,本例用到的工具是Jenkins(前身Hudson)+Gradle+Jetty,關於Gradle可參考上一篇,Gradle常見問題html

本例項目名稱: WAPweb

Jetty

安裝Jenkins

本例用的是最新版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

Jetty發佈項目

WAR包:直接拷貝到Jetty的webapps目錄便可,Jetty會監測變化進行熱部署,無需手動從新啓動jetty。spring-mvc

在Jetty啓動項目時有可能遇到OOME錯誤,解決方法:

vim /jetty9/start.ini
##找到#--exec取消註釋,修改以下:
--exec
-XX:MaxPermSize=512m

Jenkins配置

主要設置包括三項:安全

  1. 源碼管理SCM,本例用的是SVN,必要胡設置有一項是SVN地址,另外一項是項目相對存放路徑;服務器

  2. 觸發策略mvc

    Poll SCM:根據SVN版本的變化選擇是否須要進行項目集成;app

    本例是天天上午10點和下午3點,週一到週五(H 10,15 * * 1-5),用的是cron語法,詳細請參考Jenkins說明;eclipse

  3. 執行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

#完!

相關文章
相關標籤/搜索