一、環境准備
1)Jenkins 部署 WAR 包:jenkins.war(2.164.2 版本,WAR 包官方下載路徑:https://jenkins.io/download/)
2)Tomcat 服務器:apache-tomcat-7.0.94-windows-x64.zip(使用 Jdk1.8)
3)其他:SVN 服務器,部署環境為聯網狀態(為聯網安裝 Jenkins 插件)
具體搭建過程參考我另一篇博客:信步漫談之Jenkins—集成環境搭建
二、集成自動化部署 SVN 項目流程圖
三、Jenkins 自動化部署插件安裝
1)Jenkins 在初始安裝時已自帶svn插件(插件名:Subversion Plugin-in,可在插件管理中搜索到)
2)點擊 “系統管理”->“插件管理”,搜索 Deploy to container 插件,勾選,點擊 “直接安裝” 即可(該插件功能是集成打包后自動部署到 Web 容器中)
四、SVN 版本庫配置
進入 SVN 的版本庫目錄 conf 文件夾下,打開 svnserve.conf 文件,修改如下配置
anon-access :定義非授權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置為 none 限制訪問, read 為只讀, write 為具有讀寫權限,默認為 read 。
auth-access :定義授權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置為 none 限制訪問, read 為只讀, write 為具有讀寫權限,默認為 write 。
五、Tomcat 服務器配置
1、打開 TOMCAT_HOME/conf/tomcat-users.xml 文件,添加用戶配置如下
<role rolename="manager-gui"/> <role rolename="manager-script"/> <role rolename="manager-jmx"/> <role rolename="manager-status"/> <user username="tomcat_user" password="123456" roles="manager-gui,manager-script,manager-jmx,manager-status" />
2、打開 TOMCAT_HOME/conf/server.xml 文件,修改 URL 地址的編碼解碼字符集如下
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
3、打開 TOMCAT_HOME/bin/setclasspath.bat,在文件首部添加本地 JDK 的環境變量(指向本地安裝的 Jdk1.8)
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_121 set JRE_HOME=C:\Program Files\Java\jre1.8.0_121
六、構建完成自動部署到 Tomcat
1)打開構建項目的配置(集成測試 Demo 程序參考我另一篇博客:信步漫談之Jenkins—集成環境搭建)
2)配置“構建后操作步驟”為“Deploy war/ear to a container”(此處需要用到前面安裝的自動化部署插件),配置 Tomcat 版本以及連接 Tomcat 的用戶名密碼(TOMCAT_HOME/conf/tomcat-users.xml)
注意點:WAR/EAR files 的值是相對於項目工作目錄的 war 包路徑
七、驗證自動化部署到 Tomcat
1)點擊構建項目,查看控制台輸出,可以看到項目已部署到 Tomcat 上
2)打開 Tomcat 日志以及 webapps 目錄,可看到項目部署操作
3)訪問 Tomcat 項目地址正常
八、SVN 鈎子程序
配置 SVN 鈎子程序的目的是實現,在 SVN 執行提交的時候,觸發 Jenkins 構建並部署到 Tomcat 上的操作。
1)打開構建項目,配置構建觸發器,身份驗證令牌可自定義
可以看到以上的說明,Use the following URL to trigger build remotely: JENKINS_URL/job/HelloWorld/build?token=TOKEN_NAME,意思是配置“身份驗證令牌”后,可以通過訪問 http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD 這個地址,觸發 HelloWorld 項目構建操作。那么顯而易見,只要我們在 SVN 提交的時候,自動觸發一次該 URL 地址即可。
2)下載 windows 上的 curl 命令程序(官網地址:https://curl.haxx.se/download.html),下載后解壓到本地即可使用
3)打開 CMD 命令行界面,輸入以下命令,驗證可觸發 Jenkins 構建部署操作。
"E:\Program Files\curlCmd\curl.exe" http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD
4)打開 SVN 的倉庫目錄下的 hooks 文件夾(例如我本地是:E:\Repository\SvnRepositories\repos\hooks),該目錄下是 SVN 提供的事件觸發程序,我們要使用到的是 post-commit.tmpl 這個文件,意思是在 commit(提交)操作時觸發的事件。首先,要將鈎子程序的 tmpl 后綴改為bat,這樣 SVN 才可以識別到。
3)編輯 post-commit.bat 文件,注釋示例程序中原有的代碼,添加以上的 curl 觸發命令
九、SVN 提交后自動化構建部署到 Tomcat
修改測試程序代碼,並提交 SVN,自動觸發構建,成功。
PS:個人覺得使用 SVN 觸發自動化構建部署看起來很高大上,但是實際應用上,可能還會有許多問題,比如在多人開發、項目較趕情況下,很可能會有頻繁提交 SVN 的情況,SVN 服務器和 Jenkins 服務器,不是逼死這個,就是逼死那個,這是可以預見的。
十、SVN 鈎子程序(Linux 環境下)
如果 SVN 是安裝在 Linux 系統中,與 Windows 上差異如下(我使用的是 Windows 上的,來源網絡):
1)hooks 觸發程序直接去掉后綴(例如:post-commit.tmpl 改為post-commit),並且需要使用 chmod 命令賦予 755 權限。
2)Linux 系統有自帶的 curl 命令
執行命令格式如下:
curl -X post -v -u [Jenkins 用戶名]:[Jenkins 密碼] http://[服務器 IP 地址]:[服務器端口號]/jenkins/job/[Jenkins 項目名稱]/build?token=[身份驗證令牌] 例如:curl -X post -v -u admin:171bd768f8ff41cd8fdb7bbc5be8095d http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD
curl 命令參數說明:
Linux 的 curl 命令用來發送 HTTP 請求。 -X 參數: 指定請求方式 -v 參數: 顯示響應結果 -u 參數: 攜帶用戶名/密碼 -H 參數: 攜帶請求消息頭信息
十一、問題解析
1)SVN 提交代碼打包,出現打包的項目非 SVN 上項目最新版本
原因:SVN 服務器和 Jenkins 服務器的時間差影響,Jenkins 的 SVN 插件是使用時間標簽下載,而不是取 HEAD,因此如果 SVN 服務器的提交代碼時間比 Jenkins 的當前時間晚,該代碼就不會被更新。
解決:設置兩個服務器之間的時間同步是一種方式,但更保穩的方式是讓 Jenkins 去獲取 SVN 的 HEAD 版本,我們總是打包最新版本,不是嗎!配置 Jenkins 的 SVN URL加 @HEAD 后綴即可,如下。
2)在使用 Jenkins 項目構建觸發 URL 時,如果提示找不到 Crumb(該問題我沒有遇到,解決方案來源於網絡,如有雷同,絕非巧合,我們很可能剽了同一個作者,感恩)
原因:Jenkins 默認了配置“防止跨站點請求偽造”,如下
解決:通過如下方式獲取 Crumb 值,並修改 項目構建觸發的 curl 命令
攜帶 API Token 訪問下面地址:
http://admin:090d592c760bf922d554ed4b1abb2137@192.168.70.131:8080/jenkins/crumbIssuer/api/xml
則觸發 Jenkins 遠程構建時需要攜帶的請求消息頭就是:
Jenkins-Crumb:5dbccaf47a86bf5b675456f58855fe16
此時,在 Linux 上使用 curl 觸發構建的命令格式如下(Windows 上不知道,遇到再補充):
curl -X post -v -u [Jenkins 用戶名]:[Jenkins 密碼] -H "請求消息頭信息" http://[服務器 IP 地址]:[服務器端口號]/jenkins/job/[Jenkins 項目名稱]/build?token=[身份驗證令牌] curl -X post -v -u admin:2f6bff33bda14baba83ba1c002045f05 -H "Jenkins-Crumb:88a12946e07d82b3b0d567c7c4610c9a" http://192.168.70.131:8080/jenkins/job/ProOne/build?token=ATGUIGU_TOKEN



![clipboard[4] clipboard[4]](/image/aHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMzU4MTY2LzIwMTkwNC8zNTgxNjYtMjAxOTA0MjAyMjA4Mzc3OTMtMjk2NDE3OTE4LnBuZw==.png)



















