Skip to content

fix(verification): API 重试、Runner JDK 17 与 JVM user.home 固定 - #135

Open
pwd11 wants to merge 3 commits into
tiammomo:mainfrom
pwd11:fix/verification-network-resilience
Open

fix(verification): API 重试、Runner JDK 17 与 JVM user.home 固定#135
pwd11 wants to merge 3 commits into
tiammomo:mainfrom
pwd11:fix/verification-network-resilience

Conversation

@pwd11

@pwd11 pwd11 commented Sep 6, 2026

Copy link
Copy Markdown

关联 Issue

Closes #134

问题与改动

受限网络环境(github.com:443 间歇断流、api.github.com 大响应被截断)下实测暴露验证链路三个可靠性问题,三个聚焦提交分别修复:

  1. GitHub API 无瞬时错误重试GitHubClient._request 单次请求,约 750KB 的 open pull requests 列表间歇性 IncompleteRead,gate/adopt 随机失败。改为 GET 最多 5 次尝试、平方退避(1/4/9/16s);POST/PATCH 非幂等不重试。重试成功后清除 last_error 避免误报。
  2. JVM user.home 解析为 "?":容器以 host uid 运行且镜像内无 passwd 条目时,JDK 将 user.home 解析为字面量 "?",Maven/JGit 缓存落到工作区内随沙箱销毁,bootstrap 下载的依赖在断网 verify 阶段全部失效。在容器环境注入 JAVA_TOOL_OPTIONS=-Duser.home=/reposteward-env/home(持久卷),覆盖所有 Java 进程。
  3. Runner 镜像缺少 JDK 17 且下载易失败:apt 安装 openjdk-17-jdk-headless 并链接为 /opt/java/temurin-17(默认 JDK 8 不变);Maven 发行版改 TUNA 镜像(SHA512 校验不变);所有 curl 加 --retry 5 --retry-all-errors

验证

$ uv run --python 3.12 python -m unittest discover -s tests
Ran 584 tests in 207.300s
OK

$ uvx ruff check .
All checks passed!

$ uvx ruff format --check .
135 files already formatted

$ uv build
Successfully built dist/reposteward-0.1.0.tar.gz / .whl

$ uv run reposteward image build   # 新镜像构建成功(Temurin 8 + apt JDK 17 + TUNA maven)

端到端证据(本机受限网络实测):使用新镜像对 spring-ai-alibaba/DataAgent 完成两次 adopt 全流程,bootstrap 联网下载 + 断网 verify(1712/1715 个 Java 测试、spotless、checkstyle)全部通过;此前相同流程因 user.home="?" 与 API 截断反复失败。新增回归测试:test_get_request_retries_transient_transport_errorstest_post_request_does_not_retry_transient_transport_errorstest_container_receives_shared_cache_and_read_only_git_mounts 中补充 JAVA_TOOL_OPTIONS 断言。

风险与兼容性

  • JAVA_TOOL_OPTIONS 会打印 "Picked up JAVA_TOOL_OPTIONS" 到 stderr(无害);对非 Java 仓库无影响
  • Runner 镜像默认 JDK 仍为 8,/opt/java/current 链接未变,既有仓库行为不变;镜像体积增加约 300MB
  • Dockerfile 下载源变化均保留 SHA 校验;POST/PATCH 不重试,公开写入路径语义不变

自动化辅助

使用 Claude Code 实现与验证;人工复核了完整 diff、三个提交边界、测试结果与镜像构建日志。

Checklist

  • PR 只解决一个已讨论的 Issue,没有捆绑无关改动。
  • 我已检查完整 diff,且没有凭据、账号缓存、数据库、运行日志或本机路径。
  • 我已运行相关测试、完整测试、lint、格式检查和构建,或准确说明未运行项。
  • 新行为有回归测试;无法自动测试时已说明原因。

受限网络下 api.github.com 大响应(如 open pull requests 列表)会被间歇性
截断,抛 http.client.IncompleteRead,导致 gate/adopt 在竞争工作检测处随机
失败。GET 请求幂等,改为最多 5 次尝试、平方退避;POST/PATCH 非幂等,保持
不重试。重试成功时清除 last_error 避免误报。
容器以 host uid 运行且镜像内无对应 passwd 条目时,部分 JDK 将 user.home
解析为 "?",Maven/JGit 等把缓存写到工作区内随沙箱销毁,bootstrap 联网
下载的依赖在断网 verify 阶段全部失效。注入 JAVA_TOOL_OPTIONS 将 user.home
固定到 /reposteward-env/home 持久卷,覆盖所有 Java 进程(含测试 fork)。
- 通过 apt 安装 openjdk-17-jdk-headless 并链接为 /opt/java/temurin-17,
  支持需要 Java 17 的仓库(如 Spring Boot 3);默认 JDK 仍为 8,不影响
  既有仓库
- Maven 发行版改用 TUNA 镜像(SHA512 校验保持不变)
- 所有 curl 增加 --retry 5 --retry-all-errors,避免受限网络下大文件下载
  中断导致整层构建失败
@pwd11
pwd11 requested a review from tiammomo as a code owner September 6, 2026 14:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix(verification): 增强受限网络下的验证链路可靠性(API 重试、Runner JDK 17 与 JVM user.home 固定)

1 participant