我的monorepo是这样的结构,其中子目录要么是"microservices“,要么是资源:
/app
/admin
/admin-v2
/api
/api-v2
/client
/k8s
/postgres
/scripts
azure-pipelines.yaml
skaffold.yaml我确实有一部份的谜题。我知道以下命令将告诉我哪些"microservices“受到了与此PR相关的提交的影响:
$ git diff --name-only $COMMIT_ID | awk -F'/' 'NF!=1{print $1}' | sort -u
admin-v2
api-v2
client
postgres我知道在我的管道中的每一个阶段都将对应于其中的一个“微服务”,我需要在每个阶段中使用前面的命令来查看这个阶段是否在那里。如果是的话,它需要运行。如果没有,这个舞台就可以被忽略。
我的最终目标是让开发人员与他们短暂的分支进行远程连接,打开一个PR以合并到主干中,当PR打开时,它会触发CI管道来构建"microservice“、运行单元和集成测试,只在它们的PR中的"microservices”上运行,而不是每次都重建所有的东西。
想要在一个azure-pipelines.yaml上完成它。另一种方法是在每个子目录中设置一个子目录,并为每个子目录设置单独的管道,这可能会带来麻烦。
关于如何实施这一点的建议?
发布于 2021-03-01 07:41:06
不需要重新构建、测试、重新部署管道中的所有服务的PR触发器。
PR触发器与Azure Repos Git中的CI触发器不同。因为:
在Azure Repos Git中,此功能是使用分支策略实现的。要在Azure Git Repos中启用拉请求验证,请导航到所需分支的分支策略,并为该分支配置构建验证策略。有关更多信息,请参见配置分支策略。
因此,Azure DevOps仍然不支持YAML中的PR触发器,我们不能将该条件直接用于构建、测试和部署,例如:
condition: contains(variables['Build.SourceBranch'], 'refs/heads/staging')我们必须在构建、测试、部署中添加powershell任务,以确定哪些“微服务”受到与PR关联的提交的影响,例如:
$editedFiles = git diff HEAD HEAD~ --name-only
echo "$($editedFiles.Length) files modified:"
$editedFiles | ForEach-Object {
echo $_
Switch -Wildcard ($_ ) {
'app/admin-v2/*' {
# If the admin-v2 is updated, we need to generate the variable Enable_Admin-v2
Write-Output "##vso[task.setvariable variable=Enable_Admin-v2]True"
}
'app/api-v2/*' { Write-Output "##vso[task.setvariable variable=api-v2]True" }
# The rest of your path filters
}
}此脚本设置变量,然后在构建、测试、部署管道的下一步的自定义条件中引用这些变量:
and(succeeded(), eq(variables['Enable_Admin-v2'], 'True'))https://stackoverflow.com/questions/66414540
复制相似问题