最近領導要求上海本地的項目需要使用進jenkins實現自動化部署,以便可以直接將項目移交給運維的同學,減輕開發的工作量。記錄下這次爬坑的過程。
一、前言
Jenkins是基於Java開發的一種持續集成工具,用於監控持續重復的工作,功能包括:1、持續的軟件版本發布/測試項目。2、監控外部調用執行的工作。
二、安裝構建
1、下載jenkins
2、啟動jenkins

采用1.2的的方式下載war包的話,其實有兩種啟動方式。
第一種,放到tomcat容器,
第二種,cmd進入安裝目錄,java -jar jenkins.war
3、安裝jenkins
安裝方式1.1和1.2 的流程是一樣的
jenkins默認8080端口,可以修改,方法百度。
進入http://localhost:8080/。紅色字體路徑有密碼,將密碼填上,然后下一步。
選擇插件,建議選擇官方建議插件,避免很多麻煩。
等待安裝中ing......
安裝好后看到下圖,用戶名密碼登陸用的,全名是用來顯示的。繼續下一步。
因為我要部署的是maven項目,jenkins默認的插件中是沒有maven的,首先需要安裝下。
點擊下圖插件直接安裝就行了,maven integration plugins
安裝熱部署插件Deploy to container Plugin
4、配置jenkins
我們需要配下maven的setting文件,jdk以及maven地址,setting文件一定要配,不要用它默認的,擼主因為這個沒配,出問題糾結好久。
最后Apply然后Save就行了,記得別忘了應用保存,不然白配了。
接着我們來新建一個項目,先輸入項目名,選擇maven項目,OK
選擇源碼管理,因為我們是企業項目,不是開源,使用的SVN,選擇Subversion配置SVN
URL是你SVN地址,Credentials是賬戶密碼
然后到Pre Steps,這個東西是打包前需要什么操作,比如我們現在的項目需要拷貝log4j.xml文件等等,根據環境可以寫windows或者Shell腳本
沒有操作的話,就不用配了。
貼出我的腳本給大家參考,相關部分我用XXX替代

