【Devops】【docker】【CI/CD】3.Jenkins+GitLab+docker+springboot 實現自動化部署


 

================================================================================================================================================

需求:

1.已經啟動了jenkins【https://www.cnblogs.com/sxdcgaq8080/p/10489369.html

2.已經啟動了gitlab【https://www.cnblogs.com/sxdcgaq8080/p/10484576.html

3.jenkins需要按照上面步驟,已經確定maven插件Git插件GitLab插件GitLab hook插件Maven Integration插件Publish Over SSH插件已經成功安裝【Git插件在第一篇初始化啟動,推薦安裝的、其他幾個插件是在第一篇末尾安裝的】

================================================================================================================================================

 需要了解的:

1.webhook網絡鈎子

可以看成是一個callback  回調方法
本回調方法核心即包含:
    觸發條件+可供觸發的URL+密碼(可選) 
    觸發條件為:push、merge、PR(即 New  Pull Request)等等git操作,
    比如你提交一個push操作,就會觸發URL請求,會以POST請求去請求這個URL。

除此以外,你還可以自己指定這個POST請求的數據格式。(JSON,x-www-form-urlencoded等)。
2.webhook是gitlab端的

觸發webhook的條件,可以自行配置,都是本地對gitlab的git操作

觸發后去請求的URL地址,是Jenkins提供的。也就是觸發后是去請求Jenkins的

 

3.而實現代碼從gitlab到jenkins到自動部署,webhook就是gitlab和jenkins之間的關鍵點。


后續會先配置jenkins,以獲取到URL和Token,拿着這兩個東西去gitlab配置webhook,即可。

同時,webhook本身還會有很多的觸發條件可以勾選。后續步驟可見!

 

 

=================================================================正文開始====================================================================================

1.jenkins全局工具配置【docker容器Jenkins,自動安裝】

地址:https://www.cnblogs.com/sxdcgaq8080/p/10571718.html

 

2.jenkins全局安全配置

進入系統管理   ------> 全局安全配置

 

取消勾選CSRF

原因:

webhooks與jenkins配合使用時提示:HTTPStatus403-Novalidcrumbwasincludedintherequest,這是因為jenkins在http請求頭部中放置了一個名為.crumb的token。在使用了反向代理,並且在jenkins設置中勾選了“防止跨站點請求偽造(Prevent Cross Site Request Forgery exploits)”之后此token會被轉發服務器apache/nginx認為是不合法頭部而去掉。導致跳轉失敗。

 

 

3.新建Jenkins任務

 

3.1點擊新建任務,輸入名稱【本處輸入名稱注意】

【注意,本名稱一般和項目名稱一致,因為本名稱會在jenkins工作空間下生成目錄,類似於IDEA或Ecplise的工作空間的概念】

【所以,一般情況下,保證本名稱=項目名稱=docker鏡像名稱=docker容器名稱  這樣能盡可能的減輕jenkins配置的shell命令的復雜性!從而形成一定的規范!!】

選擇構建一個Maven項目【因為是spring boot的服務】

 

 

 

3.2 General選項卡,通用設置下輸入描述信息

自由輸入

 

3.3 Source code manager 源碼管理 選擇Git

【內網推薦使用Http地址去clone項目】

【分別使用SSH和HTTP取clone項目,可以去看:https://www.cnblogs.com/sxdcgaq8080/p/10577252.html

【如果此處添加地址后報錯,或者Jenkins構建報錯:Please make sure you have the correct access rights and the repository exists.去看這篇:https://www.cnblogs.com/sxdcgaq8080/p/10577241.html

 

 3.4 Build Triggers 構建觸發器的配置

【構建觸發器中配置,會獲取到文章開始提到的URLToken,這兩個東西需要記錄下來,供gitlab配置webhook使用】

記錄URL

http://192.168.92.130:9980/project/swapping

 

URL和Token都需要填寫到GitLab中,去配置webhooks!!!

 

點擊高級后,最下方可以點擊生成Token

記錄Token

6b2eb2c3a9d1d2f64c73784bf30a4cda

 

 

