Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git PR触发器,无需在monorepo中重建、测试、重新部署管道中的所有服务_Git_Azure_Azure Devops_Azure Pipelines - Fatal编程技术网

Git PR触发器,无需在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!=

我的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!=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'))