利用jenkins作項目的自動化部署

最近領導要求上海本地的項目須要使用進jenkins實現自動化部署,以即可以直接將項目移交給運維的同窗,減輕開發的工做量。記錄下此次爬坑的過程。html

1、前言

Jenkins是基於Java開發的一種持續集成工具,用於監控持續重複的工做,功能包括:
一、持續的軟件版本發佈/測試項目。
二、監控外部調用執行的工做。
上面是我從百科上down下來的,老實說沒看懂,這是個什麼玩意啊?其實以我如今的理解和應用,最多的即是部署了,其餘功能待研究╮(╯_╰)╭
擼主目前在上海一個不知名國企打工,咱們如今項目的發佈流程是:
一、本地或打包服務器利用maven打成war包
二、遠程或者SSH連上項目服務器
三、停掉tomcat,刪除舊包和緩存,將新打的包放進去
四、重啓tomcat。完成
看似步驟簡單,其實佔用了大量開發的的時間。
而後使用jenkins後:
一、點擊當即構建,完成。
什麼?就點擊個按鈕就完成了,沒錯,就是個按鈕。其實在你點擊按鈕後jenkins已經幫你把上述該走的流程後臺跑了一遍了,本次就介紹下怎麼讓它後臺跑。

2、安裝構建

本次介紹基於windows,可安裝在開發電腦或者windows server服務器

一、下載jenkins

  jenkins提供多種安裝方式
1.1 jenkins.msi安裝 就像咱們平時安裝軟件同樣,點點點。下載地址:https://jenkins.io/download/ 
1.2 jenkins.war 包   既然是war包,不用說你們都知道怎麼啓動了,扔到tomcat就好了。下載地址:http://updates.jenkins-ci.org/download/war/

二、啓動jenkins

我我的是比較推薦1.1的安裝方式的,1.2我在使用的時候常常遇到內存溢出的問題,固然內存溢出是能夠調整的,可是多出了多餘的工做量不是嘛。
採用1.1的安裝方式,安裝完成後咱們會在windows的服務裏面看到jenkins服務的。以下圖,啓動關閉重啓直接點服務就好了。

採用1.2的的方式下載war包的話,其實有兩種啓動方式。java

第一種,放到tomcat容器,web

第二種,cmd進入安裝目錄,java -jar jenkins.warspring

 三、安裝jenkins

安裝方式1.1和1.2 的流程是同樣的apache

jenkins默認8080端口,能夠修改,方法百度。windows

進入http://localhost:8080/。紅色字體路徑有密碼,將密碼填上,而後下一步。後端

選擇插件,建議選擇官方建議插件,避免不少麻煩。緩存

等待安裝中ing......tomcat

安裝好後看到下圖,用戶名密碼登錄用的,全名是用來顯示的。繼續下一步。服務器

 由於我要部署的是maven項目,jenkins默認的插件中是沒有maven的,首先須要安裝下。

點擊下圖插件直接安裝就好了,maven integration plugins

安裝熱部署插件Deploy to container Plugin

 四、配置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
View Code

Build編譯了,指定pom位置,以及mvn命令,對了高級裏面還能夠配置workspace,不配默認在jenkins安裝目錄中

 構建後操做,就是包打好了放在哪。選擇下圖

本次構建後操做,使用的是tomcat的熱部署,熱部署能夠參考我以前的文章:Tomcat7的熱部署

WAR/EAR:war包的地址

Context:是部署後的包名

UserName/Password是指熱部署tomcat的帳號/密碼

URL:tomcat的界面,如:http://172.16.101.71:8180/

五、開始構建

講了那麼多,終於到了最後了,一個按鈕的操做終於到了,返回jenkins首頁就能夠看到咱們的項目了。

 

構建後點擊左下角構建執行狀態中能夠看到咱們的項目在構建中。點擊項目名進入

選擇Console就能看到咱們構建過程當中打印出來的日誌或者錯誤信息了。

3、存在的問題

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 插件,具體步驟是配置中加入下圖步驟。

一、在系統管理-》系統設置裏找到Publish over SSH 而後輸入:

二、配置Post Steps
這裏仍是接着上面的項目,這個配置得安裝了上面的插件後纔會顯示!

Transfer SetSource files:表示要上傳的本地的war包及路徑,可到工做空間去看
Remove prefix:表示要上傳時要去除的文件夾,即只上傳war包
remote driectory:即表示執行時的路徑,至關於把war包上傳到這裏了
exec commad:要執行的命令

如圖,會將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  
View Code

Deploy插件問題,上文中使用的Deploy to container Plugin插件來實現熱部署,可是deploy插件限制一個工程只能部署一個war包,個人項目是,一個工程先後端分離的兩個war,總不能新建兩個項目構建兩次吧, ̄へ ̄。

 解決:熱部署儘可能不要使用,測試環境暫時使用的話,我目前是,新建兩個工程,每次只編譯一個war包。

相關文章
相關標籤/搜索