gpt4 book ai didi

git - 根据对子文件夹的更改触发 Azure DevOps 构建

转载 作者:IT王子 更新时间:2023-10-29 00:52:14 25 4
gpt4 key购买 nike

我有一个包含多个项目的 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 文件的构建实例?

我希望这是有道理的!

最佳答案

你可以像下面那样做

  1. 根据您的微服务创建值为“False”的变量

例如,MicroserviceAUpdated= "False",MicroserviceBUpdated= "False"等,

  1. 在构建定义的开头添加一个 Powershell 脚本任务。powershell 脚本将执行以下操作:

获取构建中的变更集/提交以检查更改了哪些文件。

  • MicroserviceAUpdated 变量更新为“true”(如果只有)SubFolderA 下的文件已更改。
  • MicroserviceBUpdated 变量更新为“true”(如果有的话)
    SubFolderA 下的文件已更改。

等等....

  1. 为每个微服务创建单独的构建任务,将构建任务配置为在如下自定义条件下运行

对于微服务A构建任务

“自定义条件”: and(succeeded(), eq(variables['MicroserviceAUpdated'], 'True'))

对于微服务B构建任务

“自定义条件”: and(succeeded(), eq(variables['MicroserviceBUpdated'], 'True'))

等等...

这样,如果变量的值为 False,MicoserviceTask 将被跳过

对于第 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"
}
}

关于git - 根据对子文件夹的更改触发 Azure DevOps 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53227343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com