From eb8bc70ff5bcc7b06844f492afb5c97aae5bea98 Mon Sep 17 00:00:00 2001 From: XuqmGroup Date: Wed, 27 May 2026 19:25:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(deploy):=20=E4=BC=98=E5=8C=96=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=AE=A1=E7=90=86=E5=92=8C=E5=A4=9A=E7=A7=9F=E6=88=B7?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修改 readCurrentVersion 方法优先读取镜像内的 /app/VERSION 文件 - 添加对宿主机挂载目录 VERSION 文件的兼容性支持 - 移除 bumpVersionFile 方法,不再在更新后写入版本号 - 重构多租户合并逻辑,优化数据库查询和更新操作 - 简化孤儿数据修复逻辑,直接更新为保留租户ID - 在 Dockerfile 中复制 VERSION 文件到镜像内部 - 在 Jenkinsfile 中添加自动递增构建号功能 --- Dockerfile | 1 + Jenkinsfile | 14 ++++ .../tenant/service/SystemUpdateService.java | 75 ++++++++----------- 3 files changed, 45 insertions(+), 45 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96038c3..c62e0ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -46,5 +46,6 @@ ARG SERVICE_MODULE RUN apk add --no-cache curl docker-cli docker-compose COPY --from=build /workspace/${SERVICE_MODULE}/target/${SERVICE_MODULE}-0.1.0-SNAPSHOT.jar /app/app.jar +COPY VERSION /app/VERSION ENTRYPOINT ["java", "-jar", "/app/app.jar"] diff --git a/Jenkinsfile b/Jenkinsfile index 2c4b75b..76ccde1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,6 +39,20 @@ pipeline { steps { withCredentials([string(credentialsId: 'ACR_PASSWORD', variable: 'ACR_PASS')]) { script { + // 自动递增 VERSION 文件中的构建号 + def versionFile = 'VERSION' + if (fileExists(versionFile)) { + def version = readFile(versionFile).trim() + // 格式: 2026.05.20-private.3 → 递增末尾数字 + def matcher = version =~ /^(.+\.)(\d+)$/ + if (matcher.matches()) { + def prefix = matcher.group(1) + def buildNum = matcher.group(2).toInteger() + 1 + def newVersion = "${prefix}${buildNum}" + writeFile file: versionFile, text: newVersion + echo "VERSION: ${version} → ${newVersion}" + } + } def imageName = "${ACR_REGISTRY}/${ACR_NAMESPACE}/${params.SERVICE}:${params.IMAGE_TAG}" bat """ docker login ${ACR_REGISTRY} -u ${ACR_USERNAME} -p %ACR_PASS% diff --git a/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java b/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java index c145f3d..f653465 100644 --- a/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java +++ b/tenant-service/src/main/java/com/xuqm/tenant/service/SystemUpdateService.java @@ -126,32 +126,25 @@ public class SystemUpdateService { } } - /** 读取部署目录的 VERSION 文件,返回当前版本号,文件不存在时返回 "unknown"。 */ + /** 读取镜像内打包的 VERSION 文件,返回当前版本号,文件不存在时返回 "unknown"。 */ public String readCurrentVersion() { - Path versionFile = Paths.get(deployRoot, "VERSION"); + // 优先读镜像内 /app/VERSION + Path containerVersion = Paths.get("/app/VERSION"); try { - if (Files.exists(versionFile)) { - return Files.readString(versionFile).trim(); + if (Files.exists(containerVersion)) { + return Files.readString(containerVersion).trim(); + } + } catch (IOException ignored) {} + // 兼容旧路径:宿主机挂载目录 + Path hostVersion = Paths.get(deployRoot, "VERSION"); + try { + if (Files.exists(hostVersion)) { + return Files.readString(hostVersion).trim(); } } catch (IOException ignored) {} return "unknown"; } - /** 更新完成后写入新版本号到 VERSION 文件。 */ - private void bumpVersionFile(Consumer emit) { - String oldVersion = readCurrentVersion(); - String newVersion = java.time.LocalDate.now().toString(); // yyyy-MM-dd - try { - Path versionFile = Paths.get(deployRoot, "VERSION"); - Files.createDirectories(versionFile.getParent()); - Files.writeString(versionFile, newVersion, - StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING); - emit.accept(">>> 版本号: " + oldVersion + " → " + newVersion); - } catch (IOException e) { - emit.accept(" [警告] 写入 VERSION 文件失败: " + e.getMessage()); - } - } - /** 拉取最新镜像并重建所有容器。 */ public void runUpdate(Consumer emit) { String composeFile = deployRoot + "/docker-compose.yml"; @@ -169,8 +162,6 @@ public class SystemUpdateService { exec(emit, "docker", "compose", "-f", composeFile, "pull", "--quiet", "tenant-service"); emit.accept(">>> 镜像拉取完成"); - bumpVersionFile(emit); - restartAndSelfUpdate(emit, composeFile); } @@ -563,46 +554,40 @@ public class SystemUpdateService { boolean changed = false; // 2. 多租户合并:删除多余租户 - List extraTenants = new java.util.ArrayList<>(); - try (PreparedStatement ps = conn.prepareStatement("SELECT id FROM t_tenant WHERE id != ?"); - ResultSet rs = ps.executeQuery()) { + int extraCount; + try (PreparedStatement ps = conn.prepareStatement( + "SELECT COUNT(*) FROM t_tenant WHERE id != ?")) { ps.setString(1, keepId); - while (rs.next()) { - extraTenants.add(rs.getString("id")); + try (ResultSet rs = ps.executeQuery()) { + rs.next(); + extraCount = rs.getInt(1); } } - if (!extraTenants.isEmpty()) { - emit.accept(" [合并] 保留最早租户 " + keepId + ",删除 " + extraTenants.size() + " 个多余租户"); - // 子账号 parent_id 指向保留的租户 - try (PreparedStatement ps = conn.prepareStatement( - "UPDATE t_tenant SET parent_id = ? WHERE parent_id IS NOT NULL AND parent_id != ?")) { - ps.setString(1, keepId); - ps.setString(2, keepId); - ps.executeUpdate(); + if (extraCount > 0) { + emit.accept(" [合并] 保留最早租户 " + keepId + ",删除 " + extraCount + " 个多余租户"); + try (Statement stmt = conn.createStatement()) { + stmt.executeUpdate("UPDATE t_tenant SET parent_id = '" + keepId + + "' WHERE parent_id IS NOT NULL AND parent_id != '" + keepId + "'"); } - // 删除多余租户 - try (PreparedStatement ps = conn.prepareStatement("DELETE FROM t_tenant WHERE id != ?")) { - ps.setString(1, keepId); - int deleted = ps.executeUpdate(); + try (Statement stmt = conn.createStatement()) { + int deleted = stmt.executeUpdate("DELETE FROM t_tenant WHERE id != '" + keepId + "'"); emit.accept(" 删除多余租户: " + deleted + " 个"); } changed = true; } - // 3. 修复孤儿数据:tenant_id 不在 t_tenant 中的记录 + // 3. 修复孤儿数据:tenant_id 与唯一租户不匹配的记录(包括指向不存在租户的情况) String[][] tables = { {"t_app", "tenant_id"}, {"t_operation_log", "tenant_id"}, {"t_migrate_key", "tenant_id"}, }; for (String[] tbl : tables) { - try (PreparedStatement ps = conn.prepareStatement( - "UPDATE " + tbl[0] + " SET " + tbl[1] + " = ?" - + " WHERE " + tbl[1] + " NOT IN (SELECT id FROM t_tenant)")) { - ps.setString(1, keepId); - int rows = ps.executeUpdate(); + try (Statement stmt = conn.createStatement()) { + int rows = stmt.executeUpdate("UPDATE " + tbl[0] + " SET " + tbl[1] + " = '" + + keepId + "' WHERE " + tbl[1] + " != '" + keepId + "'"); if (rows > 0) { - emit.accept(" " + tbl[0] + ": 修复 " + rows + " 条孤儿记录"); + emit.accept(" " + tbl[0] + ": 修复 " + rows + " 条记录"); changed = true; } }