@echo off
rem 設置變量
:: APP.XXX app.XXX代碼的本地跟目錄
set APP.XXX="D:\svn\svn.173.X.X.X\app.XXX\"
::home.omm的log4j.xml 變量START
:: HOME_OMM_LOG4J_GOALS_PATH 存放home.omm的log4j.xml的路徑
set HOME_OMM_LOG4J_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\home.omm\src\main\resources"
::HOME_OMM_LOG4J home.omm的log4j.xml測試環境的路徑
set HOME_OMM_LOG4J="D:\svn\svn.173.X.X.X\app.XXX\config\home.omm\sh_test\resources"
::home.omm的log4j.xml 變量END
::home.weixin的變量START
:: HOME_WEIXIN_LOG4J_GOALS_PATH 存放home.weixin的log4j.xml的路徑
set HOME_WEIXIN_LOG4J_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\home.weixin\src\main\resources"
::HOME_WEIXIN_LOG4J home.weixin的log4j.xml測試環境的路徑
set HOME_WEIXIN_LOG4J="D:\svn\svn.173.X.X.X\app.XXX\config\home.weixin\sh_test\resources"
:: HOME_WEIXIN_CONFIG.JS_GOALS_PATH 存放home.weixin的config.js的路徑
set HOME_WEIXIN_CONFIG.JS_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\home.weixin\src\main\webapp\module\js"
::HOME_WEIXIN_CONFIG.JS home.omm的log4j.xml測試環境的路徑
set HOME_WEIXIN_CONFIG.JS="D:\svn\svn.173.X.X.X\app.XXX\config\home.weixin\sh_test\webapp\module\js"
::home.weixin的變量END
::service的變量START
:: SERVICE_LOG4J_GOALS_PATH 存放service的log4j.xml的路徑
set SERVICE_LOG4J_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\service\src\main\resources"
::SERVICE_LOG4J service的log4j.xml測試環境的路徑
set SERVICE_LOG4J="D:\svn\svn.173.X.X.X\app.XXX\config\service\sh_test\resources"
:: SERVICE_APPLICATION_RESOURCES_ALL_GOALS_PATH 存放application-resources-all.xml的路徑
set SERVICE_APPLICATION_RESOURCES_ALL_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\service\src\main\resources\config\spring"
:: SERVICE_APPLICATION_RESOURCES_ALL application-resources-all.xml測試環境的路徑
set SERVICE_APPLICATION_RESOURCES_ALL="D:\svn\svn.173.X.X.X\app.XXX\config\service\sh_test\resources\config\spring"
::service的變量END
::service.refresh的變量START
:: SERVICE_REFRESH_LOG4J_GOALS_PATH 存放service.refresh的log4j.xml的路徑
set SERVICE_REFRESH_LOG4J_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\service.refresh\src\main\resources"
::SERVICE_REFRESH_LOG4J service的log4j.xml測試環境的路徑
set SERVICE_REFRESH_LOG4J="D:\svn\svn.173.X.X.X\app.XXX\config\service.refresh\sh_test\resources"
:: SERVICE_REFRESH_APPLICATION_RESOURCES_ALL_GOALS_PATH 存放application-resources-all.xml的路徑
set SERVICE_REFRESH_APPLICATION_RESOURCES_ALL_GOALS_PATH="D:\svn\svn.173.X.X.X\app.XXX\src\service.refresh\src\main\resources\config\spring"
:: SERVICE_REFRESH_APPLICATION_RESOURCES_ALL application-resources-all.xml測試環境的路徑
set SERVICE_REFRESH_APPLICATION_RESOURCES_ALL="D:\svn\svn.173.X.X.X\app.XXX\config\service.refresh\sh_test\resources\config\spring"
::service.refresh的變量END
::判斷home.omm的log4j.xml文件是否存在
if exist %HOME_OMM_LOG4J_GOALS_PATH%\log4j.xml (del %HOME_OMM_LOG4J_GOALS_PATH%\log4j.xml)
cd %HOME_OMM_LOG4J_GOALS_PATH%
copy %HOME_OMM_LOG4J%\log4j.xml log4j.xml
::判斷home.weixin的log4j.xml文件是否存在
if exist %HOME_WEIXIN_LOG4J_GOALS_PATH%\log4j.xml (del %HOME_WEIXIN_LOG4J_GOALS_PATH%\log4j.xml)
cd %HOME_WEIXIN_LOG4J_GOALS_PATH%
copy %HOME_WEIXIN_LOG4J%\log4j.xml log4j.xml
::判斷home.weixin的config.js文件是否存在
if exist %HOME_WEIXIN_CONFIG.JS_GOALS_PATH%\config.js (del %HOME_WEIXIN_CONFIG.JS_GOALS_PATH%\config.js)
cd %HOME_WEIXIN_CONFIG.JS_GOALS_PATH%
copy %HOME_WEIXIN_CONFIG.JS%\config.js config.js
::判斷service的log4j.xml文件是否存在
if exist %SERVICE_LOG4J_GOALS_PATH%\log4j.xml (del %SERVICE_LOG4J_GOALS_PATH%\log4j.xml)
cd %SERVICE_LOG4J_GOALS_PATH%
copy %SERVICE_LOG4J%\log4j.xml log4j.xml
::判斷service的application-resources-all.xml文件是否存在
if exist %SERVICE_APPLICATION_RESOURCES_ALL_GOALS_PATH%\application-resources-all.xml (del %SERVICE_APPLICATION_RESOURCES_ALL_GOALS_PATH%\application-resources-all.xml)
cd %SERVICE_APPLICATION_RESOURCES_ALL_GOALS_PATH%
copy %SERVICE_APPLICATION_RESOURCES_ALL%\application-resources-all.xml application-resources-all.xml
::判斷service.refresh的log4j.xml文件是否存在
if exist %SERVICE_REFRESH_LOG4J_GOALS_PATH%\log4j.xml (del %SERVICE_REFRESH_LOG4J_GOALS_PATH%\log4j.xml)
cd %SERVICE_REFRESH_LOG4J_GOALS_PATH%
copy %SERVICE_REFRESH_LOG4J%\log4j.xml log4j.xml
::判斷service.refresh的application-resources-all.xml文件是否存在
if exist %SERVICE_REFRESH_APPLICATION_RESOURCES_ALL_GOALS_PATH%\application-resources-all.xml (del %SERVICE_REFRESH_APPLICATION_RESOURCES_ALL_GOALS_PATH%\application-resources-all.xml)
cd %SERVICE_REFRESH_APPLICATION_RESOURCES_ALL_GOALS_PATH%
copy %SERVICE_REFRESH_APPLICATION_RESOURCES_ALL%\application-resources-all.xml application-resources-all.xml
exit
Build編譯了,指定pom位置,以及mvn命令,對了高級里面還可以配置workspace,不配默認在jenkins安裝目錄中
構建后操作,就是包打好了放在哪。選擇下圖
本次構建后操作,使用的是tomcat的熱部署,熱部署可以參考我之前的文章:Tomcat7的熱部署
WAR/EAR:war包的地址
Context:是部署后的包名
UserName/Password是指熱部署tomcat的賬號/密碼
URL:tomcat的界面,如:http://172.16.101.71:8180/
5、開始構建
講了那么多,終於到了最后了,一個按鈕的操作終於到了,返回jenkins首頁就可以看到我們的項目了。
構建后點擊左下角構建執行狀態中可以看到我們的項目在構建中。點擊項目名進入
選擇Console就能看到我們構建過程中打印出來的日志或者錯誤信息了。
三、存在的問題
jenkins角色問題,既然是發布就涉及到生產環境,不能所有用戶都有部署生產環境的權限吧,如果誰不小心點了下。那后果.....不敢相信。
解決:安裝Role-based Authorization Strategy插件,其余步驟參考:http://www.cnblogs.com/zz0412/p/jenkins_jj_14.html 不在詳述。
tomcat熱部署的問題, deploy幾次之后出現內存上漲溢出,停止運行或者報錯的問題,網上查了下是熱部署本身的問題,正在尋求解決辦法ing.....。
解決:tomcat熱部署本身存在問題,生產環境一般不會采用熱部署的方式。目前我這邊測試環境因為使用的是windows server 2008系統,所以采用的是熱部署的方式,問題依舊存在,但是我看過一個帖子是說可以使用Windows 批處理命令的方式解決,就是bat命令,不過我還未深入研究過。生產環境Linux系統,目前我使用Publish Over SSH 插件,具體步驟是配置中加入下圖步驟。
1、在系統管理-》系統設置里找到Publish over SSH 然后輸入:
2、配置Post Steps
這里還是接着上面的項目,這個配置得安裝了上面的插件后才會顯示!
如圖,會將war包放到home/admin文件夾,接着我會執行我寫的Shell命令。主要涉及,停止tomcat,備份原war包,刪除webapp下原war包,將home/admin下的新war包拷進來,啟動tomcat,然后就完成了。這樣就避免了熱部署內存溢出導致服務器崩潰的問題了。
腳本參考:

#!/bin/sh #defined TOMCAT_HOME="/usr/java/tomcat/apache-tomcat-7.0.67/" ID=`ps -ef | grep java | grep tomcat|awk '{print $2}'` echo $ID echo "kill tomcat" kill -9 $ID echo "remover war file" cd "$TOMCAT_HOME"/webapps rm -rf JavaWeb-0.0.1-SNAPSHOT rm -rf JavaWeb-0.0.1-SNAPSHOT.war echo "copy war to webapp" cd /home/lin cp JavaWeb-0.0.1-SNAPSHOT.war "$TOMCAT_HOME"/webapps cd "$TOMCAT_HOME"/bin echo "start tomcat" ./startup.sh
Deploy插件問題,上文中使用的Deploy to container Plugin插件來實現熱部署,但是deploy插件限制一個工程只能部署一個war包,我的項目是,一個工程前后端分離的兩個war,總不能新建兩個項目構建兩次吧, ̄へ ̄。
解決:熱部署盡量不要使用,測試環境暫時使用的話,我目前是,新建兩個工程,每次只編譯一個war包。