fix(ci): 禁止 release 部署回退 latest
Some checks failed
Java CI with Maven / build (11) (push) Has been cancelled
Java CI with Maven / build (17) (push) Has been cancelled
Java CI with Maven / build (8) (push) Has been cancelled

This commit is contained in:
lzh
2026-04-30 09:29:08 +08:00
parent 7c2effce37
commit ef3be3934a
2 changed files with 37 additions and 10 deletions

33
Jenkinsfile vendored
View File

@@ -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}

View File

@@ -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: