信步漫談之Jenkins—集成自動化部署 SVN 項目


一、環境准備

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 項目流程圖

image

三、Jenkins 自動化部署插件安裝

1)Jenkins 在初始安裝時已自帶svn插件(插件名:Subversion Plugin-in,可在插件管理中搜索到)
2)點擊 “系統管理”->“插件管理”,搜索 Deploy to container 插件,勾選,點擊 “直接安裝” 即可(該插件功能是集成打包后自動部署到 Web 容器中)

clipboard

image

四、SVN 版本庫配置

進入 SVN 的版本庫目錄 conf 文件夾下,打開 svnserve.conf 文件,修改如下配置
anon-access :定義非授權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置為 none 限制訪問, read 為只讀, write 為具有讀寫權限,默認為 read 。
auth-access :定義授權用戶的訪問權限,有三種方式: none 、 read 、 write ,設置為 none 限制訪問, read 為只讀, write 為具有讀寫權限,默認為 write 。

clipboard[4]

五、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—集成環境搭建)

image

image

2)配置“構建后操作步驟”為“Deploy war/ear to a container”(此處需要用到前面安裝的自動化部署插件),配置 Tomcat 版本以及連接 Tomcat 的用戶名密碼(TOMCAT_HOME/conf/tomcat-users.xml)

image

注意點:WAR/EAR files 的值是相對於項目工作目錄的 war 包路徑

七、驗證自動化部署到 Tomcat

1)點擊構建項目,查看控制台輸出,可以看到項目已部署到 Tomcat 上

image

2)打開 Tomcat 日志以及 webapps 目錄,可看到項目部署操作

image

image

3)訪問 Tomcat 項目地址正常

image

八、SVN 鈎子程序

配置 SVN 鈎子程序的目的是實現,在 SVN 執行提交的時候,觸發 Jenkins 構建並部署到 Tomcat 上的操作。
1)打開構建項目,配置構建觸發器,身份驗證令牌可自定義

image

可以看到以上的說明,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),下載后解壓到本地即可使用

1556372092(1)

image

3)打開 CMD 命令行界面,輸入以下命令,驗證可觸發 Jenkins 構建部署操作。

"E:\Program Files\curlCmd\curl.exe" http://192.168.1.5:8080/jenkins/job/HelloWorld/build?token=ALFRED_BUILD

image

4)打開 SVN 的倉庫目錄下的 hooks 文件夾(例如我本地是:E:\Repository\SvnRepositories\repos\hooks),該目錄下是 SVN 提供的事件觸發程序,我們要使用到的是 post-commit.tmpl 這個文件,意思是在 commit(提交)操作時觸發的事件。首先,要將鈎子程序的 tmpl 后綴改為bat,這樣 SVN 才可以識別到。

image

3)編輯 post-commit.bat 文件,注釋示例程序中原有的代碼,添加以上的 curl 觸發命令

1556376758(1)

九、SVN 提交后自動化構建部署到 Tomcat

修改測試程序代碼,並提交 SVN,自動觸發構建,成功。

image

image

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 后綴即可,如下。

image

2)在使用 Jenkins 項目構建觸發 URL 時,如果提示找不到 Crumb(該問題我沒有遇到,解決方案來源於網絡,如有雷同,絕非巧合,我們很可能剽了同一個作者,感恩)

原因:Jenkins 默認了配置“防止跨站點請求偽造”,如下

image

image

解決:通過如下方式獲取 Crumb 值,並修改 項目構建觸發的 curl 命令

image

image

image

image

攜帶 API Token 訪問下面地址:
http://admin:090d592c760bf922d554ed4b1abb2137@192.168.70.131:8080/jenkins/crumbIssuer/api/xml

image

則觸發 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM