在管道中签出多个存储库

Azure DevOps Services | Azure DevOps Server 2020

Pipelines通常依赖于包含生成代码所需的源、工具、脚本或其他项的多个存储库。 通过使用管道中的多个 checkout 步骤,除了用于存储 YAML 管道的存储库外,还可以提取和签出其他存储库。

指定多个存储库

可以将存储库指定为 存储库资源,也可以与 checkout 步骤内联。

支持以下存储库类型。


  • Azure DevOps Server 2020 (仅限于同一组织中的存储库)
  • Azure DevOps Services

GitHub (github)

  • Azure DevOps Services

GitHubEnterprise (githubenterprise)

  • Azure DevOps Services

Bitbucket Cloud (bitbucket)

  • Azure DevOps Services

重要

在 2020 Azure DevOps Server Azure DevOps Server 中,仅支持在管道所在的组织中Azure Repos Git (git) 存储库。

注意

Azure Pipelines为 Azure Repos Git 存储库提供“限制作业范围”设置。 若要签出另一个项目中托管Azure Repos Git 存储库,必须将限制作业范围配置为允许访问。 有关详细信息,请参阅 限制作业授权范围

支持以下步骤组合 checkout


checkout 步骤

默认行为与第一步一 checkout: self 样,当前存储库已签出。


checkout: none

未同步或签出任何存储库。


checkout: self

当前存储库已签出。


checkout不是selfnone

指定的存储库已签出,而不是 self


多个 checkout 步骤

除非在步骤中checkout指定了其他path存储库,否则每个指定的存储库将签出到一个名为存储库的文件夹。 若要签出 self 为其中一个存储库,请使用 checkout: self 其中一 checkout 个步骤。


注意

签出 Azure Repos除包含管道的存储库以外的 Git 存储库时,系统可能会提示你在首次运行管道之前授权访问该资源。 有关详细信息,请参阅常见问题解答部分中的“首次尝试签出其他存储库”时,我首次提示授权资源的原因。

存储库资源定义

如果存储库类型需要服务连接或其他扩展资源字段,则必须使用 存储库资源 。 以下存储库类型需要服务连接。

存储库类型 服务连接
Bitbucket 云 Bitbucket 云
GitHub GitHub
GitHub Enterprise Server GitHub Enterprise Server
Azure Repos与管道不同的组织中的 Git 存储库 Azure Repos/Team Foundation Server

即使存储库类型不需要服务连接,也可以使用存储库资源,例如,如果已为其他存储库中的模板定义存储库资源。

在下面的示例中,三个存储库声明为存储库资源。 另一个组织、GitHubBitbucket 云存储库资源中的Azure Repos Git 存储库需要服务连接,这些连接指定为endpoint这些存储库资源。 此示例包含四 checkout 个步骤,其中签出声明为存储库资源的三个存储库以及包含管道 YAML 的当前 self 存储库。

resources:
  repositories:
  - repository: MyGitHubRepo # The name used to reference this repository in the checkout step
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
  - repository: MyBitbucketRepo
    type: bitbucket
    endpoint: MyBitbucketServiceConnection
    name: MyBitbucketOrgOrUser/MyBitbucketRepo
  - repository: MyAzureReposGitRepository # In a different organization
    endpoint: MyAzureReposGitServiceConnection
    type: git
    name: OtherProject/MyAzureReposGitRepo

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- checkout: self
- checkout: MyGitHubRepo
- checkout: MyBitbucketRepo
- checkout: MyAzureReposGitRepository

- script: dir $(Build.SourcesDirectory)

self如果存储库命名CurrentRepo,该script命令将生成以下输出: CurrentRepo MyAzureReposGitRepo MyBitbucketRepo MyGitHubRepo 在此示例中,存储库名称 (由存储库资源) 中的属性指定 name 用于文件夹,因为在签出步骤中未 path 指定任何名称。 有关存储库文件夹名称和位置的详细信息,请参阅以下 “签出路径 ”部分。

内联语法签出

如果存储库不需要服务连接,则可以使用 checkout 步骤内联声明它。

注意

只有同一组织中的 Azure Repos Git 存储库才能使用内联语法。 Azure Repos不同组织中的 Git 存储库,其他受支持的存储库类型需要服务连接,并且必须声明为存储库资源

steps:
- checkout: git://MyProject/MyRepo # Azure Repos Git repository in the same organization

注意

在前面的示例中, self 不会签出存储库。如果指定了任何 checkout 步骤,则必须包括 checkout: self 才能 self 签出。

签出路径

除非在步骤中checkout指定了源代码path,否则源代码将放置在默认目录中。 此目录因签出单个存储库还是多个存储库而异。

  • 单个存储库:如果作业中有一 checkout 个步骤,或者没有等效 checkout: self的签出步骤,则源代码将签出到名为 s 子文件夹的 (Agent.BuildDirectory)目录中。 C:\agent\_work\1如果是(Agent.BuildDirectory),则会签出C:\agent\_work\1\s代码。

  • 多个存储库:如果作业中有多个checkout步骤,源代码会签入以存储库命名为 in (Agent.BuildDirectory)子文件夹的s目录。 如果(Agent.BuildDirectory)C:\agent\_work\1命名tools存储库,并且code代码已签出并C:\agent\_work\1\s\codeC:\agent\_work\1\s\tools出。

    注意

    path如果未在步骤中checkout指定,则存储库的名称用于文件夹,而不是repository用于在步骤中checkout引用存储库的值。

如果为步骤指定了一个pathcheckout路径,则使用该路径相对于(Agent.BuildDirectory)该路径。

注意

