查看管線中的多個存放庫

Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020

管線通常依賴多個存放庫,其中包含需要建置程式碼的來源、工具、指令碼或其他項目。 藉由在管線中使用多個 checkout 步驟,除了用來儲存 YAML 管線的存放庫之外,您還可以擷取和取出其他存放庫。

指定多個存放庫

存放庫可以指定為存放 庫資源,或內嵌在步驟中 checkout

支援下列存放庫類型。


Azure Repos Gitgit

  • Azure DevOps Server (僅限於相同組織中的存放庫)
  • Azure DevOps Services

GitHubgithub

  • Azure DevOps Services

GitHubEnterprisegithubenterprise

  • Azure DevOps Services

Bitbucket Cloudbitbucket

  • Azure DevOps Services

重要

在 Azure DevOps Server 中,只有 與管線位於相同組織中的 Azure Repos Gitgit) 存放庫支援進行多存放庫簽出。

注意

Azure Pipelines 提供 Azure Repos Git 存放庫的限制作業範圍 設定。 若要簽出裝載於另一個專案的 Azure Repos Git 存放庫, 必須設定限制作業範圍 以允許存取。 如需詳細資訊,請參閱 限制作業授權範圍

支援下列步驟組合 checkout


沒有 checkout 步驟

默認行為就如同 checkout: self 第一個步驟,而目前的存放庫已取出。


checkout: none 一步驟

不會同步處理或取出任何存放庫。


checkout: self 一步驟

目前的存放庫已取出。


不是self或的單checkout一步驟none

指定的存放函式庫已取出,而不是 self


多個 checkout 步驟

除非在步驟中checkout指定了不同的path存放庫,否則每個指定的存放庫都會簽出以存放庫命名的資料夾。 若要簽出 self 作為其中一個存放庫,請使用 checkout: self 作為其中 checkout 一個步驟。


注意

當您簽出包含管線 Git 存放庫以外的 Azure Repos 時,系統可能會提示您在第一次執行管線之前授權該資源的存取權。 如需詳細資訊,請參閱常見問題一節中的常見問題一節,為什麼我第一次嘗試授權資源來授權資源。

存放庫資源定義

如果您的存放庫類型需要服務連線或其他擴充資源字段,則必須使用存放庫資源。 下列存放庫類型需要服務連線。

存放庫類型 服務連線
Bitbucket Cloud Bitbucket Cloud
GitHub GitHub
GitHub Enterprise 伺服器 GitHub Enterprise Server
與管線不同的組織中 Azure Repos Git 存放庫 Azure Repos/Team Foundation Server

即使您的存放庫類型不需要服務連線,您也可以使用存放庫資源,例如,如果您的存放庫資源已針對不同存放庫中的範本定義。

在下列範例中,三個存放庫會宣告為存放庫資源。 另一個組織中的 Azure Repos Git 存放庫 Git 存放庫 GitHubBitbucket 雲端存放庫資源需要服務連線,這些聯機會指定為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: self
- checkout: git://MyProject/MyRepo # Azure Repos Git repository in the same organization

注意

在上一個範例中,會指定簽出存放 self 庫,以便簽出與管線相關聯的存放庫來源。

如果您使用預設的 Azure Repos Git 存放庫(與專案同名),請使用 格式 - checkout: git://MyRepo/MyRepo

簽出路徑

path除非在checkout步驟中指定 ,否則原始程式碼會放在預設目錄中。 此目錄會根據您簽出單一存放庫或多個存放庫而有所不同。

  • 單一存放庫:如果您的作業中有單 checkout 一步驟,或沒有相當於 checkout: self的簽出步驟,您的原始程式碼會簽入名為 的目錄 s ,其子資料夾 (Agent.BuildDirectory)為 。 如果 (Agent.BuildDirectory)C:\agent\_work\1,則會將程式代碼簽出至 C:\agent\_work\1\s

  • 多個存放庫:如果您在作業中有多個checkout步驟,您的原始程式碼會簽入以存放庫命名的目錄,做為 中的 (Agent.BuildDirectory)子資料夾s。 如果 (Agent.BuildDirectory)C:\agent\_work\1 您的存放庫命名 tools 為和 code,則會將程式代碼簽出至 C:\agent\_work\1\s\toolsC:\agent\_work\1\s\code

    注意

    如果步驟中checkoutpath指定 ,則會針對資料夾使用存放庫的名稱,而不是repository用來參考步驟中checkout存放庫的值。

path如果已針對checkout步驟指定 ,則會使用該路徑,相對於 (Agent.BuildDirectory)

注意

如果您使用預設路徑,新增第二個存放庫 checkout 步驟會變更第一個存放庫程式碼的預設路徑。 例如,名為 tools 的存放庫程式碼會在 是唯一的存放庫時tools取出,C:\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

下列範例會使用 標記 來簽出 所 MyTag參考的認可。

resources:
  repositories:
  - repository: MyGitHubRepo
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
    ref: refs/tags/MyTag

steps:
- checkout: MyGitHubRepo

觸發程序

當更新推送至 self 存放庫或宣告為資源的任何存放庫時,您可以觸發管線。 例如,在下列案例中,這非常有用:

  • 您可以從不同的存放庫取用工具或連結庫。 每當工具或連結庫更新時,您想要執行應用程式的測試。
  • 您可以將 YAML 檔案保留在與應用程式程式代碼不同的存放庫中。 您想要在每次將更新推送至應用程式存放庫時觸發管線。

重要

當存放庫類型為 Azure Repos Git 時 self ,存放庫資源觸發程式僅適用於相同組織中的 Azure Repos Git 存放庫。 它們不適用於 GitHub 或 Bitbucket 存放庫資源。

batch 存放庫資源觸發程式不支援。

如果您未在存放庫資源中指定 trigger 區段,則管線將不會由該存放庫的變更觸發。 如果您指定區 trigger 段,則觸發的行為類似於 CI 觸發程式對自我存放庫的運作方式。

如果您為多個存放庫資源指定區 trigger 段,則其中任何一項資源的變更都會啟動新的執行。

觸發管線時,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
steps:
- checkout: self
- checkout: A
- checkout: B

下表顯示管線使用上述 YAML 檔案來取出每個存放庫的版本。

對進行變更 觸發管線 YAML 版本 版本 self 版本 A 版本 B
self 中的 main Yes main 觸發管線的認可 main 觸發管線的認可 latest from main latest from release
self 中的 feature Yes feature 觸發管線的認可 feature 觸發管線的認可 latest from main latest from release
A 中的 main Yes latest from main latest from main main 觸發管線的認可 latest from release
B 中的 main Yes latest from main latest from main latest from main main 觸發管線的認可
B 中的 release Yes latest from main latest from main latest from main release 觸發管線的認可

您也可以在任何存放庫中建立或更新提取要求時觸發管線。 若要這樣做,請將 YAML 檔案中的存放庫資源宣告為上述範例,並在存放庫中設定分支原則(僅限 Azure Repos)。

存放庫詳細數據

當您查看多個存放庫時,存放庫的self一些詳細數據會以變數的形式提供。 當您使用多存放庫觸發程式時,其中有些變數會改為具有觸發存放庫的相關信息。 作業所取用之所有存放庫的詳細數據可作為稱為 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 管線的授權進行疑難排解