================================================================================================================================================
需求:
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 構建觸發器的配置
【構建觸發器中配置,會獲取到文章開始提到的URL和Token,這兩個東西需要記錄下來,供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"
【注意:本處的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
【本命令的詳解: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的自動化部署,完成!!!
