Jenkins自動部署spring boot


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上傳,最終目的達到就行了。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM