fix(ci): 禁止 release 部署回退 latest
This commit is contained in:
33
Jenkinsfile
vendored
33
Jenkinsfile
vendored
@@ -350,6 +350,20 @@ pipeline {
|
||||
// 同步当前分支对应的 compose 文件到部署服务器(master→core、release/next→release)
|
||||
echo "📂 Syncing ${env.COMPOSE_FILE} to deploy host..."
|
||||
sh "scp -o StrictHostKeyChecking=no -i ${env.SSH_KEY} ${env.COMPOSE_FILE} root@${env.DEPLOY_HOST}:${env.DEPLOY_PATH}/"
|
||||
def composeProjectName = env.BRANCH_NAME == 'release/next' ? 'aiot-platform-release' : 'aiot-platform'
|
||||
echo "Writing compose env to deploy host..."
|
||||
sh """
|
||||
ssh -o StrictHostKeyChecking=no -i ${env.SSH_KEY} root@${env.DEPLOY_HOST} '
|
||||
set -e
|
||||
cd ${env.DEPLOY_PATH}
|
||||
cat > .env <<EOF
|
||||
REGISTRY_HOST=${env.REGISTRY}
|
||||
IMAGE_TAG=${env.IMAGE_TAG}
|
||||
COMPOSE_PROJECT_NAME=${composeProjectName}
|
||||
TZ=Asia/Shanghai
|
||||
EOF
|
||||
'
|
||||
"""
|
||||
|
||||
// Release 环境额外同步 ZLM 配置文件
|
||||
if (env.BRANCH_NAME == 'release/next') {
|
||||
@@ -765,15 +779,15 @@ def getPreviousImageTag() {
|
||||
cd ${env.DEPLOY_PATH}
|
||||
docker compose -f ${env.COMPOSE_FILE} images --format json | \
|
||||
jq -r ".[0].Tag" | head -1
|
||||
' 2>/dev/null || echo "latest"
|
||||
' 2>/dev/null || true
|
||||
""",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
|
||||
return previousTag ?: 'latest'
|
||||
return previousTag ?: ''
|
||||
} catch (Exception e) {
|
||||
echo "⚠️ Failed to get previous image tag: ${e.message}"
|
||||
return 'latest'
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
@@ -810,6 +824,11 @@ def backupCurrentDeployment(def services) {
|
||||
|
||||
// 【优化7】回滚部署
|
||||
def rollbackDeployment(def services) {
|
||||
if (!env.PREVIOUS_IMAGE_TAG?.trim()) {
|
||||
echo "No previous image tag available, skipping automatic rollback."
|
||||
return
|
||||
}
|
||||
|
||||
echo """
|
||||
==========================================
|
||||
🔄 INITIATING ROLLBACK
|
||||
@@ -820,6 +839,7 @@ def rollbackDeployment(def services) {
|
||||
"""
|
||||
|
||||
def sshOpts = "-o StrictHostKeyChecking=no -o ConnectTimeout=10 -i ${env.SSH_KEY}"
|
||||
def composeProjectName = env.BRANCH_NAME == 'release/next' ? 'aiot-platform-release' : 'aiot-platform'
|
||||
|
||||
try {
|
||||
services.each { service ->
|
||||
@@ -830,7 +850,14 @@ def rollbackDeployment(def services) {
|
||||
cd ${env.DEPLOY_PATH}
|
||||
|
||||
# 设置回滚镜像标签
|
||||
export REGISTRY_HOST=${env.REGISTRY}
|
||||
export IMAGE_TAG=${env.PREVIOUS_IMAGE_TAG}
|
||||
cat > .env <<EOF
|
||||
REGISTRY_HOST=${env.REGISTRY}
|
||||
IMAGE_TAG=${env.PREVIOUS_IMAGE_TAG}
|
||||
COMPOSE_PROJECT_NAME=${composeProjectName}
|
||||
TZ=Asia/Shanghai
|
||||
EOF
|
||||
|
||||
# 拉取旧版本镜像
|
||||
docker compose -f ${env.COMPOSE_FILE} pull ${service}
|
||||
|
||||
@@ -59,7 +59,7 @@ x-common-env: &common-env
|
||||
|
||||
services:
|
||||
viewsh-gateway:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-gateway:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-gateway:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-gateway-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -82,7 +82,7 @@ services:
|
||||
start_period: 120s
|
||||
|
||||
viewsh-module-system-server:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-system-server:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-system-server:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-system-server-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -117,7 +117,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
viewsh-module-infra-server:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-infra-server:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-infra-server:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-infra-server-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -140,7 +140,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
viewsh-module-iot-server:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-server:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-iot-server:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-iot-server-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -182,7 +182,7 @@ services:
|
||||
condition: service_healthy
|
||||
|
||||
viewsh-module-iot-gateway:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-iot-gateway:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-iot-gateway:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-iot-gateway-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -216,7 +216,7 @@ services:
|
||||
- viewsh-module-iot-server
|
||||
|
||||
viewsh-module-ops-server:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-ops-server:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-ops-server:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-ops-server-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
@@ -263,7 +263,7 @@ services:
|
||||
|
||||
# ===== Video 视频模块(连接本地 ZLM) =====
|
||||
viewsh-module-video-server:
|
||||
image: ${REGISTRY_HOST:-172.17.16.7:5000}/viewsh-module-video-server:${IMAGE_TAG:-latest}
|
||||
image: ${REGISTRY_HOST:?REGISTRY_HOST is required}/viewsh-module-video-server:${IMAGE_TAG:?IMAGE_TAG is required}
|
||||
container_name: aiot-video-server-release
|
||||
restart: on-failure:5
|
||||
ports:
|
||||
|
||||
Reference in New Issue
Block a user