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—集成環境搭建html
1)Jenkins 在初始安裝時已自帶svn插件(插件名:Subversion Plugin-in,可在插件管理中搜索到)
2)點擊 「系統管理」->「插件管理」,搜索 Deploy to container 插件,勾選,點擊 「直接安裝」 便可(該插件功能是集成打包後自動部署到 Web 容器中)web
進入 SVN 的版本庫目錄 conf 文件夾下,打開 svnserve.conf 文件,修改以下配置
anon-access :定義非受權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置爲 none 限制訪問, read 爲只讀, write 爲具備讀寫權限,默認爲 read 。
auth-access :定義受權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置爲 none 限制訪問, read 爲只讀, write 爲具備讀寫權限,默認爲 write 。apache
一、打開 TOMCAT_HOME/conf/tomcat-users.xml 文件,添加用戶配置以下
windows
<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" />
二、打開 TOMCAT_HOME/conf/server.xml 文件,修改 URL 地址的編碼解碼字符集以下
api
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>
三、打開 TOMCAT_HOME/bin/setclasspath.bat,在文件首部添加本地 JDK 的環境變量(指向本地安裝的 Jdk1.8)
tomcat
set JAVA_HOME=C:\Program Files\Java\jdk1.8.0_121 set JRE_HOME=C:\Program Files\Java\jre1.8.0_121
1)打開構建項目的配置(集成測試 Demo 程序參考我另外一篇博客:信步漫談之Jenkins—集成環境搭建)服務器
2)配置「構建後操做步驟」爲「Deploy war/ear to a container」(此處須要用到前面安裝的自動化部署插件),配置 Tomcat 版本以及鏈接 Tomcat 的用戶名密碼(TOMCAT_HOME/conf/tomcat-users.xml)網絡
注意點:WAR/EAR files 的值是相對於項目工做目錄的 war 包路徑app
1)點擊構建項目,查看控制檯輸出,能夠看到項目已部署到 Tomcat 上curl
2)打開 Tomcat 日誌以及 webapps 目錄,可看到項目部署操做
3)訪問 Tomcat 項目地址正常
配置 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,自動觸發構建,成功。
PS:我的以爲使用 SVN 觸發自動化構建部署看起來很高大上,可是實際應用上,可能還會有許多問題,好比在多人開發、項目較趕狀況下,極可能會有頻繁提交 SVN 的狀況,SVN 服務器和 Jenkins 服務器,不是逼死這個,就是逼死那個,這是能夠預見的。
若是 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