Azure DevOps CI Pipeline - 如何动态签出分支?

fps*_*dfm 2 continuous-integration automation azure-devops azure-pipelines

设置:
我有一个数据库存储库和一个用于测试数据库存储库的单元测试存储库,这两个存储库共享 Azure DevOps 中的一个项目。我有一个 CI 管道,驻留在数据库项目中,在推送到远程跟踪分支时触发。当该目录中的任何分支被推送到时,触发器将运行 CI。

问题:
我还需要检查单元测试项目,以便我可以调用它。在创建任务等之前,我们不会知道主题分支的名称,如何动态捕获?

因此,工程师可以在 CI 支持的情况下在多个分支上工作,而不必担心在紧急情况下进行整理。

我读过这篇文章;https://learn.microsoft.com/en-us/azure/devops/pipelines/repos/multi-repo-checkout?view=azure-devops#repository-details

我试过:

trigger:
- dev/a/*

steps:

- checkout: git://proj/repo-a@dev/a/*
- checkout: git://proj/repo-b@dev/a/*
Run Code Online (Sandbox Code Playgroud)

只是想看看是否有可能同时进行项目。

它会引发错误:

管道无效。无法使用 ref refs/heads/dev/a/ 获取 Azure Repos 上托管的存储库 repo-a 的最新源版本。无法使用 ref refs/heads/dev/a/ 获取 Azure Repos 上托管的存储库 repo-b 的最新源版本

我也尝试了上面没有通配符的方法,没有乐趣。另一点是我不想签出所有分支,而只想签出带有推送的分支。

当然这是可能的......

Kev*_*SFT 5

要动态签出分支,您可以使用预定义变量:Build.SourceBranchName

例如:

- checkout: git://proj/repo-a@$(Build.SourceBranchName)
Run Code Online (Sandbox Code Playgroud)

由于引用了两个存储库,因此还需要添加 If 表达式来确定哪个存储库触发构建并使用目标存储库分支名称。

您可以使用该变量:Build.Repository.Name

这是一个例子:

steps:
- ${{ if eq(variables['BUILD.REPOSITORY.NAME'], 'repo-a') }}:
  - checkout: git://proj/repo-a@$(Build.SourceBranchName)
- ${{ if eq(variables['BUILD.REPOSITORY.NAME'], 'repo-b') }}:
  - checkout: git://proj/repo-b@$(Build.SourceBranchName)
Run Code Online (Sandbox Code Playgroud)

或者你可以使用条件。

例如:

- checkout: git://proj/repo-a@$(Build.SourceBranchName)
  condition: eq(variables['BUILD.REPOSITORY.NAME'], 'repo-a')
- checkout: git://proj/repo-b@$(Build.SourceBranchName)
  condition: eq(variables['BUILD.REPOSITORY.NAME'], 'repo-b')
Run Code Online (Sandbox Code Playgroud)

这是有关表达式条件的文档。