VSTS关联包构建配置求助:接口包与DTO包的触发及版本依赖设置
我来帮你梳理几个基于Azure DevOps原生功能的优雅解决方案,完全不用靠文件读写来传递版本号:
方案1:单构建定义+多阶段作业(推荐)
把两个项目的构建整合到同一个定义里,用作业依赖和路径过滤器实现按需构建,同时天然解决版本传递问题:
拆分构建作业
在构建定义中新增两个独立作业:Build Interfaces:负责构建、打包、推送Interfaces包Build Dto:负责构建、打包、推送Dto包
配置路径触发器
给每个作业设置路径过滤器(在作业的「触发器」选项卡中):Build Interfaces:仅包含/Interfaces/**,只有当Interfaces文件夹内容变更时才运行此作业Build Dto:包含/Interfaces/**和/Dto/**,当任意一个文件夹变更时运行此作业
设置作业依赖
在Build Dto的「依赖」选项卡中,添加依赖Build Interfaces,确保Dto构建前Interfaces已经完成(即使本次构建是因Dto单独变更触发,也会先确认最新的Interfaces构建状态)传递Interfaces版本号
在Build Interfaces的NuGet打包任务之后,添加一个「设置变量」任务,配置:- 变量名:
InterfacesVersion - 值:
$(Build.BuildNumber) - 勾选「将此变量标记为输出变量」
然后在
Build Dto的NuGet打包任务或nuspec模板中,直接引用这个输出变量作为依赖版本:<dependency id="Interfaces" version="$(Dependencies.Build_Interfaces.Outputs['InterfacesVersion'])" />(注意:
Build_Interfaces是你给作业取的名称,空格会被替换为下划线)- 变量名:
方案2:多构建定义+构建触发+REST API获取版本
如果坚持要分开两个构建定义,可以通过构建触发和Azure DevOps API来自动获取最新的Interfaces版本:
配置构建触发关系
在Dto的构建定义中,添加「构建完成」触发器:- 选择Interfaces的构建定义
- 设置触发条件为「仅当构建成功时」
在Dto构建中获取最新Interfaces版本
添加一个PowerShell任务,调用Azure DevOps REST API获取最新成功的Interfaces构建号,并存为变量:$url = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/build/builds?definitions=【替换为Interfaces构建定义ID】&statusFilter=completed&resultFilter=succeeded&top=1&api-version=7.1-preview.7" $response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} $interfacesVersion = $response.value[0].buildNumber Write-Host "##vso[task.setvariable variable=InterfacesVersion;]$interfacesVersion"之后在Dto的打包任务中,用
$(InterfacesVersion)作为依赖版本即可。
方案3:变量组+自动更新版本(最灵活)
通过变量组统一管理包版本,构建完成后自动更新变量,适用于更复杂的多包依赖场景:
创建变量组
在Azure DevOps的「库」→「变量组」中,新建一个PackageVersions组,添加InterfacesVersion变量,初始值设为你当前的版本(比如0.4.0)在Interfaces构建中更新变量
添加PowerShell任务,在推送包之后,调用API更新变量组中的InterfacesVersion为当前构建号:$groupId = "【替换为变量组ID】" $url = "$(System.TeamFoundationCollectionUri)$(System.TeamProject)/_apis/distributedtask/variablegroups/$groupId?api-version=7.1-preview.2" $body = @{ variables = @{ InterfacesVersion = @{ value = "$(Build.BuildNumber)" } } } | ConvertTo-Json Invoke-RestMethod -Uri $url -Method Put -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Body $body -ContentType "application/json"在Dto构建中引用变量组
在Dto的构建定义中,添加对PackageVersions变量组的引用,之后直接在nuspec或打包任务中用$(InterfacesVersion)作为依赖版本即可。
这几个方案都能完美适配你当前的版本生成规则($(versionFromFile).$(Rev:rr)),按需构建的同时自动处理版本依赖,比文件读写的方式更稳定可靠。
内容的提问来源于stack exchange,提问作者oleksa

