1. 程式人生 > >效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(實戰篇)

效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(實戰篇)

在這裡插入圖片描述

文章目錄

前言

Jenkins是目前最流行的開源CI(持續整合)工具,廣泛用於專案開發,部署和自動化等。
本文將帶著大家一起完成在阿里雲Centos 7伺服器間完成Jenkins+Maven自動化部署SpringBoot壓測環境整個過程。

整體設計

在這裡插入圖片描述
該方案使用Jenkins把打包後的Jar包通過SSH免密的方式上傳到測試應用伺服器指定目錄,上傳成功後執行伺服器的shell指令碼,該指令碼會備份原有程式並kill原有程式程序,部署完Jar並再次啟動,執行的結果的自動化在釘釘群裡通知。

先決條件

在搭建之前,你必須滿足:

  • 兩臺Centos7伺服器並均能使用yum命令
  • 具有sudo許可權的賬號及root賬號

Step 1:安裝sun jdk1.8環境

檢查伺服器是否安裝了OpenJDK

[[email protected] usr]$ yum list installed |grep java
java-1.8.0-openjdk.x86_64            1:1.8.0.181-3.b13.el7_5         @updates   
java-1.8.0-openjdk-headless.x86_64   1:1.8.0.181-3.b13.el7_5         @updates   
javapackages-tools.noarch            3.4.1-11.el7                    @base      
python-javapackages.noarch           3.4.1-11.el7                    @base      
tzdata-java.noarch                   2018e-3.el7                     @updates   

解除安裝OpenJDK

[[email protected] usr]$  sudo yum -y remove java-1.8.0-openjdk.x86_64
[[email protected] usr]$  sudo yum -y remove java-1.8.0-openjdk-headless.x86_64

把預先下載的jdk-8u191-linux-x64.tar.gz包上傳到伺服器並解壓

[[email protected] ~]$ tar -zxvf jdk-8u191-linux-x64.tar.gz 

移動jdk1.8.0_191資料夾到/usr/local/java/目錄下

sudo mv jdk1.8.0_191/ /usr/local/java/

配置JDK環境變數

#備份配置檔案
[[email protected] jdk1.8.0_191]$ sudo cp /etc/profile /etc/profilebackup
[[email protected] jdk1.8.0_191]$ sudo vim /etc/profile
#使配置檔案立即生效
[[email protected] jdk1.8.0_191]$ sudo source /etc/profile

JDK環境變數

#set java environment
export JAVA_HOME=/usr/local/java/jdk1.8.0_191
export PATH=$JAVA_HOME/bin:$PATH

檢查JDK環境

[[email protected] jdk1.8.0_191]$ java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

Step 2:安裝Maven 3.5

下載軟體

[[email protected] ~]$ wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz

解壓軟體並移動到指定目錄

[[email protected] ~]$ tar zvxf apache-maven-3.5.4-bin.tar.gz 
[[email protected] ~]$ sudo mv apache-maven-3.5.4 /usr/local/maven

配置環境變數

[[email protected] ~]$ sudo vim /etc/profile
[[email protected] ~]$ source /etc/profile

環境變數

#set maven environment
MAVEN_HOME=/usr/local/maven
export MAVEN_HOME
export PATH=${PATH}:${MAVEN_HOME}/bin

由於maven預設配置的倉庫在國外導致下載速度較慢,所以我們最好為配置一個國內的映象,這裡為maven配置阿里雲倉庫

[[email protected] ~]$ cd /usr/local/maven/conf/

找到settings.xml在mirrors節點下新增:

<mirrors>
   <!-- mirror
    | Specifies a repository mirror site to use instead of a given repository. The repository that
    | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
    | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
    |
   <mirror>
     <id>mirrorId</id>
     <mirrorOf>repositoryId</mirrorOf>
     <name>Human Readable Name for this Mirror.</name>
     <url>http://my.repository.com/repo/path</url>
   </mirror>
    -->
   <!-- 阿里雲倉庫 -->
       <mirror>
           <id>alimaven</id>
           <mirrorOf>central</mirrorOf>
           <name>aliyun maven</name>
           <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
       </mirror>
 </mirrors>

