1

我有一个包含多个子项目(如果重要的话是 Node/TypeScript)的 mono-repo。我正在尝试在 Azure DevOps 中设置我认为相对简单的拉取请求设置,旨在部署 PR 环境进行测试。它由 2 个管道组成,我想在 PR 中一个接一个地触发它们。如果其中任何一个失败,PR 也应该失败。代码托管在 Azure DevOps Git 中。

以下是我试图实现的步骤:

  1. PR 是用标签创建的,solution-a用于从分支合并features/feature-xdev分支
  2. 分支策略solution-a-pipeline基于标签触发solution-a。如果标签不同,则应触发不同的管道。
  3. solution-a-pipeline按顺序触发infrastructure-pipeline并在分支* 的solution-a-build-pipeline上下文中。features/feature-x
  4. 如果solution-a-pipeline成功完成(间接这意味着infrastructure-pipeline并且solution-a-build-pipeline也按顺序成功完成),则认为 bulid 成功。否则失败,无法完成 PR。

*“在上下文中”是指用于每个管道的实际 yaml 文件是来自功能分支的文件。这是因为我希望它测试对管道的任何更改以及管道中的任何步骤。

有没有办法做到这一点?几天来,我一直在尝试使用管道文件、模板、资源和触发器的不同组合,但我似乎无法理解它。

4

2 回答 2

2

我已经设法解决了这个问题。它涉及几个步骤和一些硬编码,但我现在能够使用某些定义的标签标记拉取请求,并触发构建验证pipeline,结果只运行相关部分。

我的设置由一个大pr-pipeline.yml文件组成,该文件由 PR 的构建验证触发到我的dev分支。触发器是手动的,但需要它允许发布 PR 的人在它开始之前相应地标记它。

管道运行后,第一步使用 Azure DevOps REST API 通过调用此端点来确定关联 PR 上存在哪些标签:

https://dev.azure.com/$(organizationName)/$(System.TeamProjectId)/_apis/git/repositories/$(Build.Repository.ID)/pullRequests/$(System.PullRequest.PullRequestId)/labels?api-version=5.1-preview.1

除组织名称外,所需的每个参数都由管道的预定义变量提供。

要调用端点,我使用 Azure DevOps 在预定义变量中提供给代理的个人访问令牌 (PAT)System.AccessToken和一个小型 PowerShell 脚本:

$accessToken = "$(System.AccessToken)"
$basicAuth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$accessToken"))
$headers = @{Authorization = "Basic $basicAuth"}
$url = $(url)
$data = Invoke-WebRequest -Method Get -Uri $url -Headers $headers
Write-Host "##vso[task.setvariable variable=prlabels]$data"

一旦我有了我的标签,我就会使用一个小的 PowerShell 片段将它们中的每一个提取为一个单独的变量。该prlabels变量由以下内容填充:

$tagsJson = '$(prlabels)' | ConvertFrom-Json
$tags = $tagsJson.value | ForEach-Object { $_.name }
Write-Host "Tags: $($tags -join ";")"
$tags | ForEach-Object { Write-Host "##vso[task.setvariable variable=prlabel_$_;isOutput=true]true" }

如果我的 pr 被标记,solution-asolution-c将导致定义以下输出变量:

prlabel_solution-a = true
prlabel_solution-c = true

最后,我可以使用这些输出变量作为触发相关作业的条件,这些作业执行相应解决方案的实际构建和部署。获取标签的作业被命名PreReq,输出单个变量的任务被命名prlabels

- job: DeploySolutionA
  dependsOn: PreReq
  condition: and(succeeded(), eq(dependencies.PreReq.outputs['prlabels.prlabel_solution-a'], 'true'))
  # ...

所有这一切使我能够根据用户定义在 PR 中部署一个或多个特定的解决方案。它仍然需要用户知道这些标签,但至少他们不必在 PR 之外的每次运行时手动启动每个管道。

于 2020-04-28T09:22:49.953 回答
0

单一存储库中 PR 的 Azure DevOps 管道结构

我可以理解您的要求,但是对于 Azure devops 的 AFAI,我认为目前没有这样的方法可以满足您的需求。

这里有三个挑战:

  1. 我们无法向拉取请求添加标签,您可以查看此线程以获取详细信息。

  2. 我们无法根据标签触发不同的构建管道。选项构建验证没有这样的条件。

  3. 我们无法设置构建验证的顺序。我们可以在构建验证中设置多个构建管道,但我们无法设置它们的顺序。如果我们添加一个构建验证并使用构建完成来设置构建顺序,但是构建验证只会验证我们添加的构建管道的结果,而不是其他关联管道的结果

总而言之,我不相信目前有这样一种方法可以满足您的需求。

希望这可以帮助。

于 2020-04-28T07:06:18.783 回答