# Fzx项目版本自动化管控优化落地文档(对标大厂规范·全配置整合版)
**文档版本**: V1.4
**更新日期**: 2026-06-22
**方案说明**: 基于VERSION文件单一版本源 + Python脚本自动化方案
---
## 📋 文档修订记录
| 版本 | 日期 | 修改内容 | 作者 |
|----------|---------|--------------------------------------------------|------|
| V1.0 | 2026-05 | 初始版本 | 技术团队 |
| V1.1 | 2026-06 | 完善项目实际配置、补充大厂最佳实践 | 技术团队 |
| V1.2 | 2026-06 | 更新实际配置文件、验证构建成功 | 技术团队 |
| V1.3 | 2026-06 | 修复构建问题、配置dependency-check离线模式、创建标准正式标签v1.1.0 | 技术团队 |
| **V1.4** | 2026-06 | **更新为VERSION文件+Python脚本方案(已实际落地实施)** | 技术团队 |
---
## 1 整体方案概述
### 1.1 核心思路(已废弃jgitver方案)
> ⚠️ **重要更新 (V1.4)**:原文档描述的jgitver方案未实际实施。当前项目使用**VERSION文件单一版本源 + Python脚本自动化**方案,已落地实施。
**实际实施的方案**:
| 方案要素 | 说明 |
|--------------|------------------------------------------|
| 单一版本源 | `VERSION`文件作为唯一版本基准 |
| 版本同步 | `update_version.py`自动同步到pom.xml、前端配置 |
| 版本校验 | `version_check.py`独立安全门禁 |
| CI/CD集成 | Jenkins Pipeline Pre-Build阶段集成 |
| Python兼容性 | 兼容Python 3.6+(Jenkins节点可能使用Python 3.6) |
### 1.2 版本编号规则
| 构建场景 | 版本格式示例 | 说明 |
|-------------------|--------------------------------------|----------|
| 后端pom | `1.1.1-SNAPSHOT` | Maven使用 |
| 完整版本号 | `1.1.1-develop-d30fcd0c-526` | 包含元数据 |
| 前端package.json | `1.1.1-develop-d30fcd0c-526` | Web前端 |
| Flutter pubspec | `1.1.1+526` | 移动端 |
| 镜像标签 | `v1.1.1` / `v1.1.1-526` | 容器镜像 |
### 1.3 方案优势
| 优势 | 说明 |
|-----------|------------------------------------------|
| **简单直观** | 版本号配置一目了然,无需复杂计算 |
| **可靠同步** | 单一版本源 + 自动同步,杜绝版本不一致 |
| **双重保障** | 自动同步 + 独立校验,任何一步失败都能拦截 |
| **广泛兼容** | Python 3.6+ 兼容,适配各种环境 |
| **易于维护** | 纯Python实现,无额外Maven插件依赖 |
---
## 2 核心配置文件
### 2.1 VERSION文件(单一版本源)
**位置**: 项目根目录 `VERSION`
```bash
BASE_VERSION=1.1.1
BUILD_NUMBER=526
LAST_UPDATED=2026-06-22 10:30:00
```
**说明**:
- `BASE_VERSION`: 基础版本号,修改版本只需改这个值
- `BUILD_NUMBER`: Jenkins BUILD_NUMBER,自动更新
- `LAST_UPDATED`: 最后更新时间
### 2.2 父pom.xml配置
**位置**: 项目根目录 `pom.xml`
```xml
1.1.1-SNAPSHOT
21
21
21
UTF-8
```
### 2.3 子服务pom.xml配置
**说明**: 子服务使用 `${revision}` 占位符继承父pom版本,无需单独配置
```xml
com.fzx
fzx-platform
${revision}
../../pom.xml
api-gateway
${revision}
```
---
## 3 核心脚本说明
### 3.1 update_version.py(版本同步脚本)
**位置**: `scripts/update_version.py`
| 功能 | 说明 | 命令行参数 |
|----------|--------------|-----------|
| 完整同步 | 校验+自动修复+同步 | (无参数) |
| 仅校验 | 仅检查不一致不修复 | `--check` |
| 校验+修复 | 校验并自动修复不一致 | `--fix` |
| 单服务更新 | 仅更新指定服务版本 | `--single 服务名` |
**使用示例**:
```bash
# 完整同步流程(默认)
python scripts/update_version.py
# 仅校验版本一致性
python scripts/update_version.py --check
# 校验+自动修复
python scripts/update_version.py --fix
# 更新单个服务
python scripts/update_version.py --single auth-service
```
### 3.2 version_check.py(版本校验脚本)
**位置**: `scripts/version_check.py`
| 校验项 | 说明 |
|---------------|------------------------------------------|
| 版本格式校验 | pom revision格式X.Y.Z或X.Y.Z-SNAPSHOT |
| 分支版本绑定校验 | release分支无SNAPSHOT,develop必须有SNAPSHOT |
| VERSION一致性校验 | pom版本与VERSION文件BASE_VERSION一致 |
| 工作区清洁度校验 | 非develop分支不能有未提交变更 |
| Commit哈希校验 | 8位commit hash正常读取 |
### 3.3 Python兼容性处理
```python
# 设置标准输出为UTF-8编码(兼容Python 3.6)
try:
sys.stdout.reconfigure(encoding='utf-8')
except AttributeError:
# Python 3.6 不支持reconfigure,使用默认编码
pass
```
---
## 4 Jenkins Pipeline集成
### 4.1 Pre-Build阶段
```groovy
stage('Pre-Build') {
steps {
script {
echo '🔄 同步版本号(VERSION文件 -> pom.xml)'
sh "python scripts/update_version.py --fix"
// 计算完整版本号
def pomVersion = sh(script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true).trim()
def branch = sh(script: 'git rev-parse --abbrev-ref HEAD', returnStdout: true).trim()
def commitHash = sh(script: 'git rev-parse --short=8 HEAD', returnStdout: true).trim()
def buildNum = env.BUILD_NUMBER ?: new Date().format('yyyyMMddHHmmss')
def baseVersion = pomVersion.replace('-SNAPSHOT', '')
def cleanBranch = branch.replace('/', '-')
env.POM_VERSION = pomVersion
env.BASE_VERSION = baseVersion
env.BRANCH_NAME = branch
env.COMMIT_HASH = commitHash
env.BUILD_NUM = buildNum
if (!env.FULL_VERSION) {
env.FULL_VERSION = "${baseVersion}-${cleanBranch}-${commitHash}-${buildNum}"
}
echo "📊 完整版本号: ${env.FULL_VERSION}"
}
}
}
```
### 4.2 版本合规校验阶段
```groovy
stage('版本合规校验') {
steps {
echo '🔍 执行版本合规校验(大厂标准)'
sh "python scripts/version_check.py"
}
post {
success {
echo '✅ 版本合规校验通过'
}
failure {
echo '❌ 版本合规校验失败'
error('版本不合规,终止构建')
}
}
}
```
---
## 5 版本管理完整流程
```
┌─────────────────────────────────────────────────────────────────────┐
│ 版本管理完整流程(已落地实现) │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ 1. 唯一入口:修改VERSION文件中的BASE_VERSION │
│ ↓ │
│ 2. Pre-Build阶段 │
│ └── 执行 python scripts/update_version.py --fix │
│ └── 自动同步VERSION到pom.xml(revision) │
│ └── 自动更新前端package.json/pubspec.yaml │
│ └── 自动生成version.json │
│ ↓ │
│ 3. 版本合规校验(独立安全门禁) │
│ └── 执行 python scripts/version_check.py │
│ └── 检测版本格式、分支绑定、一致性、工作区清洁度 │
│ ↓ │
│ 4. 构建阶段 │
│ └── Maven使用pom.xml中的${revision} │
│ └── 子服务自动继承父pom版本 │
│ ↓ │
│ 5. 镜像/制品发布 │
│ └── 使用FULL_VERSION环境变量 │
│ │
└─────────────────────────────────────────────────────────────────────┘
```
---
## 6 常见问题排查
| 问题 | 原因 | 解决方案 |
|-----------------------|------------------------------|-----------------------------|
| `AttributeError: '_io.TextIOWrapper' object has no attribute 'reconfigure'` | Jenkins节点Python版本为3.6,不支持reconfigure() | 脚本已添加try-except兼容处理(V1.4+) |
| 版本号不一致 | pom.xml与VERSION文件不同步 | 执行 `python scripts/update_version.py --fix` |
| 子服务版本未更新 | 子服务使用${revision}占位符,无需单独更新 | 这是正常设计,Maven自动解析 |
| 构建失败 | 版本校验脚本检测到版本不合规 | 检查分支与版本绑定规则 |
| 前端版本未同步 | 前端项目路径不存在或package.json不存在 | 检查前端项目目录结构 |
---
## 7 与旧方案(jgitver)的区别
| 对比项 | jgitver方案(未实施) | VERSION+Python方案(已实施) |
|-------------|---------------------------|------------------------|
| 依赖 | 需要Maven扩展jgitver | 仅Python脚本 |
| 配置复杂度 | 高(需要配置XML) | 低(简单的配置文件) |
| 版本控制 | 基于Git标签自动计算 | 手动修改VERSION文件 |
| 灵活性 | 低(受限于jgitver规则) | 高(完全自定义) |
| Python兼容性 | 无要求 | 需要Python 3.6+ |
| 实际使用情况 | ❌ 未实施 | ✅ 已落地实施 |
---
**维护记录**:
| 版本 | 日期 | 变更人 | 变更内容 |
|-----|-------------|-------|----------------------------------------|
| V1.4 | 2026-06-22 | 技术团队 | 更新为VERSION文件+Python脚本方案,反映实际落地实施情况 |