檢查maven環境

[[email protected] ~]$ mvn -version
Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
Maven home: /usr/local/maven
Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/local/java/jdk1.8.0_191/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.9.1.el7.x86_64", arch: "amd64", family: "unix"

Step 3:安裝Jenkins

下載軟體

[[email protected] ~]$ wget https://pkg.jenkins.io/redhat-stable/jenkins-2.138.2-1.1.noarch.rpm

安裝軟體

[[email protected] ~]$ sudo yum localinstall jenkins-2.138.2-1.1.noarch.rpm 

啟動Jenkins服務並將其設定為在引導時執行

[[email protected] ~]$ sudo systemctl start jenkins.service
[[email protected] ~]$ sudo systemctl enable jenkins.service

Jenkins啟動成功,它自帶Jetty伺服器
通過http://<your-server-IP>:8080訪問
在這裡插入圖片描述

第一次啟動Jenkins時,出於安全的考慮,Jenkins會自動生成一個隨機的口令。在伺服器上使用root賬號登入獲取口令複製下來再瀏覽器內輸入口令。
在這裡插入圖片描述

[[email protected] jenkins]$ su - root
[[email protected] ~]# cd /var/lib/jenkins/secrets/
[[email protected] secrets]# cat initialAdminPassword 
0d3127496a1f4ee3a326ebfa21a8ddc6

管理員密碼輸入0d3127496a1f4ee3a326ebfa21a8ddc6
在這裡插入圖片描述
進入使用者自定義外掛介面,建議選擇安裝官方推薦外掛。在這裡插入圖片描述
進入外掛安裝進度介面
在這裡插入圖片描述
配置使用者密碼
在這裡插入圖片描述
例項配置
在這裡插入圖片描述
安裝完成
在這裡插入圖片描述

Step 4:安裝Jenkins外掛

有很多外掛預設就已經安裝了,需要我們安裝的並不多。
需要安裝外掛如下:

  • Git plugin
  • Maven Integration plugin
  • Publish Over SSH
  • Dingding Plugin

從系統管理>外掛管理>可選外掛>搜尋外掛>勾選安裝,點選直接安裝即可
在這裡插入圖片描述

Step 5:配置Jenkins

系統管理>全域性工具配置

配置JDK

配置本地JDK路徑,去掉勾選自動安裝
在這裡插入圖片描述

配置Maven

配置本地maven路徑,去掉勾選自動安裝
在這裡插入圖片描述
其他內容可根據自己的情況選擇安裝配置。

Step 6:Push SSH(SSH免密登入)

ssh的配置可使用金鑰,也可以使用密碼,這裡我們使用金鑰來配置。
首先檢查伺服器上是否已經生成金鑰,如果沒有使用ssh-keygen -t rsa生成金鑰

