docker + gitlab + jenkins автоматическое развертывание и откат

CI/CD

После того, как проект был помещен в тег в соответствии с предыдущей конфигурацией,jenkins hostавтоматически создаст образ докера и поместит его вОблачный реестр Alibaba,Потомjenkins hostпройдетPublish over SSHПлагин создаст сценарий автоматического развертывания и отправит его на указанный хост, затем автоматически остановит предыдущий образ, вытащит текущий образ и запустит его.

Оставшаяся проблема

  1. Резервная версия версии не реализована

    Необходимо реализовать функцию отката версии для поддержки избежания срочных проблем

  2. запись версии отката

    Встроенный образ создается с именем тега gitlab, поэтому при откате версии вы должны знать последний образ для выполнения операции отката, поэтому вам необходимо записать образ каждого автоматического развертывания, чтобы облегчить автоматический откат.

Запись истории автоматического развертывания

Измените сценарий сборки ssh, сгенерируйте сценарий для автоматического развертывания и добавьте последний образ в локальный файл истории для каждого автоматического развертывания, чтобы упростить откат версии.

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Сценарий будет записывать последний образ перед каждым автоматическим развертыванием на/data/jenkins/mi_test_historyВ файле каждая строка этого файла представляет собой обновление версии, и каждое обновление добавляет запись к последней строке файла.

Создание параметризованной задачи сборки

Исходное задание запускается путем прослушивания события push тега gitlab.Для поддержки отката добавляется параметризованная задача сборки, которая поддерживает ручную сборку и ручной откат.

Конфигурация git только что созданной задачи такая же, как у предыдущей задачи, затем проверьтеПараметризованный процесс сборкиИ настройте параметры, сейчас здесь добавлен параметр логического значения, true означает выполнение ручной сборки, false означает откат версии

Создайте сценарий оболочки для выполнения сборки и поддержите анализ параметров конфигурации сборки и выполните различные операции в соответствии с параметрами.

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

Версия сборки вручную в основном аналогична сборке с автоматическим триггером, за исключением того, что к имени образа добавляются идентификатор и номер сборки вручную, а во время отката будет создан сценарий отката./data/jenkins/mi_test_historyВставьте последнюю строку в файл, затем остановите текущую задачу и удалите образ, затем извлеките старую версию образа и запустите

Publish over SSHКонфигурация аналогична предыдущей, главное передать сгенерированный скрипт auto.sh на слейв и выполнить его

функциональный тест

Вручную нажмите на сборку задачи и отметьте пользовательские параметры сборки

Будет сгенерировано новое изображение, чтобы перезаписать предыдущее изображение и запустить его, а также будет создана запись истории.

Вручную щелкните сборку задачи еще раз, на этот раз не проверяйте параметры пользовательской сборки, чтобы выполнить операцию отката версии.

Текущая версия была отброшена к предыдущей версии, и запись версии была очищена, и функция работает нормально.