1. 程式人生 > >Java利用jenkins做專案的自動化部署

Java利用jenkins做專案的自動化部署

本地的jekins密碼

2722e8ea873b4cf08884c22dff732bab
 

 

這篇文章主要介紹了Java利用jenkins做專案的自動化部署,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

最近領導要求上海本地的專案需要使用進jenkins實現自動化部署,以便可以直接將專案移交給運維的同學,減輕開發的工作量。記錄下這次爬坑的過程。

一、前言

Jenkins是基於Java開發的一種持續整合工具,用於監控持續重複的工作,功能包括:

1、持續的軟體版本釋出/測試專案。

2、監控外部呼叫執行的工作。

上面是我從百科上down下來的,老實說沒看懂,這是個什麼玩意啊?其實以我現在的理解和應用,最多的便是部署了,其他功能待研究╮(╯_╰)╭擼主目前在上海一個不知名國企打工,我們現在專案的釋出流程是:

1、本地或打包伺服器利用maven打成war包

2、遠端或者SSH連上專案伺服器

3、停掉tomcat,刪除舊包和快取,將新打的包放進去

4、重啟tomcat。完成看似步驟簡單,其實佔用了大量開發的的時間。

然後使用jenkins後:

1、點選立即構建,完成。什麼?就點選個按鈕就完成了,沒錯,就是個按鈕。其實在你點選按鈕後jenkins已經幫你把上述該走的流程後臺跑了一遍了,本次就介紹下怎麼讓它後臺跑。

二、安裝構建

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

1、下載jenkins  

jenkins提供多種安裝方式

1.1jenkins.msi安裝 就像我們平時安裝軟體一樣,點點點。下載地址:https://jenkins.io/download/

1.2jenkins.war 包 既然是war包,不用說大家都知道怎麼啟動了,扔到tomcat就行了。下載地址:http://updates.jenkins-ci.org/download/war/

2、啟動jenkins

我個人是比較推薦1.1的安裝方式的,1.2我在使用的時候經常遇到記憶體溢位的問題,當然記憶體溢位是可以調整的,但是多出了多餘的工作量不是嘛。

採用1.1的安裝方式,安裝完成後我們會在windows的服務裡面看到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替代

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

@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

這裡還是接著上面的專案,這個配置得安裝了上面的外掛後才會顯示!

Transfer SetSource files:表示要上傳的本地的war包及路徑,可到工作空間去看

Remove prefix:表示要上傳時要去除的資料夾,即只上傳war包

remote driectory:即表示執行時的路徑,相當於把war包上傳到這裡了

exec commad:要執行的命令

如圖,會將war包放到home/admin資料夾,接著我會執行我寫的Shell命令。主要涉及,停止tomcat,備份原war包,刪除webapp下原war包,將home/admin下的新war包拷進來,啟動tomcat,然後就完成了。這樣就避免了熱部署記憶體溢位導致伺服器崩潰的問題了。

指令碼參考:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

#!/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包。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。