8571581a(base,对应 v1.0.8) → a5b0c71a(head,v1.0.9)| 文件 | 变更类型 | 摘要 |
|---|---|---|
.dockerignore | 新增 | 排除 .git/.gitea/.trae/.github/bin/coverage.out,保留仓库根 dispatcher |
Dockerfile | 重写 | 多阶段(golang builder + alpine)→ 单阶段 debian:trixie-slim 只打包宿主编译产物 |
.gitea/workflows/build.yml | 重写 | 拆分为 build-push + deploy;质量门 → 宿主 go build → buildx 打包 → push 重试 → 1Panel 升级 + 轮询校验 |
.gitea/workflows/codescan-tag.yaml | 新增 | 打 v* tag 时取「当前 tag + 前一 tag」→ commit range → 调 Hub 增量分析接口 |
主线意图:对齐「持续集成.md §2.1」——宿主编译、镜像只打包,并补齐质量门(vet+test)、push 重试、部署后置校验、CodeScan 自动增量触发。
数据来源:
codescan.issues_diff(base=8571581a, head=a5b0c71a)
原因说明(非漏扫):本次 diff 仅涉及 .dockerignore、Dockerfile、两个 workflow YAML,不含任何 .go 文件。当前版本存量问题(107 条,集中在 internal/scheduler、internal/dynamicparams、internal/monitor、internal/contractcheck、cmd/dispatcher/main.go 等)在 base/head 两版完全一致,属历史存量技术债,与本次发布无关。
因此本节无可报告的「修复 bug / 新增问题」;下述风险来自对变更文件的人工审查(YAML/Shell/Dockerfile 不在通用代码扫描器覆盖范围内)。
Dockerfile(重写)— 中风险新镜像:debian:trixie-slim + tzdata ca-certificates wget,非 root(uid/gid 1001),COPY dispatcher /app/dispatcher。
| 级别 | 发现 | 说明 / 建议 |
|---|---|---|
| Medium | 构建输入强耦合「仓库根已存在 dispatcher 二进制」 | Dockerfile 直接 COPY dispatcher,本地/任何跳过 CI 宿主 go build 的场景下 docker build 会直接失败。建议:在 README/Build 说明中显式声明该前置步骤,或在 CI 中固定产物路径并加存在性断言。 |
| Low | dispatcher 产物可能被误提交 | 该二进制生成在仓库根、且被 .dockerignore 有意识保留(Dockerfile 依赖它)。若未加入 .gitignore,存在被 git add 误提交的风险。建议确认 .gitignore 已排除 /dispatcher。 |
| Low | 基础镜像从 alpine 切到 debian:trixie-slim 显著增大体积 | 注释以“glibc 兼容 + wget 健康检查依赖”为理由,属有意取舍;但需确认 1Panel 健康检查确实调用 wget,否则可进一步精简。 |
.gitea/workflows/build.yml(重写)— 中/高风险单 job 串行:quality gate(vet+test) → 宿主 go build -ldflags 注入版本 → buildx 构建 → push 重试 3 次 → deploy 轮询校验。
| 级别 | 发现 | 说明 / 建议 |
|---|---|---|
| High | buildx 缓存导出 与 docker tag/push 的 driver 不一致风险 | 命令使用 --cache-from/--cache-to type=local(docker 默认 driver 不支持 cache 导出,需 docker-container 驱动 builder);但随后用 docker tag/docker push 操作本地镜像——docker-container 驱动构建的镜像不会自动加载进 docker daemon,除非追加 --load。二者组合下存在“要么 cache 导出报错、要么 tag 找不到镜像”的矛盾。建议:明确 runner 的 builder 类型,并在 buildx build 上补 --load(或改用 --push 直接推送)。 |
| Medium | push 重试的原子性 | docker push tag && docker push latest 作为整体重试:若 :tag 成功、:latest 失败,会重复推送 :tag。行为正确但非最优;可记录/容忍。逻辑本身无致命缺陷(RC 初值 1、成功置 0、三次失败最终 exit 1,判定链完整)。 |
| Low |
.gitea/workflows/codescan-tag.yaml(新增)— 中风险| 级别 | 发现 | 说明 / 建议 |
|---|---|---|
| Medium | 「前一 tag」推断逻辑脆弱 | git tag --sort=-creatordate | grep -A1 "$CURRENT_TAG" | tail -1:① grep 把 tag 当正则,v1.0.9 中的 . 可匹配任意字符;② 若 CURRENT_TAG 为最旧 tag,grep -A1 只返回自身,previous==current → base_sha==head_sha → 增量区间为空;③ 按 creatordate 排序得到的“相邻 tag”不一定是“上一版本”。建议:改用 git describe --tags --abbrev=0 "${CURRENT_TAG}^",或 grep -F 固定字符串匹配 + 校验 previous != current。 |
| Medium | Context 混用 + GITHUB_REF 依赖 | 同时使用 GITHUB_REF 环境变量、$GITHUB_OUTPUT、github.repository/server_url 与 gitea.actor context。Gitea Actions 对各版本兼容性不一,GITHUB_REF 未必存在;建议统一为 gitea.ref_name 或在脚本内做兜底(),并统一 / 用法。 |
.dockerignore(新增)— 低风险.git/.gitea/.trae/.github/bin/coverage.out 合理,缩小构建上下文。dispatcher 不能排除(是 Dockerfile COPY 的源),与 3.1 的耦合一致——该约束需在团队内保持,一旦有人“顺手”把 dispatcher 加进 ignore,镜像将构建失败。internal/scheduler/scheduler.go 的 runBindingJob/shouldGenerateTask 高耦合与超长函数、internal/config/config_manager.go:RefreshFromDB)。buildx builder 类型,修正 --cache-to type=local 与 docker tag/push 的兼容(补 --load 或改 --push)。这是唯一可能导致流水线直接跑不通的点。codescan-tag.yaml 的“前一 tag”推断(改用 git describe --tags --abbrev=0 <tag>^),避免增量基线取错或为空。GITHUB_REF → gitea.ref_name)。/dispatcher 进 .gitignore;在文档中固化「先宿主编译再 docker build」的构建前置。Dockerfile 已不含编译步骤,镜像内容完全由 CI 宿主 go build 决定,版本注入从 build-arg 迁移到 -ldflags——功能等价,但任何绕过 build.yml 的构建都会丢失版本号,需在发布规范中写明。set +e + set -o pipefail + ${PIPESTATUS[0]} 组合依赖 PIPESTATUS 捕获 docker build 退出码,写法可取;但依赖 bash(已显式 shell: bash),需确保 runner 默认 shell 为 bash,否则 PIPESTATUS 语义不同。 |
| Low | actions/cache 缓存 BuildKit 层用 continue-on-error | 缓存失败不阻断发布,属合理兜底。 |
${GITHUB_REF:-${GITEA_REF}}github.*gitea.*| Low | 触发条件无「前一 tag 为空则跳过」之外的保护 | 步骤已用 if: steps.tags.outputs.previous != '' 做门控,但未校验 base/head sha 非空,若 rev-list 失败会推送空 sha。建议增加非空断言。 |
| Low | 外部地址硬编码 + 依赖 Secret | https://cxy-webhook.1v5.com/api/v1/trigger/incremental 硬编码,且需 CODESCAN_TOKEN。建议抽为变量便于环境切换。 |