docker + gitlab + jenkins 自動部署及回滾

按以前配置已經完成了項目推送至 tag 後,jenkins host 會自動構建 docker 鏡像,並將鏡像推送至 阿里雲 registry,而後 jenkins host 會經過 Publish over SSH 插件,將生成一個自動部署的腳本push到指定的主機中,而後自動中止以前的鏡像並 pull 當前的鏡像並運行git

遺留問題

  1. 版本回退功能未實現docker

    須要實現版本回退功能支持對緊急問題的規避shell

  2. 回退版本記錄bash

    構建的 image 是以 gitlab tag 名稱來建立的,因此版本回退時,必需要知道上一次的 image 才能進行回退操做,因此須要記錄每次自動部署時的 image 以方便自動部署回滾ssh

記錄自動部署歷史

修改構建ssh腳本,生成自動部署的腳本中,加入每次自動部署時將上次的image寫入本地歷史文件中便於版本回退gitlab

CONTAINER_NAME="citest"
GIT_TAG=`git describe --always --tag`
CONTAINER_FULL_NAME=${CONTAINER_NAME}-${GIT_TAG}
REPOSITORY=registry.cn-shanghai.aliyuncs.com/xxx/${CONTAINER_NAME}:${GIT_TAG}
 # 構建Docker鏡像
docker build -t $REPOSITORY -f Dockerfile .
 # 推送Docker鏡像
docker login --username=xxx --password=password registry.cn-shanghai.aliyuncs.com
docker push $REPOSITORY
 # 刪除生成的image
docker images | grep citest | awk '{print $1":"$2}' | xargs docker rmi || true
 # 刪除名稱或標籤爲none的鏡像
docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'` || true

mkdir -p ./release && rm -f ./release/repull && echo \
"docker ps | grep citest | awk '{print \$2}' >> /data/jenkins/mi_test_history\n"\
"echo /data/jenkins/mi_test_history\n"\
"docker ps | grep citest | awk '{print \$1}' | xargs docker kill || true\n"\
"docker images | grep citest | awk '{print \$1\":\"\$2}' | xargs docker rmi -f || true\n"\
"docker login --username=xxx --password=password registry.cn-shanghai.aliyuncs.com\n"\
"docker pull $REPOSITORY\n"\
"docker run -d $REPOSITORY" >> ./release/repull
複製代碼

這裏每次完成構建後,會生成一個自動部署腳本 repull 並將此腳本發送到其餘指定的主機中執行自動部署,而修改後的 repull 腳本會再每次自動部署前都記錄一下上次的 image 到 /data/jenkins/mi_test_history 文件中,這個文件每一行表明一次版本更新,每次更新都會添加記錄至文件的最後一行測試

建立參數化構建任務

原來的job是經過監聽 gitlab 的 tag 推送事件來觸發的,爲了支持回滾,因此添加一個參數化構建的任務,該任務支持手動構建及手動回退版本ui

新建立任務的 git 配置與以前任務一致,而後勾選 參數化構建過程 並配置參數,這裏目前添加一個bool值參數,true表示執行手動構建,false表示版本回退阿里雲

建立構建執行的shell腳本,並支持對構建配置的參數的解析,按參數執行不一樣的操做spa

if [ "$CTRL_BUILD" = "true" ]
then
	echo "to build image"
	CONTAINER_NAME="citest"
	GIT_TAG=`git describe --always --tag`"_manual_$BUILD_NUMBER"
    CONTAINER_FULL_NAME=${CONTAINER_NAME}-${GIT_TAG}
	REPOSITORY=registry.cn-shanghai.aliyuncs.com/xxx/${CONTAINER_NAME}:${GIT_TAG}
 # 構建Docker鏡像
	docker build -t $REPOSITORY -f Dockerfile .
 # 推送Docker鏡像
	docker login --username=xxx --password=password registry.cn-shanghai.aliyuncs.com
	docker push $REPOSITORY
 # 刪除生成的image
	docker images | grep citest | awk '{print $1":"$2}' | xargs docker rmi || true
 # 刪除名稱或標籤爲none的鏡像
	docker rmi -f  `docker images | grep '<none>' | awk '{print $3}'` || true

	rm -f ./auto.sh && echo \
	"docker ps | grep citest | awk '{print \$2}' >> /data/jenkins/mi_test_history\n"\
	"echo /data/jenkins/mi_test_history\n"\
	"docker ps | grep citest | awk '{print \$1}' | xargs docker kill || true\n"\
	"docker images | grep citest | awk '{print \$1\":\"\$2}' | xargs docker rmi -f || true\n"\
	"docker login --username=xxx --password=password registry.cn-shanghai.aliyuncs.com\n"\
	"docker pull $REPOSITORY\n"\
	"docker run -d $REPOSITORY" >> ./auto.sh
else
	echo "to rollback image"
    rm -f ./auto.sh && echo \
	"popline(){ LC_CTYPE=C l=\`tail -\"\${2:-1}\" \"\$1\"; echo t\`; l=\${l%t}; truncate -s \"-\${#l}\" \"\$1\"; printf %s \"\$l\"; }\n"\
	"last=\`popline /data/jenkins/mi_test_history || \"\"\`\n"\
	"if [ -n \"\$last\" ]; then\n"\
	"\tdocker ps | grep citest | awk '{print \$1}' | xargs docker kill || true\n"\
	"\tdocker images | grep citest | awk '{print \$1\":\"\$2}' | xargs docker rmi -f || true\n"\
	"\tdocker login --username=xxx --password=password registry.cn-shanghai.aliyuncs.com\n"\
	"\tdocker pull \$last\n"\
	"\tdocker run -d \$last\n"\
	"\techo \"rollback to \$last success\"\n"\
	"else\n"\
	"\techo \"nothing to rollback\"\n"\
	"fi\n" >> ./auto.sh
fi
複製代碼

手動構建版本與自動觸發構建基本一致,只是 image 名稱會添加手動構建的標識及構建編號,回滾時會生成一個回滾的腳本,回滾腳本將會從 /data/jenkins/mi_test_history 文件中 pop出最後一行,而後中止當前的任務並刪除 image,而後 pull 舊版本的 image 並運行

Publish over SSH 的配置與以前差很少,主要就是將生產的 auto.sh 腳本傳輸到從機並執行

功能測試

手動點擊任務構建,並勾選自定義構建參數

會生成一個新的 image 覆蓋以前的 image 並運行,也產生了 history 記錄

再次手動點擊任務構建,此次不勾選自定義構建參數來進行版本回退操做

目前版本已經回退至上個版本並清除版本記錄,功能正常

相關文章
相關標籤/搜索