效能環境之Jenkins+Maven自動化部署SpringBoot壓測環境(實戰篇)
文章目錄
- 前言
- 整體設計
- 先決條件
- Step 1:安裝sun jdk1.8環境
- Step 2:安裝Maven 3.5
- Step 3:安裝Jenkins
- Step 4:安裝Jenkins外掛
- Step 5:配置Jenkins
- Step 6:Push SSH(SSH免密登入)
- Step 7:新建Jenkins任務
- Step 8:部署專案配置
- Step 9:部署專案
- Step10:測試驗證
前言
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壓測環境已經大功告成!