fix: retry java cache corruption with clean build

This commit is contained in:
hy 2026-04-22 21:58:07 +08:00
parent 29b136c734
commit 395f72e8cb

View File

@ -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")