logo
0
0
WeChat Login

PR #7:CNB services image 陷阱根治——coverage 收敛 unit-only + -D 覆盖阈值#7

Merged
created 2 weeks ago
main
feature/cnb-services-image-trap
Edit
OverviewCommits
1
Files changed
3
Attachments

动机(Why)

PR #6 远端 biz-backend-coverage 跑了 91.7s 后 fail。截图深度解读发现之前未知的 CNB 平台行为

services: [docker] 会强制忽略 image: 字段,改用 cnbcool/default-build-env 默认镜像

这是 CNB 平台行为,grammar.html 未说明。PR #6 的诊断截图关键行:

CNB_PIPELINE_DOCKER_IMAGE=cnbcool/default-build-env   ← 即使 .cnb.yml 写 image: maven:*
安装 docker CLI (静态二进制)...
docker 已安装: /usr/local/bin/docker                   ← install_docker_cli 成功
[WARN] Docker 不可用——降级到 unit-only 覆盖率度量       ← CLI 装了但 docker info 失败
ArticleServiceImpl -- 创建 Article 成功                ← mvn verify 实际跑了
[ERROR] jacoco:0.8.14:check Coverage checks not met    ← pom 阈值 0.78 不通过
[FAIL] mvn verify 失败(unit-only 降级模式)

3 重错位

  1. services:[docker] 导致 CNB 强制 default-build-env(非 maven image)
  2. install_docker_cli 装上 CLI 但 docker info 仍失败——sidecar daemon 可能未启动或端点未知
  3. 降级路径 shell 变量 LINE_MIN=36 未传递到 mvn verify;后者读 pom 的 <jacoco.line.min>0.78 必然失败

变更清单(What)

单 commit 16d176c:3 文件 / +108/-249(重大简化)

改动 1:.cnb.yml coverage stage 去 services:[docker](push + MR 2 处)

  - name: biz-backend-coverage
    image: maven:3.9-eclipse-temurin-17
-   services:
-     - docker
    script:
      - sh scripts/ci/backend/check-backend-coverage.sh

让 maven image 真正生效(显式、干净)。biz-backend-functional stage 保留 services:[docker] 继续尝试 docker。

改动 2:check-backend-coverage.sh 大幅简化(170 → 70 行)

  • 去除 install_docker_cli / DOCKER_HOST 探测 / 双路径逻辑
  • 去除降级分支(因为不再声明 services,Docker 永远不可用,直接 unit-only)
  • 关键修复:用 -D 覆盖 pom 阈值
    mvn -B -Dtest='com.example.demo.unit.**' \
        -Djacoco.line.min=0.36 \
        -Djacoco.branch.min=0.46 \
        verify
    

改动 3:CHECKPOINT §四 轮次 3.3 档案

  • 3 重错位完整分析
  • services:[docker] 的真实行为实证记录(反馈到源仓库的 T-Q2-e 候选)
  • 棘轮口径区分版的具体落地表
  • 4 条本轮学到的东西

验证证据(How verified)

本地 15/15 CI stages 全绿 + 0 lint + yml 对称 79/79 行

coverage.sh 本地实测

==> P1 后端覆盖率棘轮 (JaCoCo, unit-only; 阈值 0.36/0.46)
    行覆盖(unit-only): 79%  保底: 36%
    分支覆盖(unit-only): 71%  保底: 46%
[OK] 后端 unit-only 覆盖率棘轮达标

(本地残留之前 unit+functional 合并 CSV 所以显示 79%;远端从零跑会是 ~36% 真值,仍通过)

影响面(Impact)

棘轮"口径区分版"的具体落地

stage度量口径阈值覆盖方式
biz-backend-coverageunit-onlyLINE 36 / BRANCH 46mvn -D 命令行覆盖 pom
biz-backend-functionalunit + functional不直接管阈值
pom.xml(本地 mvn verifyfullLINE 78 / BRANCH 70默认值保留

两个口径各自棘轮,互不干扰。meta-principles §原则 3 "棘轮只上不下"的**"同一口径"**约束在此首次规则化。

预期远端行为

指标PR #6PR #7 预期
biz-backend-coverage 远端耗时91.7s (fail)~40s (success)
pipeline 整体errorsuccess(至 functional 之前)
frontend stagesskipped(连锁)真跑
functional stageskipped仍可能 skip(Docker 未解决)

连续 4 PR(#4~#7)的工程演化

PR行动结果获得的认知
#4按 grammar.html 推断修语法fail推断不可信
#5策略转变——加诊断块观察CLI 不存在 / DOCKER_HOST unset
#6基于诊断装 CLI进步但 failimage 被强制改 + daemon 仍连不上
#7接受平台限制,收敛到可跑子集本 PRCNB services 陷阱首次被实证解读

每一步都是对平台行为的新认知。没有捷径跳过"盲猜 → 实证"的过程——这是 B14 候选反模式(未经实证推断平台行为)的正面闭环实证。

关闭待办(预期,待 PR #7 验证)

  • ✅ T-Q2-h:coverage 真实跑通(降级到 unit-only 口径)

仍悬而未决

  • T-Q2-a:功能测试远端跑通——等 Docker 配置方案后续解决(可能需要自定义镜像)
  • T-Q2-e:回写源仓库本轮 B13/B14/棘轮口径 + CNB services 陷阱 4 条经验

本 PR 不动的事

  • biz-backend-functional stage 保持 PR #6 状态(install_docker_cli 逻辑),本 PR 不纠结它——等 coverage 跑通后独立迭代
  • 不尝试预装 docker-ce-cli 到 maven image(太重,留给后续自定义镜像方案)

Refs

  • 父事件:PR #6 远端构建 cnb-m1g-1jnn5kaqu coverage stage 91.7s fail + 截图诊断
  • 关联:
    • CHECKPOINT §四 轮次 3.3 完整档案
    • meta-principles §原则 2(收敛到可执行子集)
    • meta-principles §原则 3(棘轮口径区分版——Maven -D 的首次规则化应用)
    • LESSONS B14 候选 的正面闭环(4 PR 递进)
  • 下游:T-Q2-e(回写源仓库 CNB 平台 4 条经验)
is using the merge method to merge into6e3c2f9f
合并来自 feature/cnb-services-image-trap 的合并请求 #7

Successfully merged and closed

branch can be safely deleted
Reviewer
None yet
Assignee
None yet
Label
None yet
Participant