git - 根据对子文件夹的更改触发 Azure DevOps 构建
问题描述
我有一个包含多个项目的 Visual Studio 解决方案,每个项目都是一个单独的微服务。对于开发团队来说,将所有服务都放在同一个解决方案和 git repo 中非常方便,因为服务可以相互调用。
Master.sln - SubFolderA - MicroserviceA.sln
- SubFolderB - MicroserviceB.sln
- SubFolderC - MicroserviceC.sln
但是,我希望在 Azure DevOps 中独立构建/发布单个微服务,因此如果 ServiceA 是唯一要更改的服务,那么 ServiceA 是唯一构建和部署的服务。
为此,我创建了一个新的构建管道定义,其中设置了“路径过滤器”以在微服务文件夹的内容更改时触发构建(因此每个微服务添加一个路径过滤器以进行监控)。
我的问题是,当触发构建时(例如基于对 SubFolderA 的更改),我无法告诉构建定义仅在 SubFolderA 中构建 .sln 文件。
我可以为每个微服务创建一个单独的构建定义,并在单独的子文件夹上触发每个构建,但这会产生很大的开销,即我需要维护 15 个单独的构建定义(对于我构建的每个分支也一样),以及所需的存储在我们的自主机构建代理上,现在将是 NumberOfService x NumberOfBranchesBeingBuild x SizeOfRepo。
有没有办法使用带有 git“路径过滤器”和定义的多个路径的单个构建定义,这反过来会启动多个构建实例并将触发构建的路径的值提供给构建定义,从而告诉构建实例要构建哪个 .sln 文件?
我希望这是有道理的!
解决方案
你可以像下面这样
- 使用值为“False”的微服务创建变量
例如,MicroserviceAUpdated
=“假”,MicroserviceBUpdated
=“假”等,
- 在构建定义的开头添加一个 Powershell 脚本任务。powershell 脚本将执行以下操作:
获取构建中的变更集/提交以检查哪些文件已更改。
- 如果
MicroserviceAUpdated
只有任何文件在SubFolderA
. - 如果
MicroserviceBUpdated
只有任何
文件在SubFolderA
.
很快....
- 为每个微服务创建单独的构建任务,配置构建任务以使用自定义条件运行,如下所示
对于微服务一个构建任务
“自定义条件”:
and(succeeded(), eq(variables['MicroserviceAUpdated'], 'True'))
对于 MicroserviceB 构建任务
“自定义条件”:
and(succeeded(), eq(variables['MicroserviceBUpdated'], 'True'))
很快...
这样,如果变量的值为False
对于第 2 步
$files=$(git diff HEAD HEAD~ --name-only)
$temp=$files -split ' '
$count=$temp.Length
echo "Total changed $count files"
For ($i=0; $i -lt $temp.Length; $i++)
{
$name=$temp[$i]
echo "this is $name file"
if ($name -like "SubFolderA/*")
{
Write-Host "##vso[task.setvariable variable=MicroserviceAUpdated]True"
}
}
推荐阅读
- angular - 作为胖箭头方法的已定义提供程序可以调用另一个提供的胖箭头方法吗?
- flutter - 由滑块控制的照片褪色会产生错误
- tensorflow - 使用 Tensorflow 内置数据集库在 CoLab 中访问 CheXpert 数据集
- python-3.x - 基于函数的视图为表单返回多个值 kwargs
- c# - 如何使用 AES 加密文本文件以外的文件?PDF、Word 等
- api - REST 基础架构设计所需的建议
- grafana - Grafana,涌入数据库
- database - 从图片中绘制 R-tree
- android - 使用颤振飞镖和 api 的测验应用程序,找不到正确的提供者
- flask - 带有自动提交按钮的烧瓶中的相互依赖下拉列表