通用 CI/CD 文档体系与工程报告规范指南 (Universal Specification)
本文档定义了一套适用于绝大多数软件工程(包括通用后台、SDK 基础库、CLI 工具以及移动/桌面端 App 项目)的通用文档与 CI/CD 报告管理规范。 其核心目标在于解决:技术变更与用户语言混杂、版本日志管理混乱、CI 自动化执行缺乏可见性、以及文档侵入生产二进制分发包等典型工程痛点。
一、 核心文档定义与分层职责矩阵 (Core Documentation Architecture)
任何具备可持续交付能力的工程,其文档体系应遵循“按目标受众与消费场景分层”的设计哲学,将内部开发归档、技术总结、自动化脚本入口与终端用户/应用商店发布说明彻底解耦:
| 文件 / 目录 | 核心定位 | 目标受众 | 格式与内容规范 |
|---|---|---|---|
changes/ | 历史版本完整技术变更档案 | 核心开发者、代码审查人、架构师 | - 采用目录化管理历史版本文件(如 changes/v1.2.md)。- 版本文件命名:仅保留前两位主次版本号( v<Major>.<Minor>.md);- 文件内部结构:构建号/修订号(如日期+流水号、语义化 Patch)统一在文件内的二级标题( ## Build <YYYYMMDD.N> 或 ## v1.2.1)中增量追加记录。- 内部包含 ### Added, ### Changed, ### Fixed, ### Refactored, ### Security 等标准变更类型。 |
Release.md | 最新版本技术变更镜像 | CI 自动化脚本、发布引擎、工程团队 | - 权威镜像:内容与 changes/ 目录中最新版本文件保持 1:1 完全一致。- 存在动机:作为 CI/CD 流水线与脚本提取当前版本技术改动的固定入口,彻底免除动态扫描与正则探测历史目录的脆弱性。 |
changeLog.md | 全生命周期版本索引与摘要 | 依赖接入方、技术经理、开源社区 | - 全生命周期版本演进的索引总览(Executive Summary)。 - 按里程碑版本倒序汇总核心功能高光,并使用相对路径链接指向 changes/ 目录下的具体版本档案。 |
ReleaseNote.md | 用户友好化发布说明 (User-Facing) | 终端用户、产品运营、客户支持 | - 语言风格:彻底剥离底层代码重构、管道细节与私有技术名词,采用亲和、易懂的自然语言。 - 内容聚焦:新增了哪些实用功能、解决了哪些困扰用户的体验痛点、带来了哪些性能或交互提升。 |
index.md | 技术文档全景总索引与导航树 | 全体工程人员、新加入成员 | - 工程文档中心(Docs Site)的根索引页,聚合架构设计、API 参考、部署运维、测试规范与核心版本文档的完整导航树。 |
二、 版本标识生成与编码规范 (Versioning Specification)
工程版本号不仅是对外发布的商业标识,更是 CI/CD 自动化流水线追踪构件产物、环境部署与代码 Commit 的核心锚点。
1. 核心版本公式与字段定义
通用工程遵循 “手动规划主次版本 + 自动化年月日流水构建号” 的四段式定义:
$$\text{Version} = \underbrace{\text{MAJOR} ,., \text{MINOR}}{\text{规划版本 (手动维护)}} ,., \underbrace{\text{YYMM}}{\text{年月段 (CI 自动)}} ,., \underbrace{(10 + \text{DD})\text{RRR}}_{\text{日流水段 (CI 自动)}}$$
| 字段 | 含义 | 生成方式 | 示例值 | 规范与取值范围 |
|---|---|---|---|---|
MAJOR | 主版本号 | 手动维护(配置文件) | 3 | 重大架构重构、不兼容的破坏性更新 (Breaking Changes) 时递增。 |
MINOR | 次版本号 | 手动维护(配置文件) | 6 | 周期性功能迭代、向下兼容的新特性发布时递增。 |
YYMM | 构建年月 | CI 流水线自动计算 | 2610 | 2 位年份 + 2 位月份(如 2026 年 10 月 $\to 2610$,1 月 $\to 2601$)。 |
(10+DD)RRR | 日期与当日流水 | CI 流水线自动计算 | 14002 | 高位偏移编码:前 2 位为 $(10 + \text{DD})$,后 3 位为当日流水序号 $\text{RRR}$。 |
2. 深度剖析:为什么必须使用 (10+DD)RRR 偏移编码?
在自动化版本号设计中,工程团队常常面临两个极其严重的陷阱:
陷阱 A:数字前导零丢失与非法 SemVer 报错
- 规范约束:在 SemVer 2.0.0 规范第 2 条 中明文规定:“数值标识符不能包含前导零 (Numeric identifiers MUST NOT include leading zeroes)”;
- 隐式类型转换:在很多编程语言、数据库和 CI 环境变量中,若版本段被解析为整型,前导零会被自动截断(如把
01转为1,把01001转为1001)。
陷阱 B:“111” 二义性歧义崩溃
若采用朴素的动态位数拼接:
- 1 月第 11 次构建:若月份写作
1、流水写作11$\to$ 拼出111; - 11 月第 1 次构建:若月份写作
11、流水写作1$\to$ 同样拼出111! - 若在日流水段拼接:1 日第 1 次构建若剥离前导零后为
11或101,与 10 日、11 日的构建产生严重重叠,导致历史构件无法唯一定位与按时间递增比对。
解决方案:$(10 + \text{DD})$ 固定位宽基底偏移算法
引入基底偏移 $+10$ 是一套数学上完全可逆单射、且天然免疫前导零的高可靠编码方案:
- 彻底消除前导零:
- 公历日期 $\text{DD} \in [1, 31]$;
- 经过 $(10 + \text{DD})$ 运算后,取值范围严格为 $[11, 41]$;
- 最高位永远是 1~4,绝对不会出现 0,即使被强转为数字整型存储,也绝不会发生前导零截断!
- 严格 5 位固定宽度与双向无歧义逆向解码:
- 当日构建流水号 $\text{RRR}$ 固定占 3 位($001 \sim 999$),单日支持 999 次自动构建;
- 编码公式: $$\text{Part4} = (10 + \text{DD}) \times 1000 + \text{RRR} \quad (\text{范围:} 11001 \sim 41999)$$
- 无歧义逆向解码公式: $$\text{DD} = \lfloor \text{Part4} / 1000 \rfloor - 10$$ $$\text{RRR} = \text{Part4} \pmod{1000}$$
对比示例验证表:
| 实际日期与构建场景 | 朴素拼接(存在歧义/非法零) | (10+DD)RRR 偏移编码 | 解码验证(准确度) |
|---|---|---|---|
| 10 月 04 日 第 2 次构建 | 04002(前导零丢失变成 4002) | 14002 | $\lfloor 14002/1000 \rfloor - 10 = \mathbf{4}$ 日,第 $\mathbf{2}$ 次(100% 精确) |
| 01 月 01 日 第 1 次构建 | 01001(前导零丢失变成 1001) | 11001 | $\lfloor 11001/1000 \rfloor - 10 = \mathbf{1}$ 日,第 $\mathbf{1}$ 次(100% 精确) |
| 01 月 10 日 第 1 次构建 | 10001 | 20001 | $\lfloor 20001/1000 \rfloor - 10 = \mathbf{10}$ 日,第 $\mathbf{1}$ 次(100% 精确) |
| 01 月 11 日 第 1 次构建 | 11001(与 1日第1次产生二义性) | 21001 | $\lfloor 21001/1000 \rfloor - 10 = \mathbf{11}$ 日,第 $\mathbf{1}$ 次(100% 精确) |
| 01 月 31 日 第 15 次构建 | 31015 | 41015 | $\lfloor 41015/1000 \rfloor - 10 = \mathbf{31}$ 日,第 $\mathbf{15}$ 次(100% 精确) |
💡 关于
YYMM的自说明性:由于当前处于 21 世纪($YY \ge 20$),无论月份为 1 月(01)还是 12 月(12),YYMM构成的数值始终落在 $[2601, 9912]$,高位始终被年份非零锚定,因此YYMM作为独立段同样天然杜绝了前导零丢失!
3. 生态适配性指南 (Cross-Ecosystem Compatibility)
针对“YYMM 与四段式版本能否适用于常见生态(如插件、各平台应用)”的技术解答与落地映射策略:
(1) 四段原生宿主体系(Windows / macOS / Android / 容器镜像)
- Windows PE 二进制 (DLL / EXE):
- Windows 原生
AssemblyVersion与FileVersion由四个 16-bit 无符号整数(UINT16,上限 65535)构成; YYMM(最大 9912)$< 65535$;(10+DD)RRR(最大 41999)$< 65535$;- 结论:完美 100% 符合 Windows PE 底层数据结构,无需任何妥协。
- Windows 原生
- macOS / iOS (Xcode):
CFBundleShortVersionString:填入MAJOR.MINOR(如3.6);CFBundleVersion:直接填入四段式3.6.2610.14002或纯流水号261014002,均符合 Apple 商店提审规范。
- Android (Gradle):
versionName:直接使用3.6.2610.14002;versionCode:使用纯递增整数261014002(远小于 JavaInteger.MAX_VALUE = 2147483647)。
(2) 三段式 SemVer 宿主体系(VS Code 插件、npm、Cargo、NuGet)
- VS Code 扩展 (Plugins):
- VS Code 插件商店(
vsce)强制执行严格的三段式 SemVer 2.0.0(X.Y.Z),直接包含 4 个点会被打包工具拒收报错。
- VS Code 插件商店(
- 针对插件生态的标准适配映射模式:
- 推荐方案 A(Patch 段打平为 9 位递增整数): $$\text{Plugin Version} = \text{MAJOR} ,., \text{MINOR} ,., \underbrace{\text{YYMM}(10+\text{DD})\text{RRR}}_{\text{9位整型 Patch}}$$ 例:
3.6.261014002。- 合规性:标准三段式,无前导零,符合 SemVer 2.0;
- 递增性:随日期与当日流水绝对单调递增,VS Code 市场能准确识别为新版本并触发自动更新。
- 方案 B(月度正式版 + CI 预发布 Tag):
- 正式月度插件版:
MAJOR.MINOR.YYMM(如3.6.2610); - 每日测试预览版:
MAJOR.MINOR.YYMM-(10+DD)RRR(如3.6.2610-14002或3.6.2610-dev.14002)。
- 正式月度插件版:
- 推荐方案 A(Patch 段打平为 9 位递增整数): $$\text{Plugin Version} = \text{MAJOR} ,., \text{MINOR} ,., \underbrace{\text{YYMM}(10+\text{DD})\text{RRR}}_{\text{9位整型 Patch}}$$ 例:
4. CI/CD 流水线实现代码参考
# PowerShell (Azure DevOps / GitHub Actions / 本地构建脚本)
$Major = 3
$Minor = 6
$Now = Get-Date
$YYMM = $Now.ToString("yyMM") # 例: 2610
$DD = [int]$Now.ToString("dd") # 例: 4
$Rev = 2 # 流水号(自流水线 $(Build.BuildId) 提取或计数)
$OffsetRev = (10 + $DD) * 1000 + $Rev # 例: 14002
# 1. 四段式原生版本(Windows / iOS / Android / 内部发布)
$FullVersion = "$Major.$Minor.$YYMM.$OffsetRev" # 3.6.2610.14002
# 2. 插件与 SemVer 三段式版本(VS Code 插件 / npm)
$SemVerPlugin = "$Major.$Minor.${YYMM}${OffsetRev}" # 3.6.261014002三、 移动端与桌面端 App 专属发布文档规范 (App-Specific Extensions)
当工程目标为客户端应用(如 iOS / iPadOS / macOS / Android / Windows / Flutter / React Native 等 App)时,发布流程需深度对接各应用商店(Apple App Store, Google Play, 华为应用市场, 微软应用商店等)的人工审核与上架流程。需在 docs/ 目录下拓展以下标准文档:
docs/
├── app-store/ # 移动与客户端 App 专有发布文档目录
│ ├── StoreListing.md # 应用商店元数据与文案资产清单
│ ├── AppStoreReleaseNote.md # 针对应用商店字符限制的多语言版本更新文案
│ ├── ReviewChecklist.md # 提审查重清单与审核员专用指引 (Reviewer Notes)
│ ├── Privacy-Compliance.md # 隐私清单、权限声明与数据合规自检
│ └── Phased-Release-Plan.md # 灰度发布、阶段放量与监控回滚门禁1. StoreListing.md (商店基础元数据与素材清单)
- 核心内容:
- 应用名称 (App Name) 与 副标题 (Subtitle);
- 宣传文本 (Promotional Text) 与 完整描述 (Description);
- 搜索关键词 (Keywords - 逗号分隔,精准控制在商店上限内);
- 官方支持网址 (Support URL)、营销网址 (Marketing URL) 与 隐私政策网址 (Privacy Policy URL);
- 各尺寸截图与预览视频的存放索引与设计规范。
2. AppStoreReleaseNote.md (应用商店专用更新日志)
- 核心特征:
- 字符数严格受控:针对各主流平台做长度约束(例如 Apple App Store "What's New" 限 4,000 字符;Google Play 简要说明限 500 字符;国内部分应用市场限 200~500 字符);
- 多语言本地化 (i18n):为主要目标市场提供对应语言的精炼文案(如
zh-Hans,en-US,ja-JP); - 规避审核雷区:严禁出现“修复了若干已知 Bug”、“测试包”、“性能优化”等假大空敷衍词汇,明确阐述具体改动以降低拒审 (Rejection) 概率。
3. ReviewChecklist.md (提审查重与审核员指引)
- 审核凭证与通道:
- 专供 Apple App Review 或 Google Play Review 使用的测试账号与密码;
- 双重认证 (2FA) 绕过通道或固定验证码说明;
- 演示视频 (Demo Video) 链接(用于需要特殊硬件配合或内购审核场景);
- 提审自检项:
- IPv6-only 网络连通性测试确认;
- 登录注销流程、注销账户功能完整性;
- 虚拟商品内购 (IAP) 与第三方支付边界合规。
4. Privacy-Compliance.md (隐私清单与合规档案)
- 敏感权限声明:定位、相机、麦克风、相册、剪贴板读取的用途文案 (Usage Description);
- 隐私清单 (Privacy Manifest):iOS
PrivacyInfo.xcprivacy所声明的 API 类型与数据收集项 1:1 对照说明; - SDK 依赖审计:第三方广告、统计、崩溃上报 SDK 的隐私合规与无越权调用声明。
5. Phased-Release-Plan.md (阶段性灰度与监控回滚预案)
- 放量阶段:定义 7 天自动分阶段放量或手动阶梯放量策略(如 Day 1: 1%, Day 2: 2%, Day 3: 5%, Day 4: 10%, Day 5: 20%, Day 6: 50%, Day 7: 100%);
- 监控熔断指标:崩溃率 (Crash Rate > 0.1%)、首屏渲染耗时恶化、关键业务转化率下跌;
- 回滚与热修预案:暂停灰度、紧急热修复 (Hotfix) 或提审紧急加急 (Expedited Review) 流程。
四、 CI/CD 执行生命周期的深度集成 (Pipeline Lifecycle)
文档不应是静态躺在代码库中的死文字,而应深度贯穿于 CI/CD 自动化的全生命周期:
┌────────────────────────────────────────────────────────┐
│ CI/CD 执行全生命周期 │
└────────────────────────────────────────────────────────┘
│
┌─────────────────────────────┴────────────────────────────┐
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ CI 执行期深度感知 │ │ CI 执行后报告与归档 │
│ (In-Pipeline) │ │ (Post-Pipeline) │
└──────────────────────┘ └──────────────────────┘
│ │
┌───────┴───────┐ ┌───────┴───────┐
▼ ▼ ▼ ▼
┌──────────────┐┌──────────────┐ ┌──────────────┐┌──────────────┐
│ 动态标题注入 ││ 即时看板汇总 │ │ 文档站点发布 ││ 构件产物归集 │
│ (Set Title) ││ (Dashboard) │ │ (Reports Tab)││ (Drop Staging│
└──────────────┘└──────────────┘ └──────────────┘└──────────────┘1. 执行期深度感知 (In-Pipeline Execution)
(1) CI 构建标题标准与两阶段演进规范 (Pipeline Name Standards)
为了保证流水线在排队、构建以及历史追溯中均具备极高的可读性与准确度,CI 实例标题执行**“触发期默认标题 $\to$ 运行期动态注入版本”**的两阶段演化标准:
阶段一:触发期默认 CI 标题 (Initial / Default Pipeline Title)
- 命名公式: $$\text{Default CI Name} = \text{AppDirName 或 ProjectName} \ - \ \text{$(Date:yy.MM.dd).$(Rev:r)}$$
- 范围边界:
- Monorepo / 多应用仓库:使用当前触发构建的目标 App 目录名称(如
blog.aicro.net_vitepress); - 单体工程 / 独立代码库:针对整个项目仅有这一个全局 CI 的场景,使用整个项目的名称(如
AicrosoftCore)。
- Monorepo / 多应用仓库:使用当前触发构建的目标 App 目录名称(如
- Azure DevOps 顶级
name:可用参数与限制 (Compile-Time Parameters):⚠️ 重要规则:顶级
name:仅支持服务器编译期已确定的有限宏与变量,严禁直接使用$(Build.SourceVersionMessage):$(Build.SourceVersionMessage)在排队时尚未拉取解析,直接写入会被当作普通字符串或被置空;- Git Commit 信息通常包含多行换行符、引号或冒号等非法特殊字符,直接写入会被 Azure DevOps 判定为非法 BuildNumber 导致流水线触发失败。
顶级
name:官方支持的安全参数列表:$(Date:yy.MM.dd)/$(Date:yyyyMMdd):当前构建日期;$(Rev:r)/$(Rev:rr):基于前缀模式自增的当日流水编号(每天自动重置为 1);$(SourceBranchName):当前触发分支的短名称(如dev、main);$(Build.BuildId):全局单调自增的唯一构建 ID。
- YAML 配置声明示例 (Azure DevOps):yaml
# ci/blog.aicro.net.yml 顶级声明(纯净、合法且绝对安全) name: blog.aicro.net_vitepress-$(Date:yy.MM.dd).$(Rev:r)
阶段二:运行期动态更新 CI 标题 (In-Pipeline Dynamic Version & Commit Injection)
- 更新机制:流水线进入 Agent 执行编译脚本时(如
build.ps1),源代码已完全检出,此时系统已安全挂载完整的$env:BUILD_SOURCEVERSIONMESSAGE:- 字符安全过滤 (避让 TF209010 错误):Azure DevOps 严禁在
BuildNumber中包含",/,:,<,>,\,|,?,@,*以及末尾句点.,且限制最大长度 255。常规 Commit 中的冒号(如feat:,refactor:)必须通过正则自动替换为空格或连字符; - 读取项目元数据(
package.json、pubspec.yaml等)中的当前应用版本$version; - 通过
##vso[build.updatebuildnumber]指令,在原时间流水号前方插入应用版本,并在尾部优雅追加经过安全净化的单行提交信息。
- 字符安全过滤 (避让 TF209010 错误):Azure DevOps 严禁在
- 动态标题公式: $$\text{Dynamic CI Name} = \text{AppDirName 或 ProjectName} \ - \ \mathbf{AppVersion} \ - \ \text{YY.MM.DD.Rev} \ \ \mathbf{$safeCommitMessage}$$
- 脚本执行指令 (Azure DevOps):powershell
# 在 build.ps1 运行期安全执行:严格过滤特殊字符与控制最大长度 $dynamicBuildNumber = "$appDirName-$version-$timeVersion" if ($safeMsg) { $cleanMsg = $safeMsg -replace '["/:<>\\|?@*]', ' ' $cleanMsg = ($cleanMsg -replace '\s+', ' ').Trim().TrimEnd('.') if ($cleanMsg.Length -gt 60) { $cleanMsg = $cleanMsg.Substring(0, 60).Trim().TrimEnd('.') } if ($cleanMsg) { $dynamicBuildNumber = "$appDirName-$version-$timeVersion $cleanMsg" } } Write-Host "##vso[build.updatebuildnumber]$dynamicBuildNumber" - 两阶段标题演化示例对比:
- 更新机制:流水线进入 Agent 执行编译脚本时(如
| 流水线生命周期 | 标题规范格式 | 实际呈现示例 | 说明 |
|---|---|---|---|
| 触发与排队期 (Default) | {AppDir}-{YY.MM.DD.Rev} | blog.aicro.net_vitepress-26.10.04.1 | 纯净稳定,杜绝特殊字符与排队期解析异常 |
| 执行与归档期 (Dynamic) | {AppDir}-{Version}-{YY.MM.DD.Rev} {Commit} | blog.aicro.net_vitepress-3.11.0-26.10.04.1 feat: update docs | 注入真实版本与清洗后的单行 Commit 信息 |
- App 二进制配置版本联动:
- 若为移动端/桌面端 App 项目,脚本在更新流水线标题的同时,将该实际版本与流水号同步回写至宿主配置(如 iOS 的
CFBundleShortVersionString+CFBundleVersion、Android 的versionCode),保证 CI 标题、Git 记录与安装包二进制版本 100% 对齐。
- 若为移动端/桌面端 App 项目,脚本在更新流水线标题的同时,将该实际版本与流水号同步回写至宿主配置(如 iOS 的
(2) 即时摘要看板呈现 (Dashboard / Summary Notification)
- 各 CI 平台提供了即时卡片汇报机制(如 Azure DevOps 的
##vso[task.uploadsummary]、GitHub Actions 的$GITHUB_STEP_SUMMARY、GitLab 的 Pipeline Reports); - CI 脚本自动解析
ReleaseNote.md中的“核心亮点”,并提取关键测试指标(测试通过率、覆盖率、静态扫描结果),直接渲染在流水线摘要首页,评审人员无需翻阅日志即可一目了然。
2. 执行后报告与文档站点呈现 (Post-Pipeline Reports)
- 多级交互式技术站点一键发布:
- 现代 CI/CD 均支持将报告与文档直接发布为可浏览的 HTML / Markdown 站点(如 Azure DevOps 的
PublishMarkdownReports@1、GitHub Pages、GitLab Pages); - 构建脚本将
index.md、Release.md、ReleaseNote.md、changeLog.md以及changes/目录归集为站点源; - 收益:全团队(开发、测试、运维、产品经理)在浏览器中即可直接阅读最新版本的交互式技术文档、架构全景与发布说明,无需本地拉取代码。
- 现代 CI/CD 均支持将报告与文档直接发布为可浏览的 HTML / Markdown 站点(如 Azure DevOps 的
五、 产物归集 (Drop) 与发布隔离规范 (Artifacts & Isolation Guard)
为保证交付包的纯净度、安全性与职责单一,文档内容与对外分发的生产包必须执行严格的物理隔离。
drop/ (构建产物总输出目录)
├── Production-Artifacts/ # 生产级分发包 (严禁包含内部技术文档)
│ ├── myapp-macos-cli.zip # CLI 工具包
│ ├── myapp-ios-framework.zip # SDK 二进制框架包
│ ├── myapp-v1.2.0.ipa / .aab # App 生产安装包
│ └── symbols.zip # dSYM / ProGuard 符号表归档 (隔离保存)
├── pipeline_reports/ # CI 阶段执行诊断、代码覆盖率与测试报告
└── docs/ # 独立的工程文档归档目录
├── index.md # 文档总索引
├── Release.md # 最新版本变更
├── ReleaseNote.md # 用户友好发布说明
├── changeLog.md # 变更汇总索引
├── changes/ # 历史完整版本归档 (v1.2.md ...)
└── app-store/ # [App 专有] 商店元数据、提审清单与灰度计划1. 核心隔离准则 (Isolation Principles)
- 绝对禁止侵入生产包:
- 生产级交付包(如 CLI 可执行文件压缩包、移动端 IPA/AAB 安装包、SDK 框架包、npm/Maven 构件包)内部仅允许携带最基础的对外 LICENSE 与使用引导;
- 严禁将内部架构文档、设计规划、测试详报、历史变更档案(
changes/)打包进生产分发文件,避免资产体积膨胀与内部技术信息泄漏。
- 独立目录归集发布:
- 在 CI 构件暂存区(如
$(Build.ArtifactStagingDirectory)/drop)中,docs/必须作为顶级同级目录独立存在; - 供合规审计、历史追溯、离线查看与运维归档使用。
- 在 CI 构件暂存区(如
- 分发管道分流管控:
- 私有包管理源 (Feed / Registry):仅上传对应的核心类库或工具包;
- 应用商店上传通道 (Transporter / Fastlane):仅上传签名后的 App 二进制文件与符号表,结合
app-store/中的文本自动调用 API 提交审核; - 内部归档通道:全量保留
drop/docs/与pipeline_reports/。
六、 自动化实施检查清单 (Automation Checklist)
在落地本规范时,建议在工程 CI 脚本中植入以下轻量自动化校验:
- [ ] 版本标识与流水号合规断言:断言版本号四段各字段无前导零,日流水段严格符合 $(10 + \text{DD})\text{RRR}$ 范围($11001 \sim 41999$),杜绝“111”等二义性。
- [ ] 版本文件格式校验:检查
changes/下的文件名是否严格遵守v<Major>.<Minor>.md(杜绝三段式散落小文件)。 - [ ] 镜像一致性校验:自动化对比
Release.md与changes/中最新版本文件的内容哈希,若不一致则中断流水线。 - [ ] 相对路径有效性检查:扫描 Markdown 文档中的链接,禁止出现
file:///Users/...等绝对路径或失效相对引用。 - [ ] 生产包纯净度断言 (Contamination Guard):在打出发布压缩包或 IPA/AAB 后,校验其解压清单,断言不存在
changes/、internal-docs/等调试与文档目录。 - [ ] App 商店字符限制扫描:若包含
AppStoreReleaseNote.md,预先通过脚本计算各语言字符长度,超限时给出告警或阻断提交。