3.5 Build Environment 構建環境的配置根據自己需求配置

 

 

 

 

3.6 Pre Steps 即jenkins構建前一步 需要做的事情

 【本處,配置前一步需要做的事情是:清理swapping即本項目在jenkins的workspace中的歷史文件夾】

【在本步驟配置時,你可以不用知道WORKSPACE具體的地址在哪里,因為下方有鏈接可以查看到當前jenkins中有哪些可用的變量供你使用】

【默認WORKSPACE地址:/var/jenkins_home/workspace】

【當然,如果你jenkins是docker啟動的,並且掛載了目錄在宿主機,那你在宿主機也是可以看到的】

 

【注意:本處選擇是是,執行shell,則表示本處配置的shell命令,是默認在jenkins容器中執行的,而不是在宿主機上】

 

可以查看可用的全局變量

 

前一步要做的shell命令:

SERVER_NAME_1=swapping
echo "=========================>>>>>>>工作空間WORKSPACE的地址:$WORKSPACE "
cd $WORKSPACE

echo "=========================>>>>>>>進入工作空間WORKSPACE,清除工作空間中原項目的工作空間$SERVER_NAME_1 "
rm -rf $SERVER_NAME_1

echo "=========================>>>>>>>清除工作空間中原項目的工作空間$SERVER_NAME_1 ......成功success"
View Code

【注意:本處的SERVER_NAME_1=swapping 是配置的項目的名稱】 

 

 

 

 

3.7 Build 構建的配置

jenkins構建項目,本處是以maven插件實現的。

因此,配置

clean package

 

 

 

3.8 Post Steps 即jenkins構建完成后一步配置

【本處選擇,只在jenkins構建成功后,再執行這一步】

【因為最后的構建成功的maven項目的jar包是以docker啟動服務為目的,所以最后的docker操作,一定是在jenkins容器以外的服務器上運行的,可能是本機宿主機,也可能是遠程的服務器】

【所以本處選擇,在遠程的SSH執行shell腳本】

【因此,必須要求,文章初始的第一篇中,必要安裝的插件已經要安裝完成。此處尤其是Publish Over SSH插件以及它的相關配置

 

 

 

 

shell命令如下:

#=====================================================================================
#=================================定義初始化變量======================================
#=====================================================================================

#操作/項目路徑(Dockerfile存放的路勁)
BASE_PATH=/apps/swapping

# jenkins構建好的源jar路徑  
SOURCE_PATH=/apps/Devops/jenkins/workspace

#【docker 鏡像】【docker容器】【Dockerfile同目錄下的jar名字[用它build生成image的jar]】【jenkins的workspace下的項目名稱】
#這里都以這個命名[微服務的話,每個服務都以ms-swapping這種格式命名]
#注意統一名稱!!!!!
SERVER_NAME=swapping

#容器id  [grep -w 全量匹配容器名] [awk 獲取信息行的第一列,即容器ID]  [無論容器啟動與否,都獲取到]
CID=$(docker ps -a | grep -w "$SERVER_NAME" | awk '{print $1}')

#鏡像id  [grep -w 全量匹配鏡像名] [awk 獲取信息行的第三列,即鏡像ID]
IID=$(docker images | grep -w "$SERVER_NAME" | awk '{print $3}')

#源jar完整地址  [jenkins構建成功后,會在自己的workspace/項目/target 下生成maven構建成功的jar包,獲取jar包名的完整路徑]
#例如:/apps/Devops/jenkins/workspace/swapping/target/swapping-0.0.1-SNAPSHOT.jar
SOURCE_JAR_PATH=$(find "$SOURCE_PATH/$SERVER_NAME/target/"  -name "*$SERVER_NAME*.jar" )

DATE=`date +%Y%m%d%H%M%S`


#=====================================================================================
#============================對原本已存在的jar進行備份================================
#=====================================================================================



# 備份
function backup(){
    if [ -f "$BASE_PATH/$SERVER_NAME.jar" ]; then
        echo "=========================>>>>>>>$SERVER_NAME.jar 備份..."
            mv $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar
        echo "=========================>>>>>>>備份老的 $SERVER_NAME.jar 完成"

    else
        echo "=========================>>>>>>>老的$BASE_PATH/$SERVER_NAME.jar不存在,跳過備份"
    fi
}



#=====================================================================================
#=========================移動最新源jar包到Dockerfile所在目錄=========================
#=====================================================================================


 
# 查找源jar文件名,進行重命名,最后將源文件移動到項目環境
function transfer(){
       
         
    echo "=========================>>>>>>>源文件完整地址為 $SOURCE_JAR_PATH"

        
    echo "=========================>>>>>>>重命名源文件"
        mv $SOURCE_JAR_PATH  $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar

    echo "=========================>>>>>>>最新構建代碼 $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar 遷移至 $BASE_PATH"
        cp $SOURCE_PATH/$SERVER_NAME/target/$SERVER_NAME.jar $BASE_PATH 

    echo "=========================>>>>>>>遷移完成Success"

}
 


#=====================================================================================
#==================================構建最新鏡像=======================================
#=====================================================================================


 
# 構建docker鏡像
function build(){
    
    #無論鏡像存在與否,都停止原容器服務,並移除原容器服務
    echo "=========================>>>>>>>停止$SERVER_NAME容器,CID=$CID"
    docker stop $CID

    echo "=========================>>>>>>>移除$SERVER_NAME容器,CID=$CID"
    docker rm $CID

    #無論如何,都去構建新的鏡像
    if [ -n "$IID" ]; then
        echo "=========================>>>>>>>存在$SERVER_NAME鏡像,IID=$IID"


        echo "=========================>>>>>>>移除老的$SERVER_NAME鏡像,IID=$IID"
        docker rmi $IID

        echo "=========================>>>>>>>構建新的$SERVER_NAME鏡像,開始---->"
        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>構建新的$SERVER_NAME鏡像,完成---->"

    else
        echo "=========================>>>>>>>不存在$SERVER_NAME鏡像,構建新的鏡像,開始--->"


        cd $BASE_PATH
        docker build -t $SERVER_NAME .
        echo "=========================>>>>>>>構建新的$SERVER_NAME鏡像,結束--->"
    fi
}
 

#=====================================================================================
#==============================運行docker容器,啟動服務===============================
#=====================================================================================




# 運行docker容器
function run(){
    backup
    transfer
    build

    docker run --name $SERVER_NAME -itd --net=host -v /etc/localtime:/etc/localtime:ro  -v /etc/timezone:/etc/timezone:ro  $SERVER_NAME 

}
 
#入口
run 
View Code

 【本命令的詳解:https://www.cnblogs.com/sxdcgaq8080/p/10599166.html

 

 

 

 

 3.9  最后,點擊應用,並保存

 

 

 

 4.GitLab配置

下來就是GitLab這邊的配置!!

 

4.1 打開gitlab,並進入要自動部署的項目,點擊左側setting

 

 4.2 Integration  選擇集成,開始配置webhook

將從jenkins獲取到的URL和Token,填寫在此處

【根據自己的需求,勾選webhook的觸發事件都有哪些】

 

 

最后點擊添加

添加后,即可在下方看到剛剛添加的webhook!!

 

然后即可點擊Test,選擇剛剛勾選的綁定的觸發事件 ,即可回到jenkins查看測試效果!!!

 

對於 上面勾選的權限,測試結果如下,即代表成功!!!

 

 

對於未勾選的 權限 接口,點擊測試

 未授權的接口 測試 是這個結果!!!!!

 

 

 

5.回到jenkins,查看測試效果,或自行進行構建事件

再次回到Jenkins,開始進行構建!!!

 

下方顯示出構建的任務進度,可以點擊進去,查看控制台輸出

 

 

 

 

 

 

 

 

 

 

 

===========================================================================================

至此,spring boot在jenkins+gitlab+docker的自動化部署,完成!!!

 


免責聲明!

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



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