Git PR触发器,无需在monorepo中重建、测试、重新部署管道中的所有服务
我的monorepo是这样的结构,其中子目录是“微服务”或资源:Git PR触发器,无需在monorepo中重建、测试、重新部署管道中的所有服务,git,azure,azure-devops,azure-pipelines,Git,Azure,Azure Devops,Azure Pipelines,我的monorepo是这样的结构,其中子目录是“微服务”或资源: /app /admin /admin-v2 /api /api-v2 /client /k8s /postgres /scripts azure-pipelines.yaml skaffold.yaml 我确实有一个难题。我知道以下命令将告诉我哪些“微服务”受到与此PR关联的提交的影响: $ git diff --name-only $COMMIT_ID | awk -F'/' 'NF!=
/app
/admin
/admin-v2
/api
/api-v2
/client
/k8s
/postgres
/scripts
azure-pipelines.yaml
skaffold.yaml
我确实有一个难题。我知道以下命令将告诉我哪些“微服务”受到与此PR关联的提交的影响:
$ git diff --name-only $COMMIT_ID | awk -F'/' 'NF!=1{print $1}' | sort -u
admin-v2
api-v2
client
postgres
我知道管道中的每个阶段都将对应于这些“微服务”中的一个,我需要在每个阶段中使用前面的命令来查看该阶段是否在其中。如果是,则需要运行它。如果没有,则可以忽略该阶段
我的最终目标是让开发人员使用他们短暂的分支推到远程,打开一个PR合并到主干中,当PR打开时,它触发CI管道来构建“微服务”,运行单元和集成测试,只在PR中的“微服务”上运行,而不是每次都重建所有内容
希望从一个azure pipelines.yaml中执行此操作。另一种选择是在每个子目录中都有一个,每个子目录都有单独的管道,这可能会很麻烦
如何实施的建议
PR触发器,无需在monorepo中重建、测试、重新部署管道中的所有服务
PR触发器与Azure Repos Git中的CI触发器不同。这是因为:
在Azure Repos Git中,此功能是使用分支实现的
政策。要在Azure Git Repos中启用拉请求验证,
导航到所需分支的分支策略,然后配置
那家分店的老板。有关详细信息,请参阅
因此,我们无法直接将该条件用于构建、测试和部署,例如:
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'))