[[email protected] ~]# cd ~/.ssh/
[[email protected] .ssh]# ls
authorized_keys  known_hosts
[[email protected] .ssh]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:pJPHl58jAM/a3eaCfCTQxOAIGomm3WSTYwWBlTKrs5E [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|o..o+*oo         |
|o++.Oo  o        |
|+. O.ooo.        |
|. o . .O.  .     |
| o    +.S o      |
|E      =.+.o .   |
| +    ...+o *    |
|.       o o+ .   |
|         . ..    |
+----[SHA256]-----+
[[email protected] .ssh]# ls
authorized_keys  id_rsa  id_rsa.pub  known_hosts

注意:一個矩形圖形出現就說明成功,在~/.ssh/下會有私鑰id_rsa和公鑰id_rsa.pub

將Jenkins伺服器的公鑰id_rsa.pub中的內容複製到測試應用伺服器~/.ssh/下的authorized_keys檔案中
在這裡插入圖片描述

[[email protected] .ssh]# ssh-copy-id -i id_rsa.pub 47.92.172.x

測試應用伺服器授權並重啟SSH服務

#公鑰檔案授權
[[email protected] .ssh]# chmod 644 ~/.ssh/authorized_keys
[[email protected] .ssh]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service

在Jenkins伺服器使用ssh IP測試免密是否能夠登入

[[email protected] .ssh]# ssh 47.92.172.x
Last login: Wed Oct 24 20:34:29 2018 from 111.201.79.x

Welcome to Alibaba Cloud Elastic Compute Service !

注意:這裡最好使用root使用者金鑰進行認證

接下來就是配置Jenkins了
系統管理>系統設定>選擇Publish Over SSH
在這裡插入圖片描述
公共配置:
Passphrase:不用設定
Path to key:key檔案(私鑰)的路徑
Key:將私鑰複製到這個框中
Hostname:需要連線ssh的主機名或ip地址(建議ip)
Username:使用者名稱
Remote Directory:遠端目錄,不用設定
Name:隨意起名代表這個服務,待會要根據它來選擇

高階配置:
Disable exec:禁止執行命令,這個不要勾選,否則沒法執行命令
Use password authentication, or use a different key:可以替換公共配置(選中展開的就是公共配置的東西,這樣做擴充套件性很好)
Port:埠(預設22)
Timeout (ms):超時時間(毫秒)預設即可

配置完成後Test Configuration下,提示success的話就沒問題。

Step 7:新建Jenkins任務

首頁>新建>輸入一個任務名稱>構建一個maven專案
在這裡插入圖片描述
勾選丟棄舊的構建,選擇是否備份替換的舊包。
在這裡插入圖片描述
原始碼管理選擇Git,使用Https方式拉取原始碼,注意如果拉取其它分支版本,請在Branch Specifier輸入分支名稱
在這裡插入圖片描述
構建觸發器中選擇輪訓SCM,設定每天7點左右定輪詢Git
在這裡插入圖片描述
定時構建:無論Git中資料有無變化,均執行定時化的構建任務
輪訓SCM:定時輪詢Git,檢視Git中是否有資料變化,如果有變化,則執行構建任務

定時構建語法:

 * * * * *
  • 第一個*表示分鐘,取值0~59
  • 第二個*表示小時,取值0~23
  • 第三個*表示一個月的第幾天,取值1~31
  • 第四個*表示第幾月,取值1~12
  • 第五個*表示一週中的第幾天,取值0~7,其中0和7代表的都是週日

下面為舉例:

  • 每10分鐘構建一次:H/10 * * * **/10 * * * *
  • 每天8點構建一次:0 8 * * *
  • 每天8點~17點,兩小時構建一次:0 8-17/2 * * *
  • 週一到週五,8點~17點,兩小時構建一次:0 8-17/2 * * 1-5
  • 1-6月中每月1號、30號各構建一次:H H 1,30 1-6 *

構建環境中勾選Add timestamps to the Console Output,構建的過程中會將日誌打印出來
在這裡插入圖片描述
在Build中輸入打包前的mvn命令:clean install -Dmaven.test.skip=true
-Dmaven.test.skip=true表示跳過單元測試
在這裡插入圖片描述
Post Steps 選擇Run only if build succeeds
在這裡插入圖片描述
點選Add post-build step,選擇 Send files or execute commands over SSH,Name選擇上面配置的Push SSH
在這裡插入圖片描述

  • Source files配置:arget/person-0.0.1-SNAPSHOT.jar 專案jar包名
  • Remove prefix:target/
  • Remote directory:Jenkins-in/ 應用伺服器的傳送目錄地址
  • Exec command:Jenkins-in/build.sh 應用伺服器對應的shell指令碼

構建後操作,點選新增“釘釘通知器”
在這裡插入圖片描述
釘釘access token在釘釘群的機器人配置內獲取
在這裡插入圖片描述

Step 8:部署專案配置

測試應用伺服器建立/root/jenkins-in目錄

[[email protected] ~]# pwd
/root
[[email protected] ~]# mkdir jenkins-in

測試應用伺服器建立Jenkins-in目錄下建立build.sh指令碼

#格式化時間
DATE=$(date +%Y%m%d)
#設定程式目錄
DIR=/usr/local/app
#設定Jar名稱
JARFILE=person-0.0.1-SNAPSHOT.jar

#判斷是否存在backp目錄,如果不儲存就建立
if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi
cd $DIR

#殺掉當前執行的舊程式
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
#備份舊程式
mv $JARFILE $DIR/backup/$JARFILE$DATE
#部署新程式
mv -f /root/jenkins-in/$JARFILE .
echo "The service will be starting"
#後臺啟動程式並設定Jvm引數、開啟JMX、列印GC日誌
java -server -Xms1024M -Xmx1024M -XX:PermSize=256M \
-XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
-Xloggc:./gc.log \
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-jar $JARFILE --spring.profiles.active=dev > /nohup 2>&1>out.log &

if [ $? = 0 ];then
        sleep 30
        tail -n 50 out.log
fi

cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
echo "starting success!!!"
~                                                                                                                                                                                  
~                            

這段shell指令碼的大體意思就是,kill舊程式>刪除舊程式>啟動新程式>備份舊程式

Step 9:部署專案

點選“立即構建”,任務控制檯將實時輸出相關資訊
在這裡插入圖片描述
看到輸出了starting success!!!,說明我們的需要測試的程式已經跑起來了。

我們可以去測試應用伺服器上驗證下

[[email protected] app]# ps -ef|grep person
root     16901 15477  0 21:06 pts/1    00:00:00 grep --color=auto person
root     31218     1  0 17:48 ?        00:00:29 java -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:./gc.log -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar person-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
[[email protected] app]# ls
backup  gc.log  out.log  person-0.0.1-SNAPSHOT.jar
[[email protected] app]# cd backup/

我們看到已經成功設定JVM引數,生成了gc.log、out.log。

同時我們的釘釘群也收到程式部署成功的通知
在這裡插入圖片描述

Step10:測試驗證

我們看到需要測試程式已經成功運行了,但是還需要驗證一下是否功能正常?
我們通過驗證此程式其中的查詢人員介面

	/**
	 * 查詢一個人員
	 * @param id
	 * @return
	 */
	@GetMapping(value = "/person/{id}")
	public Person personFindOne(@PathVariable("id") Integer id) {
		return personRepository.findOne(id);
	}

這個介面比較簡單,只需要我們向指定的URL請求一個人員ID即可,這裡我們使用Postman驗證這個介面
在這裡插入圖片描述
我們看到介面正確返回資料了,說明自動部署的程式沒有問題。

下面我們把這個查詢人員的介面的URL修改並重新提交到git上

	/**
	 * 查詢一個人員
	 * @param id
	 * @return
	 */
	@GetMapping(value = "/person/find/{id}")
	public Person personFindOne(@PathVariable("id") Integer id) {
		return personRepository.findOne(id);
	}

重新構建專案,完成後我們可以在Jenkins上看到程式碼更新記錄
在這裡插入圖片描述

接下來我們驗證下新更新程式是否部署成功,我們還是使用Postman請求新修改的介面地址
在這裡插入圖片描述
我們看到新的介面的地址已經成功釋出了,接下來我們檢視下測試應用伺服器情況

[[email protected] backup]# ps -ef|grep person
root     18659     1  6 21:25 ?        00:00:17 java -server -Xms1024M -Xmx1024M -XX:PermSize=256M -XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -Xloggc:./gc.log -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar person-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
root     19113 15477  0 21:30 pts/1    00:00:00 grep --color=auto person
[[email protected] backup]# ls
person-0.0.1-SNAPSHOT.jar20181025
[[email protected] backup]# cd ..
[[email protected] app]# ls
backup  gc.log  out.log  person-0.0.1-SNAPSHOT.jar

我們看到舊的程式已經成功備份,至此我們的自動化部署SpringBoot壓測環境已經大功告成!