如何配置GitVersion实现master、dev、hotfix分支的程序集版本自动更新
Azure DevOps中GitVersion自动版本控制配置优化方案
问题背景
在Azure DevOps流水线中使用GitVersion实现部署自动化,但无法按预期完成自动版本控制,且当前依赖Git标签的流程需要运行两次流水线才能获取正确版本号,希望优化配置避免该问题。
分支结构
master:主分支,生产版本发布源dev:承载当前开发版本hotfix*:从master创建的短期热修复分支,命名格式如hotfix-bug#99999- 开发分支:从dev创建,无固定命名规范,完成后合并回dev
期望的版本更新规则
- 任意分支向dev发起Pull Request:生成预发布版本(例如
1.0.0→1.0.0-something) - dev向master发起Pull Request:升级Minor版本(例如
1.0.0→1.1.0) - 任意hotfix分支向master发起Pull Request:升级Patch版本(例如
1.0.0→1.0.1)
当前痛点
当前流程需要手动打标签并重新运行流水线:
- 完成Pull Request后触发流水线
- 本地拉取PR变更,为最新提交打版本标签(如
1.1.0) - 推送标签后重新运行流水线,GitVersion才能获取正确版本号
当前GitVersion.yml配置
assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatch mode: ContinuousDelivery tag-prefix: '[vV]' continuous-delivery-fallback-tag: ci major-version-bump-message: '\+semver:\s?(breaking|major)' minor-version-bump-message: '\+semver:\s?(feature|minor)' patch-version-bump-message: '\+semver:\s?(fix|patch)' no-bump-message: '\+semver:\s?(none|skip)' legacy-semver-padding: 4 build-metadata-padding: 4 commits-since-version-source-padding: 4 tag-pre-release-weight: 60000 commit-message-incrementing: Enabled branches: develop: mode: ContinuousDeployment tag: alpha increment: Minor prevent-increment-of-merged-branch-version: false track-merge-target: true regex: ^dev(elop)?(ment)?$ source-branches: [] tracks-release-branches: true is-release-branch: false is-mainline: false pre-release-weight: 0 main: mode: ContinuousDelivery tag: '' increment: Patch prevent-increment-of-merged-branch-version: true track-merge-target: false regex: ^master$|^main$ source-branches: - develop - release tracks-release-branches: false is-release-branch: false is-mainline: true pre-release-weight: 55000 release: mode: ContinuousDelivery tag: beta increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false regex: ^releases?[/-] source-branches: - develop - main - support - release tracks-release-branches: false is-release-branch: true is-mainline: false pre-release-weight: 30000 feature: mode: ContinuousDelivery tag: '{BranchName}' increment: Inherit regex: ^features?[/-] source-branches: - develop - main - release - feature - support - hotfix pre-release-weight: 30000 hotfix: mode: ContinuousDelivery tag: beta increment: Patch prevent-increment-of-merged-branch-version: false track-merge-target: false regex: ^hotfix(es)?[/-] source-branches: - release - main - support - hotfix tracks-release-branches: false is-release-branch: false is-mainline: false pre-release-weight: 30000 ignore: sha: [] increment: Inherit commit-date-format: yyyy-MM-dd merge-message-formats: {} update-build-number: true
优化后的GitVersion.yml配置
针对需求调整配置如下,核心是利用track-merge-target和分支合并逻辑实现自动版本递增,无需依赖手动打标签:
assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatch # 全局使用ContinuousDeployment模式,无需依赖标签触发版本正式化 mode: ContinuousDeployment tag-prefix: '[vV]' continuous-delivery-fallback-tag: ci major-version-bump-message: '\+semver:\s?(breaking|major)' minor-version-bump-message: '\+semver:\s?(feature|minor)' patch-version-bump-message: '\+semver:\s?(fix|patch)' no-bump-message: '\+semver:\s?(none|skip)' legacy-semver-padding: 4 build-metadata-padding: 4 commits-since-version-source-padding: 4 tag-pre-release-weight: 60000 commit-message-incrementing: Enabled branches: develop: mode: ContinuousDeployment tag: alpha # dev分支默认递增Minor,合并开发分支时继承版本并生成预发布后缀 increment: Minor prevent-increment-of-merged-branch-version: true # 开启跟踪合并目标,确保PR到dev时基于dev的当前版本生成预发布版 track-merge-target: true regex: ^dev(elop)?(ment)?$ source-branches: - feature - hotfix tracks-release-branches: true is-release-branch: false is-mainline: false pre-release-weight: 0 main: mode: ContinuousDeployment tag: '' # 默认不自动递增,依赖合并来源分支的规则触发版本变更 increment: None prevent-increment-of-merged-branch-version: false # 开启跟踪合并目标,识别合并来源分支类型来决定版本递增规则 track-merge-target: true regex: ^master$|^main$ source-branches: - develop - hotfix tracks-release-branches: false is-release-branch: false is-mainline: true pre-release-weight: 55000 hotfix: mode: ContinuousDeployment tag: hotfix increment: Patch prevent-increment-of-merged-branch-version: true track-merge-target: true # 匹配hotfix-bug#xxx格式的分支 regex: ^hotfix- source-branches: - main tracks-release-branches: false is-release-branch: false is-mainline: false pre-release-weight: 40000 feature: mode: ContinuousDeployment tag: feature-{BranchName} increment: Inherit # 匹配所有从dev创建的开发分支(无固定命名) regex: ^(?!master|dev|hotfix).*$ source-branches: - develop pre-release-weight: 30000 ignore: sha: [] increment: Inherit commit-date-format: yyyy-MM-dd merge-message-formats: {} update-build-number: true
配置说明
- 全局模式调整:将全局
mode改为ContinuousDeployment,无需依赖标签即可生成带预发布后缀的版本,避免手动打标签的二次流水线运行。 - dev分支配置:
- 开启
track-merge-target: true,当开发分支PR到dev时,基于dev的当前版本生成1.0.0-alpha.x格式的预发布版本。 - 设置
prevent-increment-of-merged-branch-version: true,避免合并开发分支时意外递增dev的版本号,保持dev版本由自身提交或合并触发递增。
- 开启
- main分支配置:
- 设置
increment: None,版本递增完全由合并的来源分支决定:- 合并dev分支时,GitVersion会识别dev的Minor递增规则,自动将main版本从
1.0.0升级为1.1.0。 - 合并hotfix分支时,识别hotfix的Patch递增规则,自动将main版本从
1.0.0升级为1.0.1。
- 合并dev分支时,GitVersion会识别dev的Minor递增规则,自动将main版本从
- 开启
track-merge-target: true,确保正确识别合并来源分支的版本规则。
- 设置
- hotfix分支配置:
- 调整
regex匹配hotfix-开头的分支,适配hotfix-bug#99999的命名格式。 - 设置
increment: Patch,确保hotfix分支自身的预发布版本为1.0.1-hotfix.x,合并到main时触发Patch版本升级。
- 调整
- 开发分支配置:
- 调整
regex匹配除master、dev、hotfix外的所有分支,适配无固定命名的开发分支需求。 - 设置
increment: Inherit,继承dev的版本号,生成1.0.0-feature-xxx.x格式的预发布版本,PR到dev时自动整合为dev的预发布版本。
- 调整
内容的提问来源于stack exchange,提问作者WSC
相关产品推荐
相关产品推荐

