如何在多个存储库之间共享Azure DevOps管道?

3

所以,我有以下情况:

  • 20个git仓库,每个仓库都有一个微服务
  • 一个带有标准构建流程模板的仓库
  • 这20个仓库中的每一个都定义了自己的流水线,使用该模板和一些参数
  • 对于这20个仓库中的任何一个进行PR构建时,它将作为构建验证运行自己的流水线。

一切都正常工作。

但是现在,我想在这20个仓库中的每一个中添加一个额外的可选检查,该检查将作为PR的一部分运行代码分析工具(例如sonarqube)。

我不想将其添加到主要的流水线中,因为我希望它作为一个单独的可选检查出现在PR中,可以跳过或在可选/必需之间切换。

我唯一找到的实现方法是在这20个仓库中的每一个中添加一个CodeAnalysis.yml,并创建20个相关的流水线,这是我不愿意处理的额外负担。

是否有一种方式可以有一个单一的流水线,在所有这些仓库中作为可选检查引用? 根据文档,应该可以通过类似以下方式动态从正确的仓库获取代码来实现共享流水线:

- checkout: git://ProjectName/$(Build.Repository.Name)@$(Build.SourceBranch)

但是当我尝试这样做时,拉取请求无法排队流水线(不幸的是,它没有给出原因)。

这个问题有解决方案吗?

2个回答

2

您需要使用模板来设计共享模板以运行代码扫描。本质上,模板是可重复使用的yaml文件,您可以传递参数以自定义选项。

例如,对于您的用例,您可以拥有用于代码扫描的模板,并将现有作业添加到您的流水线中以扩展此模板,传递任何您需要的可选参数(例如要检查的存储库),并且您可以添加条件以决定何时运行代码扫描检查。


但这是否意味着,如果将其构建到每个存储库的主要管道中,它就无法作为单独的可选检查出现在PR中?或者您是否可以以某种方式将管道中的一个作业注册为PR中的检查? - gallivantor
将其构建到管道中只是一种建议,因为我认为这样做比维护额外的独立管道更容易。如果它在主要管道中,则可以编写条件代码来运行它(例如,自定义代码仅在提交消息包含某些文本时才运行)。或者,如果您想要运行其他管道,可以使用此模板作为基础。但是,据我所知,在PR中没有添加此作为单独可选检查的方法,因此您必须手动触发它(这就是为什么我建议有条件地将其放在管道中的原因)。 - DavidCox88

0

我知道你的意思,这是不可能的(至少在PR界面中不可能)。因为当你在PR构建部分按下“队列”按钮时,甚至不会弹出选择参数的弹窗,它只会选择默认值。

- checkout: git://ProjectName/$(Build.Repository.Name)@$(Build.SourceBranch)

这也是不可能的,因为运行时变量在此处不被接受,它们将直接读取为字符串类型。

一个建议是您可以在管道页面手动指定参数,然后设置参数后运行管道

原因是:

1、检出部分在管道运行之前就已经展开了。

2、PR页面上的队列按钮没有提供弹出窗口来选择参数。

您的管道定义应该像这样:

trigger:
- none

parameters:
  - name: ProjectName
    default: xxx
  - name: RepoName
    default: xxx
  - name: BranchName
    default: xxx

pool:
  vmImage: windows-latest
steps:

- checkout: git://${{parameters.ProjectName}}/${{parameters.RepoName}}@${{parameters.BranchName}}
- script: |
    dir
  displayName: 'Run a multi-line script'

每次手动选择参数:

enter image description here


1
有趣的想法。但这意味着您必须手动运行管道,并且无法将其集成为PR中的可选检查? - gallivantor
@gallivantor 是的,这就是它的设计方式。在弹出窗口功能推出之前,这可以作为你的临时解决方案。 - Bowman Zhu-MSFT
你能重新表达一下“这也是不可能的,因为运行时变量在这里是不被接受的,它们将直接被读取为字符串类型。”吗?很抱歉我不明白它的意思。为什么$(Build.Repository.Name)不能展开为触发构建的存储库(即PR所指向的存储库)? - F-H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接