在管道中签出多个存储库
Azure DevOps Services | Azure DevOps Server 2020
Pipelines通常依赖于包含生成代码所需的源、工具、脚本或其他项的多个存储库。 通过使用管道中的多个 checkout 步骤,除了用于存储 YAML 管道的存储库外,还可以提取和签出其他存储库。
指定多个存储库
可以将存储库指定为 存储库资源,也可以与 checkout 步骤内联。
支持以下存储库类型。
Azure Repos Git (git)
- 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不是self或none
指定的存储库已签出,而不是 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 |
即使存储库类型不需要服务连接,也可以使用存储库资源,例如,如果已为其他存储库中的模板定义存储库资源。
在下面的示例中,三个存储库声明为存储库资源。 另一个组织、GitHub和 Bitbucket 云存储库资源中的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 步骤内联声明它。
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\code签C:\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.IDBuild.Repository.NameBuild.Repository.ProviderBuild.Repository.UriBuild.SourceBranchBuild.SourceBranchNameBuild.SourceVersionBuild.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时,系统可能会提示你在首次运行管道之前授权访问该资源。 这些提示显示在管道运行摘要页上。
选择 “查看 或 授权资源”,然后按照提示对资源进行授权。
有关详细信息,请参阅 YAML 管道的授权疑难解答。