查看管線中的多個存放庫
Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
管線通常依賴多個存放庫,其中包含需要建置程式碼的來源、工具、指令碼或其他項目。 藉由在管線中使用多個 checkout
步驟,除了用來儲存 YAML 管線的存放庫之外,您還可以擷取和取出其他存放庫。
指定多個存放庫
存放庫可以指定為存放 庫資源,或內嵌在步驟中 checkout
。
支援下列存放庫類型。
Azure Repos Git (git
)
- Azure DevOps Server (僅限於相同組織中的存放庫)
- Azure DevOps Services
GitHub (github
)
- Azure DevOps Services
GitHubEnterprise (githubenterprise
)
- Azure DevOps Services
Bitbucket Cloud (bitbucket
)
- Azure DevOps Services
重要
在 Azure DevOps Server 中,只有 與管線位於相同組織中的 Azure Repos Git (git
) 存放庫支援進行多存放庫簽出。
注意
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 存放庫 GitHub 和 Bitbucket 雲端存放庫資源需要服務連線,這些聯機會指定為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://MyProject/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\tools
和C:\agent\_work\1\s\code
。注意
如果步驟中
checkout
未path
指定 ,則會針對資料夾使用存放庫的名稱,而不是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 時,系統可能會提示您在第一次執行管線之前授權該資源的存取權。 這些提示會顯示在管線執行摘要頁面上。
選擇 [檢視] 或 [授權資源],然後遵循提示來授權資源。
如需詳細資訊,請參閱針對 YAML 管線的授權進行疑難排解。