如果使用默认路径,则添加第二个存储库 checkout 步骤将更改第一个存储库代码的默认路径。 例如,命名tools的存储库的代码将签出为toolsC:\agent\_work\1\s唯一的存储库,但如果添加了第二个存储库,tools则将签出到C:\agent\_work\1\s\tools该存储库。 如果你有任何依赖于源代码在原始位置的步骤,则必须更新这些步骤。

签出特定 ref

除非指定了特定的 ref,否则将签出默认分支。

如果使用内联语法,请通过追加 @<ref>来指定 ref。 例如:

- checkout: git://MyProject/MyRepo@features/tools # checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/heads/features/tools # also checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/tags/MyTag # checks out the commit referenced by MyTag.

使用存储库资源时,请使用属性 ref 指定 ref。 以下示例检查 features/tools/ 指定存储库的分支。

resources:
  repositories:
  - repository: MyGitHubRepo
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
    ref: features/tools

steps:
- checkout: MyGitHubRepo

触发器

将更新推送到 self 存储库或声明为资源的任何存储库时,可以触发管道。 例如,在以下方案中,这非常有用:

  • 使用来自其他存储库的工具或库。 每当更新工具或库时,你都希望为应用程序运行测试。
  • 将 YAML 文件与应用程序代码保存在单独的存储库中。 每次将更新推送到应用程序存储库时,都要触发管道。

重要

存储库资源触发器目前仅适用于同一组织中的 Azure Repos Git 存储库。 它们不适用于GitHub或 Bitbucket 存储库资源。

如果未在存储库资源中指定 trigger 节,则管道不会由该存储库的更改触发。 如果指定节 trigger ,则触发的行为类似于 CI 触发器对自存储库的工作方式。

如果为多个存储库资源指定节,则对其中任一 trigger 资源的更改将启动新的运行。

存储库的self触发器可以在 YAML 文件的根目录部分或存储库资源self中定义trigger。 例如,以下两个是等效的。

trigger:
- main

steps:
...
resources:
  repositories:
  - repository: self
    type: git
    name: MyProject/MyGitRepo
    trigger:
    - main

steps:
...

注意

为存储库定义两次触发器 self 是错误的。 请勿在 YAML 文件的根目录和节中 resources 定义它。

触发管道时,Azure Pipelines必须确定应使用的 YAML 文件版本,以及应签出的每个存储库的版本。如果对self存储库进行更改会触发管道,则触发管道的提交用于确定 YAML 文件的版本。 如果对任何其他存储库资源的更改触发管道,将使用存储库默认分支self中的最新版本 YAML。

当对某个存储库的更新触发管道时,会基于触发存储库设置以下变量:

  • Build.Repository.ID
  • Build.Repository.Name
  • Build.Repository.Provider
  • Build.Repository.Uri
  • Build.SourceBranch
  • Build.SourceBranchName
  • Build.SourceVersion
  • Build.SourceVersionMessage

对于触发存储库,触发管道的提交将确定签出的代码版本。对于其他存储库, ref 在该存储库资源的 YAML 中定义的确定已签出的默认版本。

请考虑以下示例,其中 self 存储库包含 YAML 文件和存储库 A ,并 B 包含其他源代码。

trigger:
- main
- feature

resources:
  repositories:
  - repository: A
    type: git
    name: MyProject/A
    ref: main
    trigger:
    - main

  - repository: B
    type: git
    name: MyProject/B
    ref: release
    trigger:
    - main
    - release

下表显示了使用上述 YAML 文件的管道为每个存储库签出哪些版本,除非在上述过程中 checkout显式重写该行为。

触发的管道 YAML 的版本 版本self 版本A 版本B
self 中的 main main 触发管道的提交 main 触发管道的提交 最新消息 main 最新消息 release
self 中的 feature feature 触发管道的提交 feature 触发管道的提交 最新消息 main 最新消息 release
A 中的 main 最新消息 main 最新消息 main main 触发管道的提交 最新消息 release
B 中的 main 最新消息 main 最新消息 main 最新消息 main main 触发管道的提交
B 中的 release 最新消息 main 最新消息 main 最新消息 main release 触发管道的提交

也可以在任何存储库中创建或更新拉取请求时触发管道。 为此,请将 YAML 文件中的存储库资源声明为上述示例,并在存储库中配置分支策略 (Azure Repos仅) 。

存储库详细信息

签出多个存储库时,有关存储库的 self 一些详细信息可用作 变量。 使用多存储库触发器时,其中一些变量具有有关触发存储库的信息。 Details about all of the repositories consumed by the job are available as a template context object called resources.repositories.

例如,若要获取非self 存储库的 ref,可以编写如下所示的管道:

resources:
  repositories:
  - repository: other
    type: git
    name: MyProject/OtherTools

variables:
  tools.ref: $[ resources.repositories['other'].ref ]

steps:
- checkout: self
- checkout: other
- bash: |
    echo "Tools version: $TOOLS_REF"

常见问题解答

为什么无法从另一个项目签出存储库? 这在过去可以。

Azure Pipelines为当前项目设置提供限制作业授权范围,启用时不允许管道访问包含管道的项目外部的资源。 可以在组织或项目级别设置此设置。 如果启用此设置,除非显式授予访问权限,否则将无法签出其他项目中的存储库。 有关详细信息,请参阅 作业授权范围

为什么在首次尝试签出其他存储库时提示我授权资源?

签出包含管道的 Git 存储库以外的Azure Repos时,系统可能会提示你在首次运行管道之前授权访问该资源。 这些提示显示在管道运行摘要页上。

This pipeline needs permission to access a resource

Authorize resource

选择 “查看授权资源”,然后按照提示对资源进行授权。

Waiting for review

Permit access

有关详细信息,请参阅 YAML 管道的授权疑难解答