首页 > 解决方案 > 根据对子文件夹的更改触发 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 文件?

我希望这是有道理的!

标签: gitazure-devopsazure-pipelines

解决方案


你可以像下面这样

  1. 使用值为“False”的微服务创建变量

例如,MicroserviceAUpdated=“假”,MicroserviceBUpdated=“假”等,

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

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

  • 如果MicroserviceAUpdated只有任何文件在 SubFolderA.
  • 如果MicroserviceBUpdated只有任何
    文件在SubFolderA.

很快....

  1. 为每个微服务创建单独的构建任务,配置构建任务以使用自定义条件运行,如下所示

对于微服务一个构建任务

“自定义条件”: 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"
    }
}

推荐阅读