Jenkins自動部署spring boot

yzwine發表於2021-01-19

Jenkins自動部署spring boot

背景介紹

本公司屬於微小型企業,初期業務量不高,所有程式都寫在一個maven專案裡面,不過是多模組開發。

分了login模組,service模組,cms模組。

我們初期部署的是兩臺伺服器,使用nginx把http請求分發到兩臺伺服器上,每次需要釋出新功能的時候,都是手動打包上傳:

1.mvn clean install -Dmaven.test.skip=true(生成好幾個jar包)

2.上傳(兩臺伺服器上傳,總共6個jar包)

3.重新啟動(雖說寫了指令碼,但還是要手動敲命令./restart 回車)。

起初,兩臺伺服器還行,也沒閒太麻煩,但是有一天做活動,考慮到業務量上升,需要把伺服器擴到6臺(當時我的內心是拒絕的,然並卵),還手動上傳jar這種方式,那豈不是究極打工仔麼,我自動部署一搞,豈不美滋滋?

說幹就幹,讓運維把jenkins部署起來,我就開始搞自動部署了。

jenkins配置

新建任務

1.選擇新建任務

2.輸入任務名稱,並選擇構建一個maven專案,確定。

如果沒有maven選項,可以在系統管理->外掛管理->可選外掛,搜尋 Maven Integration plugin 下載安裝,需要重啟生效。

General

General是構建任務的一些基本配置。名稱,描述之類的,這裡調重點來講。

專案名稱: 是剛才建立構建任務步驟設定的,當然在這裡也可以更改。

描述: 對構建任務的描述。

丟棄舊的構建: 伺服器資源是有限的,有時候儲存了太多的歷史構建,會導致Jenkins速度變慢,並且伺服器硬碟資源也會被佔滿。當然下方的"保持構建天數" 和 保持構建的最大個數是可以自定義的,需要根據實際情況確定一個合理的值。

其他幾個選項在這裡不做介紹,有興趣的可以檢視Jenkins"幫助資訊", 會有一個大概的介紹。不過這些"幫助資訊"都是英文的。

引數化構建過程選擇選項引數和字元引數。

選項引數名稱輸入Status,選項輸入Deploy、Rollback。

Deploy:釋出最新版本

Rollback:版本回滾

字元引數名稱輸入Version,這個的值是用來版本回滾用的。

原始碼管理

原始碼管理就是配置你程式碼的存放位置。

Git: 支援主流的github 和gitlab程式碼倉庫。因我們的研發團隊使用的是gitlab,所以下面我只會對該項進行介紹。

Repository URL:倉庫地址

Credentials:憑證。可以使用HTTP方式的使用者名稱密碼,也可以是RSA檔案, 但要通過後面的"ADD"按鈕新增憑證(不懂的可以百度)。

Branches to build:構建的分支。*/master表示master分支,也可以設定為其他分支。

構建觸發器

構建觸發器,顧名思義,就是構建任務的觸發器(具體我也沒用到,一下是百度來的,可以看看)。

觸發遠端構建(例如,使用指令碼): 該選項會提供一個介面,可以用來在程式碼層面觸發構建。

Build after other projects are built: 該選項意思是"在其他projects構建後構建"。

Build periodically: 週期性的構建。很好理解,就是每隔一段時間進行構建。日程表類似 linux crontab書寫格式。

Poll SCM:該選項是配合上面這個選項使用的。當程式碼倉庫發生改動,jenkins並不知道。需要配置這個選項,週期性的去檢查程式碼倉庫是否發生改動。

構建環境

構建環境就是構建之前的一些準備工作,如指定構建工具(這裡也沒有用到,感興趣的可以研究一下)。

Pre Steps

編譯前預處理步驟,我這邊用於版本回滾。選擇執行shell

輸入以下文字

case $Status  in
  Rollback)
    echo "-----本次操作為回滾,版本號為$Version-----"
    git reset --hard $Version
    echo "-----回滾完成,打包中-----"   
    ;;
  *)
  exit
      ;;
esac

Build

打包命令,如果編譯的時候需要其他引數,可以加在後面。

Post Steps

build的後置工作,選擇Run only if build succeeds(這裡選擇的是第二個),在bulid成功後才會執行此操作

由於編譯完成的jar包要釋出到其他的伺服器上,這裡選擇Send files or execute commands over SSH(如果沒有的話,請去外掛管理中下載)。

**SSH Server ** 傳輸配置

name 傳輸的伺服器(在系統配置的SSH Servers中配置,只需把jenkins伺服器生成的id_rsa.pub放到傳輸的伺服器上就行了,詳情請百度)

Transfer 傳輸資訊

​ Source file:需要scp到遠端伺服器的構建jar(如:target/yzwine-0.01.jar)

​ Remove prefix:移除掉構建jar的字首(如:target/)

​ Remote directory:scp到遠端伺服器的目錄(如:/usr/local/web)

​ Exec command:scp完成之後,執行的指令碼命令(如:cd /usr/local/web && ./restart)最好進入資料夾執行,不要/usr/local/web/restart這樣執行,很容易出問題

構建設定

沒有用到,不做詳解

構建後操作

沒用到,不做詳解

自動部署

如果直接釋出,不用填寫version,直接開始構建就好了,如果需要回滾,輸入git上的commit_id,可以構建某個時刻的jar包

後續問題

jenkins傳輸問題

由於需要6臺重新發布,準備在Post Steps這一步配置6臺伺服器傳輸部署,但是測試的時候就有問題。

先是配置了一臺,從構建到釋出需要3分鐘(Jenkins伺服器是上海阿里雲,正式jar執行伺服器是香港亞馬遜的),初步一算,六臺就要18分鐘,如果釋出login、service、cms,就要54分鐘?。。。

自動構建太慢的主要問題是傳輸太慢,而6臺伺服器是屬於同一個內網的,那完全可以上傳到一臺伺服器之後,這臺伺服器通過內網scp傳輸,那速度肯定是噶快噶快的。

#迴圈傳輸jar並重啟服務,針對每個伺服器第一次可能需要輸入yes,後面都不需要了
#! /bin/sh
for i in 172.31.20.113 172.31.22.210 172.31.25.202 172.31.19.108 172.31.20.205 #內網地址
do 
	expect -c "
    	spawn scp -r /usr/local/web/test-0.0.1-SNAPSHOT.jar root@$i:/home/
    	expect {
        	\"*assword\" {set timeout 20; send \"123456\r\"; exp_continue;} #123456是傳輸密碼
    	}
	expect eof"
	sleep 1
	ssh root@$i 'cd /home && ./restartJar.sh'  #進入目錄,重啟服務命令
done

果然,這樣處理之後,部署時間就很快了(100M的jar幾乎是秒傳),基本上3分鐘就能部署好,如果還要加伺服器的話,在內網地址裡面加就好了。

工作總結

很多時候,需要轉換思路,不一定需要配置多個server上傳,最終目的達到就行了。

當然,這個過程中少不了運維同事的配合,有一群志同道合的同事是真的很重要?。

相關文章