================================================================================================================================================html
需求:nginx
1.已經啓動了jenkins【http://www.javashuo.com/article/p-xsubxatg-bc.html】git
2.已經啓動了gitlab【http://www.javashuo.com/article/p-uwmcuwun-z.html】web
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
地址:http://www.javashuo.com/article/p-tduxaslh-z.html安全
進入系統管理 ------> 全局安全配置服務器
取消勾選CSRF
緣由:
webhooks與jenkins配合使用時提示:HTTPStatus403-Novalidcrumbwasincludedintherequest,這是由於jenkins在http請求頭部中放置了一個名爲.crumb的token。在使用了反向代理,而且在jenkins設置中勾選了「防止跨站點請求僞造(Prevent Cross Site Request Forgery exploits)」以後此token會被轉發服務器apache/nginx認爲是不合法頭部而去掉。致使跳轉失敗。
【注意,本名稱通常和項目名稱一致,由於本名稱會在jenkins工做空間下生成目錄,相似於IDEA或Ecplise的工做空間的概念】
【因此,通常狀況下,保證本名稱=項目名稱=docker鏡像名稱=docker容器名稱 這樣能儘量的減輕jenkins配置的shell命令的複雜性!從而造成必定的規範!!】
選擇構建一個Maven項目【由於是spring boot的服務】
自由輸入
【內網推薦使用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】
【構建觸發器中配置,會獲取到文章開始提到的URL和Token,這兩個東西須要記錄下來,供gitlab配置webhook使用】
記錄URL
http://192.168.92.130:9980/project/swapping
URL和Token都須要填寫到GitLab中,去配置webhooks!!!
點擊高級後,最下方能夠點擊生成Token
記錄Token
6b2eb2c3a9d1d2f64c73784bf30a4cda
【本處,配置前一步須要作的事情是:清理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 是配置的項目的名稱】
jenkins構建項目,本處是以maven插件實現的。
所以,配置
clean package
【本處選擇,只在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
【本命令的詳解:http://www.javashuo.com/article/p-rixjpvge-ba.html】
下來就是GitLab這邊的配置!!
將從jenkins獲取到的URL和Token,填寫在此處
【根據本身的需求,勾選webhook的觸發事件都有哪些】
最後點擊添加
添加後,便可在下方看到剛剛添加的webhook!!
而後便可點擊Test,選擇剛剛勾選的綁定的觸發事件 ,便可回到jenkins查看測試效果!!!
對於 上面勾選的權限,測試結果以下,即表明成功!!!
對於未勾選的 權限 接口,點擊測試
未受權的接口 測試 是這個結果!!!!!
再次回到Jenkins,開始進行構建!!!
下方顯示出構建的任務進度,能夠點擊進去,查看控制檯輸出
===========================================================================================
至此,spring boot在jenkins+gitlab+docker的自動化部署,完成!!!