代码之家  ›  专栏  ›  技术社区  ›  strumpy_strudel

PR触发,无需在monorepo中重建、测试、重新部署管道中的所有服务

  •  0
  • strumpy_strudel  · 技术社区  · 3 年前

    我的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 另一种选择是在每个子目录中都有一个,并为每个子目录设置单独的管道,这可能会很麻烦。

    如何实施这一点的建议?

    0 回复  |  直到 3 年前
        1
  •  1
  •   Leo Liu    3 年前

    PR触发,无需在monorepo中重建、测试、重新部署管道中的所有服务

    PR触发器与Azure Repos Git中的CI触发器不同。这是因为:

    在Azure Repos Git中,此功能是使用分支实现的 政策。为了在Azure Git Repos中启用拉取请求验证, 导航到所需分支的分支策略,并配置 这个 Build validation policy 对于这个分支。有关更多信息,请参见 Configure branch policies .

    所以, PR triggers in YAML still not be supported on Azure DevOps ,我们不能直接使用该条件进行构建、测试、部署,如下所示:

    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'))