mono-repo 中 PR 的 Azure DevOps Pipeline 结构
Azure DevOps Pipeline structure for PRs in mono-repo
我有一个包含多个子项目的单一仓库(Node/TypeScript 如果重要的话)。我正在尝试在 Azure DevOps 中设置我认为相对简单的拉取请求设置,旨在部署 PR 环境进行测试。它由 2 个管道组成,我想在 PR 中一个接一个地触发它们。如果任何一个失败,PR 也应该失败。代码托管在 Azure DevOps Git.
以下是我要实现的步骤:
- 使用标签
solution-a
创建 PR,用于从 features/feature-x
合并到 dev
分支
- 分支策略根据标签
solution-a
触发 solution-a-pipeline
。如果标签不同,则应触发不同的管道。
solution-a-pipeline
在 features/feature-x
分支* 的上下文中按顺序触发 infrastructure-pipeline
和 solution-a-build-pipeline
。
- 如果
solution-a-pipeline
成功完成(间接意味着 infrastructure-pipeline
和 solution-a-build-pipeline
也按顺序成功完成)则认为构建成功。否则失败,无法完成PR。
*"in context" 我的意思是用于每个管道的实际 yaml 文件是来自功能分支的文件。这是因为我希望它测试对管道的任何更改以及管道中的任何步骤。
有办法实现吗?几天来我一直在尝试使用管道文件、模板、资源和触发器的不同组合,但我似乎无法理解它。
Azure DevOps Pipeline structure for PRs in mono-repo
我能理解你的要求,但是 AFAI for Azure devops,我不相信目前有这样的方法可以满足你的需求。
这里有三个挑战:
我们无法将标签添加到 Pull Request,您可以查看 this thread 了解详情。
我们无法根据标签触发不同的构建管道。选项构建验证没有这样的条件。
我们无法设置构建验证的顺序。我们可以在构建验证中设置多个构建管道,但我们无法设置它们的顺序。如果我们添加构建验证并使用构建完成来设置构建顺序,但是构建验证只会验证我们添加的构建管道的结果,而不是其他关联管道的结果
综上所述,目前我不相信有这样的方法可以实现你的需求。
希望对您有所帮助。
我已经设法解决了这个问题。它涉及几个步骤和一些硬编码,但我现在能够使用某些已定义的标签来标记拉取请求,并因此仅触发相关部分的构建验证 pipeline
运行。
我的设置包含一个大 pr-pipeline.yml
文件,该文件由我的 dev
分支的 PR 构建验证触发。触发器是手动的,但它是必需的,它允许发布 PR 的人在它开始之前对其进行相应的标记。
一旦管道 运行s 第一步使用 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
除组织名称外,每个必需的参数都由管道的 predefined variables 提供。
为了调用端点,我使用了 Azure DevOps 在预定义变量 System.AccessToken
中提供给代理的个人访问令牌 (PAT) 和一个小的 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-a
和 solution-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 之外的每个 运行 上手动启动每个管道。
我有一个包含多个子项目的单一仓库(Node/TypeScript 如果重要的话)。我正在尝试在 Azure DevOps 中设置我认为相对简单的拉取请求设置,旨在部署 PR 环境进行测试。它由 2 个管道组成,我想在 PR 中一个接一个地触发它们。如果任何一个失败,PR 也应该失败。代码托管在 Azure DevOps Git.
以下是我要实现的步骤:
- 使用标签
solution-a
创建 PR,用于从features/feature-x
合并到dev
分支 - 分支策略根据标签
solution-a
触发solution-a-pipeline
。如果标签不同,则应触发不同的管道。 solution-a-pipeline
在features/feature-x
分支* 的上下文中按顺序触发infrastructure-pipeline
和solution-a-build-pipeline
。- 如果
solution-a-pipeline
成功完成(间接意味着infrastructure-pipeline
和solution-a-build-pipeline
也按顺序成功完成)则认为构建成功。否则失败,无法完成PR。
*"in context" 我的意思是用于每个管道的实际 yaml 文件是来自功能分支的文件。这是因为我希望它测试对管道的任何更改以及管道中的任何步骤。
有办法实现吗?几天来我一直在尝试使用管道文件、模板、资源和触发器的不同组合,但我似乎无法理解它。
Azure DevOps Pipeline structure for PRs in mono-repo
我能理解你的要求,但是 AFAI for Azure devops,我不相信目前有这样的方法可以满足你的需求。
这里有三个挑战:
我们无法将标签添加到 Pull Request,您可以查看 this thread 了解详情。
我们无法根据标签触发不同的构建管道。选项构建验证没有这样的条件。
我们无法设置构建验证的顺序。我们可以在构建验证中设置多个构建管道,但我们无法设置它们的顺序。如果我们添加构建验证并使用构建完成来设置构建顺序,但是构建验证只会验证我们添加的构建管道的结果,而不是其他关联管道的结果
综上所述,目前我不相信有这样的方法可以实现你的需求。
希望对您有所帮助。
我已经设法解决了这个问题。它涉及几个步骤和一些硬编码,但我现在能够使用某些已定义的标签来标记拉取请求,并因此仅触发相关部分的构建验证 pipeline
运行。
我的设置包含一个大 pr-pipeline.yml
文件,该文件由我的 dev
分支的 PR 构建验证触发。触发器是手动的,但它是必需的,它允许发布 PR 的人在它开始之前对其进行相应的标记。
一旦管道 运行s 第一步使用 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
除组织名称外,每个必需的参数都由管道的 predefined variables 提供。
为了调用端点,我使用了 Azure DevOps 在预定义变量 System.AccessToken
中提供给代理的个人访问令牌 (PAT) 和一个小的 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-a
和 solution-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 之外的每个 运行 上手动启动每个管道。