From 1f03c44a391f627f70dd3d1cbac9b5e79c5a295a Mon Sep 17 00:00:00 2001 From: lzh Date: Tue, 13 Jan 2026 22:04:33 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80=E7=9B=B4?= =?UTF-8?q?=E9=87=8D=E5=90=AF=E3=80=81=E6=9E=84=E5=BB=BAbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Jenkinsfile | 85 ++++++++++++++++++++++++++++++++--------- docker-compose.core.yml | 12 +++--- 2 files changed, 73 insertions(+), 24 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e74c1c9..ace8967 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -80,24 +80,33 @@ pipeline { steps { script { def services = env.SERVICES_TO_BUILD.split(',') as List - def batchSize = MAX_PARALLEL.toInteger() - - echo "🔨 Building ${services.size()} services with parallelism=${batchSize}" - - // 分批并行构建 - services.collate(batchSize).each { batch -> - echo "📦 Building batch: ${batch.join(', ')}" - - def parallelBuilds = [:] - batch.each { service -> - parallelBuilds[service] = { - buildAndPush(service) - } - } - - parallel parallelBuilds + + echo "🔨 Building ${services.size()} services" + + // 串行构建(避免并发问题) + services.each { service -> + def modulePath = getModulePath(service) + + echo "🔨 Building ${service}..." + + sh """ + docker build \ + -f docker/Dockerfile.service \ + --build-arg DEPS_IMAGE=${DEPS_IMAGE} \ + --build-arg MODULE_NAME=${modulePath} \ + --build-arg JAR_NAME=${service} \ + --build-arg SKIP_TESTS=true \ + -t ${REGISTRY}/${service}:${IMAGE_TAG} \ + -t ${REGISTRY}/${service}:latest \ + . + + docker push ${REGISTRY}/${service}:${IMAGE_TAG} + docker push ${REGISTRY}/${service}:latest + """ + + echo "✅ ${service} built and pushed" } - + // 清理 sh "docker image prune -f || true" } @@ -130,7 +139,47 @@ pipeline { // 串行部署(保证依赖关系) sortedServices.each { service -> - deployService(service) + echo "🚀 Deploying ${service}..." + + def containerName = getContainerName(service) + def sshKey = '/var/jenkins_home/.ssh/id_rsa' + def sshOpts = "-o StrictHostKeyChecking=no -o ConnectTimeout=10 -i ${sshKey}" + + sh """ + ssh ${sshOpts} root@${DEPLOY_HOST} ' + cd ${DEPLOY_PATH} + echo "Pulling ${service}..." + docker compose -f docker-compose.core.yml pull ${service} + + echo "Starting ${service}..." + docker compose -f docker-compose.core.yml up -d ${service} + + echo "Waiting for ${service} to be healthy..." + for i in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20; do + STATUS=\$(docker inspect --format="{{.State.Health.Status}}" ${containerName} 2>/dev/null || echo "starting") + + if [ "\$STATUS" = "healthy" ]; then + echo "✅ ${service} is healthy" + exit 0 + elif [ "\$STATUS" = "unhealthy" ]; then + echo "❌ ${service} is unhealthy" + echo "=== Last 100 lines of logs ===" + docker logs --tail 100 ${containerName} + exit 1 + fi + + echo "⏳ ${service} status: \$STATUS (\$((i*10))s/200s)" + sleep 10 + done + + echo "❌ ${service} health check timeout after 200s" + echo "=== Full logs ===" + docker logs ${containerName} + exit 1 + ' + """ + + echo "✅ ${service} deployed successfully" } echo "🚀 All services deployed successfully!" diff --git a/docker-compose.core.yml b/docker-compose.core.yml index c6f95f9..ea496a9 100644 --- a/docker-compose.core.yml +++ b/docker-compose.core.yml @@ -22,7 +22,7 @@ services: viewsh-gateway: image: ${REGISTRY_HOST}/viewsh-gateway:${IMAGE_TAG} container_name: aiot-gateway - restart: unless-stopped + restart: on-failure:5 network_mode: host # 使用宿主机网络,直接访问 1Panel 中间件 environment: JAVA_OPTS: "-Xms${GATEWAY_JVM_XMS} -Xmx${GATEWAY_JVM_XMX} ${JVM_COMMON_OPTS}" @@ -51,7 +51,7 @@ services: viewsh-module-system-server: image: ${REGISTRY_HOST}/viewsh-module-system-server:${IMAGE_TAG} container_name: aiot-system-server - restart: unless-stopped + restart: on-failure:5 network_mode: host environment: JAVA_OPTS: "-Xms${SYSTEM_JVM_XMS} -Xmx${SYSTEM_JVM_XMX} ${JVM_COMMON_OPTS}" @@ -88,7 +88,7 @@ services: viewsh-module-infra-server: image: ${REGISTRY_HOST}/viewsh-module-infra-server:${IMAGE_TAG} container_name: aiot-infra-server - restart: unless-stopped + restart: on-failure:5 network_mode: host environment: JAVA_OPTS: "-Xms${INFRA_JVM_XMS} -Xmx${INFRA_JVM_XMX} ${JVM_COMMON_OPTS}" @@ -128,7 +128,7 @@ services: viewsh-module-iot-server: image: ${REGISTRY_HOST}/viewsh-module-iot-server:${IMAGE_TAG} container_name: aiot-iot-server - restart: unless-stopped + restart: on-failure:5 network_mode: host environment: JAVA_OPTS: "-Xms${IOT_SERVER_JVM_XMS} -Xmx${IOT_SERVER_JVM_XMX} ${JVM_COMMON_OPTS}" @@ -166,7 +166,7 @@ services: viewsh-module-iot-gateway: image: ${REGISTRY_HOST}/viewsh-module-iot-gateway:${IMAGE_TAG} container_name: aiot-iot-gateway - restart: unless-stopped + restart: on-failure:5 network_mode: host environment: JAVA_OPTS: "-Xms${IOT_GATEWAY_JVM_XMS} -Xmx${IOT_GATEWAY_JVM_XMX} ${JVM_COMMON_OPTS}" @@ -248,7 +248,7 @@ services: viewsh-module-ops-server: image: ${REGISTRY_HOST}/viewsh-module-ops-server:${IMAGE_TAG} container_name: aiot-ops-server - restart: unless-stopped + restart: on-failure:5 network_mode: host environment: JAVA_OPTS: "-Xms${OPS_JVM_XMS} -Xmx${OPS_JVM_XMX} ${JVM_COMMON_OPTS}"