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

 

================================================================================================================================================html

需求:nginx

1.已經啓動了jenkins【http://www.javashuo.com/article/p-xsubxatg-bc.htmlgit

2.已經啓動了gitlab【http://www.javashuo.com/article/p-uwmcuwun-z.htmlweb

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

================================================================================================================================================docker

 須要瞭解的:shell

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自己還會有不少的觸發條件能夠勾選。後續步驟可見!

 

 

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

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

地址:http://www.javashuo.com/article/p-tduxaslh-z.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項目,能夠去看:http://www.javashuo.com/article/p-tqkcvnur-cn.html

【若是此處添加地址後報錯,或者Jenkins構建報錯:Please make sure you have the correct access rights and the repository exists.去看這篇:http://www.javashuo.com/article/p-xqaizlzw-bu.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

 【本命令的詳解:http://www.javashuo.com/article/p-rixjpvge-ba.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的自動化部署,完成!!!

相關文章
相關標籤/搜索