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

Azure DevOps CI Pipeline - How to dynamically checkout branches?

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

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

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

我已阅读; https://docs.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/*

只是想看看是否有可能并排获得项目。

引发错误:

The pipeline is not valid. Could not get the latest source version for repository repo-a hosted on Azure Repos using ref refs/heads/dev/a/. Could not get the latest source version for repository repo-b hosted on Azure Repos using ref refs/heads/dev/a/.

我也尝试了上面没有通配符的方法,没有快乐。另一点是我不想检查所有分支,只检查推送的分支。

这当然是可能的...

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

例如:

- checkout: git://proj/repo-a@$(Build.SourceBranchName)

由于你引用了两个repo,你还需要添加一个If表达式来判断哪个repo触发构建,并使用目标repo分支名称。

您可以使用变量: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)

或者你可以使用条件。

例如:

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

这是关于 expression and condition 的文档。