如何让GitVersion基于dev分支而非main分支进行版本递增?
问题描述
我们在feature/*分支开发功能,通过Azure DevOps的拉取请求(Pull Request)将其合并到dev分支。拉取请求模板提供修复(Fix)、新功能(Feature)、**重大变更(Major Change)**三个选项,选择后构建验证流水线会生成+semver: (major|minor|patch)格式的提交,触发GitVersion进行版本递增。
当前存在问题:每次将feature/*合并到dev分支时,版本是基于main分支的最新版本进行递增,需要调整为基于dev分支的最新版本递增。
拉取请求模板
## 更新类型 - [ ] 修复(Fix) - [ ] 新功能(Feature) - [ ] 重大变更(Major Change)
构建验证流水线
trigger: - none pool: vmImage: ubuntu-latest ## 计算语义化版本的任务 jobs: - job: CalculateVersion displayName: 语义化版本计算 steps: # 带持久化凭证的代码检出 - checkout: self fetchDepth: 0 persistCredentials: true # 安装GitVersion - task: gitversion/setup@0 displayName: 安装GitVersion inputs: versionSpec: '5.x' # 获取拉取请求描述 - task: PullRequestDescription@0 name: RetrievePullRequestDescription displayName: 获取拉取请求描述 inputs: action: 'view' outputVariable: 'PullRequest.DescriptionContent' isOutput: true stripIdentifiers: false # 添加会被GitVersion识别的Git提交消息(格式为"+semver: patch/minor/major") # 根据开发者在拉取请求描述中选择的变更类型执行 - task: PowerShell@2 displayName: 添加SemVer用的Git提交消息 inputs: targetType: inline script: | Write-Host "配置Git作者信息.." -ForegroundColor Cyan git config user.email "Azure DevOps pipeline" git config user.name "Azure.Devops@pipeline.com" Write-Host "执行Git checkout操作..." -ForegroundColor Cyan git checkout -b "$(System.PullRequest.SourceBranch)".replace('refs/heads/', '') Write-Host "检查拉取请求描述..." -ForegroundColor Cyan $PRdesc = "$(RetrievePullRequestDescription.PullRequest.DescriptionContent)" if ($PRdesc -match '(\[x\] \b修复(Fix)\b)') { Write-Host "添加Git空提交消息,标记此分支为SemVer的'patch'版本递增。" -ForegroundColor Cyan git commit -a -m "+semver: patch [skip azurepipelines]" --allow-empty } elseif ($PRdesc -match '(\[x\] \b新功能(Feature)\b)') { Write-Host "添加Git空提交消息,标记此分支为SemVer的'minor'版本递增。" -ForegroundColor Cyan git commit -a -m "+semver: minor [skip azurepipelines]" --allow-empty } elseif ($PRdesc -match '(\[x\] \b重大变更(Major Change)\b)') { Write-Host "添加Git空提交消息,标记此分支为SemVer的'major'版本递增。" -ForegroundColor Cyan git commit -a -m "+semver: major [skip azurepipelines]" --allow-empty } else { Write-Host "##vso[task.LogIssue type=error;]请在拉取请求描述中选择变更类型,然后重新触发验证流水线。" -ForegroundColor Cyan $PRdesc exit 1 } Write-Host "执行Git push操作.." -ForegroundColor Cyan git push -f --set-upstream origin "$(System.PullRequest.SourceBranch)".replace('refs/heads/', '') Write-Host "完成。" -ForegroundColor Cyan # 确定语义化版本 - task: gitversion/execute@0 displayName: 确定SemVer版本 inputs: useConfigFile: True configFilePath: ".azuredevops/gitversion.yml" updateAssemblyInfo: true
GitVersion.yml配置文件
next-version: 1.0 assembly-versioning-scheme: MajorMinorPatch assembly-file-versioning-scheme: MajorMinorPatchTag assembly-informational-format: '{InformationalVersion}' mode: ContinuousDeployment increment: Inherit continuous-delivery-fallback-tag: ci tag-prefix: '[vV]' 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 commit-message-incrementing: Enabled commit-date-format: 'yyyy-MM-dd' # ignore: # sha: [] # commits-before: yyyy-MM-ddTHH:mm:ss merge-message-formats: {} branches: main: regex: ^main$ mode: ContinuousDelivery tag: '' increment: Patch prevent-increment-of-merged-branch-version: true track-merge-target: false tracks-release-branches: false is-release-branch: false feature: regex: ^feature?[/-] mode: ContinuousDeployment tag: useBranchName increment: Inherit prevent-increment-of-merged-branch-version: false track-merge-target: false tracks-release-branches: true is-release-branch: false hotfix: regex: ^hotfix(es)?[/-]|^bugfix(es)?[/-]|^fix?[/-] mode: ContinuousDelivery tag: patch increment: Patch prevent-increment-of-merged-branch-version: false track-merge-target: false tracks-release-branches: false is-release-branch: false develop: regex: ^dev$ mode: ContinuousDeployment prevent-increment-of-merged-branch-version: false track-merge-target: false tracks-release-branches: false is-release-branch: true pre-release-weight: 1000
预期流程

当前实际流程

解决方案
要让GitVersion基于dev分支的最新版本递增,需调整GitVersion.yml的分支配置:
- 修改分支跟踪配置
将feature和dev分支的track-merge-target属性设置为true,让GitVersion在计算版本时,以dev分支作为feature分支的合并基准。
修改后的分支配置片段:
branches: main: regex: ^main$ mode: ContinuousDelivery tag: '' increment: Patch prevent-increment-of-merged-branch-version: true track-merge-target: false tracks-release-branches: false is-release-branch: false feature: regex: ^feature?[/-] mode: ContinuousDeployment tag: useBranchName increment: Inherit prevent-increment-of-merged-branch-version: false track-merge-target: true # 改为true tracks-release-branches: true is-release-branch: false hotfix: regex: ^hotfix(es)?[/-]|^bugfix(es)?[/-]|^fix?[/-] mode: ContinuousDelivery tag: patch increment: Patch prevent-increment-of-merged-branch-version: false track-merge-target: false tracks-release-branches: false is-release-branch: false develop: regex: ^dev$ mode: ContinuousDeployment prevent-increment-of-merged-branch-version: false track-merge-target: true # 改为true tracks-release-branches: false is-release-branch: true pre-release-weight: 1000
- 确保流水线拉取最新dev分支代码
在流水线的PowerShell步骤开头添加拉取操作,确保本地仓库包含dev分支的最新提交:
Write-Host "拉取dev分支最新代码..." -ForegroundColor Cyan git fetch origin dev
调整后,合并feature/*到dev时,GitVersion会以dev分支的最新版本为基准,根据PR选择的变更类型进行版本递增。
内容的提问来源于stack exchange,提问作者13bloc
相关产品推荐
相关产品推荐

