From 395f72e8cbcf0907fb11bc0c44cf8c726aaece8b Mon Sep 17 00:00:00 2001 From: hy Date: Wed, 22 Apr 2026 21:58:07 +0800 Subject: [PATCH] fix: retry java cache corruption with clean build --- monitor/service_release.py | 54 +++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/monitor/service_release.py b/monitor/service_release.py index 6402387..08f3aef 100644 --- a/monitor/service_release.py +++ b/monitor/service_release.py @@ -572,7 +572,7 @@ def maven_module_list(service_names: list[str]) -> str: return ",".join(modules) -def java_maven_package_command(service_names: list[str]) -> list[str]: +def java_maven_package_command(service_names: list[str], *, clean: bool = False) -> list[str]: # Java 默认走增量 package,并允许通过 .env 配 Maven 并行线程。 command = ["mvn"] maven_threads = str(JAVA_MAVEN_THREADS or "").strip() @@ -584,12 +584,28 @@ def java_maven_package_command(service_names: list[str]) -> list[str]: maven_module_list(service_names), "-am", "-Dmaven.test.skip=true", - "package", ] ) + if clean: + command.append("clean") + command.append("package") return command +def should_retry_java_maven_with_clean(error_text: str) -> bool: + # 固定工作区第一次启用时,历史 target 产物偶尔会有损坏;命中后退回一次 clean package 自愈。 + normalized = str(error_text or "") + markers = ( + "java.util.zip.ZipException", + "java.io.EOFException", + "bad class file", + "invalid loc", + "invalid block type", + "Unexpected end of ZLIB input stream", + ) + return any(marker in normalized for marker in markers) + + def build_single_java_image( service_name: str, *, @@ -673,14 +689,32 @@ def build_java_images( progress=progress, ) emit_progress(progress, "build.java.maven", f"开始 Maven 打包:{maven_module_list(service_names)}") - run_logged_command( - java_maven_package_command(service_names), - cwd=worktree_root, - label="java maven package", - timeout_seconds=SERVICE_BUILD_TIMEOUT_SECONDS, - progress_stage="build.java.maven.package", - progress=progress, - ) + try: + run_logged_command( + java_maven_package_command(service_names), + cwd=worktree_root, + label="java maven package", + timeout_seconds=SERVICE_BUILD_TIMEOUT_SECONDS, + progress_stage="build.java.maven.package", + progress=progress, + ) + except Exception as exc: # noqa: BLE001 + if not should_retry_java_maven_with_clean(str(exc)): + raise + emit_progress( + progress, + "build.java.maven", + "检测到缓存产物损坏,退回一次 clean package 自愈", + level="warning", + ) + run_logged_command( + java_maven_package_command(service_names, clean=True), + cwd=worktree_root, + label="java maven clean package", + timeout_seconds=SERVICE_BUILD_TIMEOUT_SECONDS, + progress_stage="build.java.maven.clean-package", + progress=progress, + ) else: emit_progress(progress, "build.java.maven", "跳过 Maven,直接复用已有 Jar")