suretool

CI 工作流与本地发布脚本的职责边界(P2-3)

目标:明确”本地 scripts/ 脚本”与”GitHub Actions”各自的职责,防止同一件事有两套做法造成漂移。 规则:凡是 Actions 已覆盖的检查,本地不再重复实现;凡是本地才有的凭据操作,Actions 不再手工模拟。

1. 总览

入口 触发 职责 产物/结果
ci.yml push/PR 到 main 三平台(ubuntu/macOS/Windows)质量门禁:编译 + 全量测试 + Checkstyle + JaCoCo 覆盖率(≥0.90) 门禁通过/失败
codeql.yml push/PR/定时 GitHub CodeQL 静态安全扫描(Java) SARIF 安全告警
osv-scanner.yml push/定时 第三方依赖漏洞扫描(OSV) 漏洞告警
benchmark.yml push/PR(核心模块变更)/定时 性能基准门禁:JMH 跑 sure vs hutool 关键项,比率 >1.5 报警 基准回归报告
pages.yml push main 构建文档站:javadoc(api/)+ 覆盖率徽章 + 文档页 GitHub Pages 站点
release.yml 推送 v* 标签 / 手动 发布到 Maven Central:全量门禁 → 构建(含源码/javadoc/SBOM)→ GPG 签名 → Central Portal 上传 → 轮询 repo1 → 创建 GitHub Release Central 制品 + Release
scripts/release.ps1 本地手动(Windows) 备选发布通道:本地 GPG 签名 + 本地 ~/.m2/settings.xml 凭据 → deploy 到 OSSRH Central 制品

2. 职责边界(防漂移规则)

质量检查(唯一入口 = Actions)

发布(双通道,语义互补)

文档站(唯一入口 = Actions)

3. 变更纪律

4. 排障速查

现象 排查入口
CI 失败 Actions 对应 workflow 日志;本地 mvn -pl <模块> verify 复现
覆盖率门禁失败 本地 jacoco 报告 target/site/jacoco/,补测试后重跑
发布失败(Actions) Secrets 是否配置齐全;GPG key 是否与本地一致;版本号是否已发布过
发布失败(本地) ~/.m2/settings.xml 凭据与 GPG 配置;scripts/release.ps1 -DryRun 演练
文档站不更新 pages.yml 是否成功;pages 分支/目录设置是否正确

5. benchmark 门禁经验(2026-09 沉淀)

5.1 门禁结构与判定

benchmark.yml(job: benchmark-gate)按以下顺序执行:

  1. Build benchmark jar:mvn -pl sure-benchmark -am package,显式选取 shade fat jar(排除 original-* 残留,避免通配符多匹配导致 java -jar 选错)。
  2. Run JMH benchmarks (attempt 1):java -jar "$JAR" 输出到 /tmp/bench.log。
  3. Check regression thresholds (attempt 1):benchmark_gate.py /tmp/bench.log 解析 sure/hutool 配对,ratio = sure/hutool > 1.5 判 FAIL;日志含 JMH <failure 标记时立即 FAIL(诚实门禁,防静默漏判)。
  4. Confirm regression (attempt 2, on noise):首次 FAIL 时自动重跑一次再判,第二次仍 FAIL 才判定回归(job 失败)。此机制用于消除共享 runner 时序噪声误报。

5.2 已知误报场景与根因(重要)

5.3 本地复现命令

# 本机若默认 JDK 不是 21,先切到 JDK 25(否则报 UnsupportedClassVersionError)
export JAVA_HOME=<jdk25 路径>; export PATH=$JAVA_HOME/bin:$PATH
mvn -B -pl sure-benchmark -am package -DskipTests
java -jar sure-benchmark/target/sure-benchmark-<version>-jar-with-dependencies.jar   # 全量
java -jar sure-benchmark/target/sure-benchmark-<version>-jar-with-dependencies.jar ".*DateUtilBenchmark.*"  # 单类
python3 .github/scripts/benchmark_gate.py /tmp/bench.log   # 本地跑 gate

5.4 触发规则

5.5 pages.yml 文档站构建的两个坑(2026-09-26 修复实录)