Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
Pipelines часто используют несколько репозиториев, содержащих исходный код, инструменты, скрипты или другие элементы, необходимые для сборки кода. Используя несколько checkout шагов в конвейере, вы можете получить и проверить другие репозитории в дополнение к тому, который вы используете для хранения конвейера YAML.
Указание нескольких репозиториев
Репозитории можно указать как ресурс repository или встроенный шаг checkout.
Поддерживаются следующие типы репозитория.
Azure Repos Git (git)
- Azure DevOps Server (ограничено репозиториями в той же организации)
- Azure DevOps Services
GitHub (github)
- Azure DevOps Services
GitHubEnterprise (githubenterprise)
- Azure DevOps Services
Облако Bitbucket (bitbucket)
- Azure DevOps Services
Внимание
В Azure DevOps Server поддерживаются только репозитории Azure Repos Git (git) в той же организации, что и конвейер.
Примечание.
Azure Pipelines предоставляет параметры Limit job scope для репозиториев Azure Repos Git. Чтобы проверить Azure Repos репозитории Git, размещенные в другом project, Область заданияLimit необходимо настроить для разрешения access. Дополнительные сведения см. в разделе Область авторизации заданияLimit.
Поддерживаются следующие сочетания checkout шагов.
Никаких checkout шагов
Поведение по умолчанию, как если бы checkout: self было первым шагом, а текущий репозиторий извлечен.
Один checkout: none шаг
Репозитории не синхронизированы или извлечены.
Один checkout: self шаг
Извлекается текущий репозиторий.
Один checkout шаг, который не является или не self является none
Указанный репозиторий извлекается вместо selfнего.
Несколько checkout шагов
Каждый указанный репозиторий извлекается в папку с именем репозитория, если на шаге не указано другое pathcheckout . Чтобы проверить self как одну из репозиториев, используйте checkout: self один из checkout шагов.
Примечание.
При извлечении Azure Repos репозиториев Git, отличных от репозиториев, содержащих конвейер, может потребоваться авторизовать access в этот ресурс до первого запуска конвейера. Дополнительные сведения см. в статье "Почему мне предлагается авторизовать ресурсы в первый раз, когда я пытаюсь проверить другой репозиторий?", в разделе часто задаваемых вопросов.
Определение ресурса репозитория
Необходимо использовать ресурс repository если тип репозитория требует подключения к службе или другого поля расширенных ресурсов. Для следующих типов репозиторий требуется подключение к службе.
| Тип репозитория | Подключение службы |
|---|---|
| Облако Bitbucket | Bitbucket Cloud |
| GitHub | GitHub |
| GitHub Enterprise Server | GitHub Enterprise Server |
| Azure Repos репозитории Git в организации, отличной от конвейера | Azure Repos/Team Foundation Server |
Вы можете использовать ресурс репозитория, даже если тип репозитория не требует подключения к службе, например если у вас уже определен ресурс репозитория для шаблонов в другом репозитории.
В следующем примере три репозитория объявляются как ресурсы репозитория. Репозиторий Azure Repos Git в другой организацииGitHub и Bitbucket Cloud для ресурсов репозитория требуются подключения , указанные в качестве endpoint для этих ресурсов репозитория. В этом примере есть четыре checkout шага, которые проверяют три репозитория, объявленные как ресурсы репозитория, а также текущий self репозиторий, содержащий YAML конвейера.
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 в другой организации и другие поддерживаемые типы репозиториев требуют подключения service и должны быть объявлены как ресурс repository.
steps:
- checkout: self
- checkout: git://MyProject/MyRepo # Azure Repos Git repository in the same organization
Примечание.
В предыдущем примере репозиторий self вычислиется для получения источника репозитория, связанного с конвейером.
Если вы используете репозиторий Azure Repos Git по умолчанию (с тем же именем, что и project), используйте формат - checkout: git://MyProject/MyRepo.
Путь к извлечению
Если на шаге path не указано значениеcheckout, исходный код помещается в каталог по умолчанию. Этот каталог отличается в зависимости от того, извлекаете ли вы один репозиторий или несколько репозиториев.
Один репозиторий: если у вас есть один
checkoutшаг в задании или нет шага получения, который эквивалентенcheckout: self, исходный код извлекается в каталог, которыйsназывается вложенной папкой$(Agent.BuildDirectory). Если$(Agent.BuildDirectory)этоC:\agent\_work\1так, код извлекаетсяC:\agent\_work\1\s.Несколько репозиториев: если у вас есть несколько
checkoutшагов в задании, исходный код извлекается в каталоги с именем репозиториев в виде вложеннойs$(Agent.BuildDirectory)папки. Если$(Agent.BuildDirectory)естьC:\agent\_work\1и ваши репозитории именуютсяtools, иcodeкод извлекается иC:\agent\_work\1\s\toolsC:\agent\_work\1\s\code.Примечание.
Если на шаге нет
path,checkoutимя репозитория используется для папки, а неrepositoryзначение, которое используется для ссылки на репозиторий на шагеcheckout.
Если для шага задано path значение, используется этот путь относительно checkout.$(Agent.BuildDirectory)
Примечание.
Если вы используете пути по умолчанию, добавление второго шага репозитория checkout изменяет путь по умолчанию кода для первого репозитория. Например, код для именованного tools репозитория будет извлечен, C:\agent\_work\1\s когда tools является единственным репозиторием, но если добавляется второй репозиторий, tools будет извлечен.C:\agent\_work\1\s\tools Если у вас есть какие-либо шаги, зависящие от исходного кода в исходном расположении, эти действия необходимо обновить.
Репозиторий рабочей области
Если в конвейере используется несколько checkout шагов (и разные пути для каждого) можно использовать корневой каталог одного репозитория в качестве рабочего каталога по умолчанию. В этом случае можно задать для workspaceRepo входные данные true для соответствующего шага checkout.
- checkout: git://project/first
path: repo/first-repo
- checkout: git://project/second
path: repo/second-repo
workspaceRepo: true
- pwsh: pwd
# Expected output: $(Pipeline.Workspace)/repo/second-repo
Извлечение определенного ссылок
Ветвь по умолчанию извлекается, если вы не назначите определенный ссылочный объект.
Если используется встроенный синтаксис, назначьте ссылку путем @<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.
Внимание
Значение checkout , включая встроенную @<ref> часть, разрешает во время компиляции в качестве ссылки на ресурсы.
Переменные синтаксиса макросов ($(var)) не расширяются в значении checkout . Например, checkout: git://MyProject/MyRepo@$(branch) не разрешает переменную — конвейер пытается проверить литерал ref с именем $(branch), который обычно завершается ошибкой "ссылка не найден".
Чтобы параметризировать ветвь, используйте выражения шаблона (${{ }}) с параметрами среды выполнения, как показано в следующих примерах.
${{ variables.myVar }} работает только для переменных, определенных как литеральные значения в YAML (известном во время компиляции), а не для переменных во время очереди или динамически заданных переменных.
Параметризация ветви с помощью встроенного синтаксиса
Определите параметр среды выполнения и сослаться на него с выражением шаблона в строковом значении извлечений:
parameters:
- name: branch
type: string
default: 'main'
steps:
- checkout: git://MyProject/MyRepo@${{ parameters.branch }}
Параметризация ветви с помощью ресурса репозитория
ref Используйте свойство в ресурсе репозитория, чтобы задать ветвь из параметра:
parameters:
- name: branch
type: string
default: 'main'
resources:
repositories:
- repository: MyRepo
type: git
name: MyProject/MyRepo
ref: ${{ parameters.branch }}
steps:
- checkout: MyRepo
При использовании ресурса репозитория укажите ссылку с помощью ref свойства. В следующем примере проверяется features/tools/ ветвь указанного репозитория.
resources:
repositories:
- repository: MyGitHubRepo
type: github
endpoint: MyGitHubServiceConnection
name: MyGitHubOrgOrUser/MyGitHubRepo
ref: features/tools
steps:
- checkout: MyGitHubRepo
В следующем примере используется tags для получения фиксации, на которую ссылается MyTag.
resources:
repositories:
- repository: MyGitHubRepo
type: github
endpoint: MyGitHubServiceConnection
name: MyGitHubOrgOrUser/MyGitHubRepo
ref: refs/tags/MyTag
steps:
- checkout: MyGitHubRepo
Триггеры
Конвейер можно активировать при отправке self обновления в репозиторий или в любой из репозиториев, объявленных как ресурсы. Это полезно, например, в следующих сценариях:
- Средство или библиотека используются из другого репозитория. Вы хотите запускать тесты для приложения всякий раз, когда средство или библиотека обновляются.
- Файл YAML хранится в отдельном репозитории от кода приложения. Вы хотите активировать конвейер каждый раз, когда обновление отправляется в репозиторий приложений.
Внимание
Триггеры ресурсов репозитория работают только для репозиториев Git Azure Repos в той же организации и когда тип репозитория self Azure Repos Git. Они не работают для GitHub или ресурсов репозитория Bitbucket.
batch не поддерживается в триггерах ресурсов репозитория.
Если вы не указываете trigger раздел в ресурсе репозитория, конвейер не будет активирован изменениями в этом репозитории. Если указать trigger раздел, поведение активации аналогично тому, как триггеры CI работают для самостоятельного репозитория.
Если указать trigger раздел для нескольких ресурсов репозитория, то изменение на любой из них запустит новый запуск.
При активации конвейера Azure Pipelines должен определить версию ФАЙЛА YAML, который следует использовать, и версию для каждого репозитория, который следует извлечь. Если изменение в репозитории self активирует конвейер, то фиксация, активировающая конвейер, используется для определения версии ФАЙЛА YAML. Если изменение любого другого ресурса репозитория активирует конвейер, используется последняя версия YAML из ветвь по умолчанию репозиторияself.
Когда обновление до одного из репозиториев активирует конвейер, следующие переменные задаются на основе триггерного репозитория:
Build.Repository.IDBuild.Repository.NameBuild.Repository.ProviderBuild.Repository.UriBuild.SourceBranchBuild.SourceBranchNameBuild.SourceVersionBuild.SourceVersionMessage
Для триггерного репозитория фиксация, активировающая конвейер, определяет версию извлеченного кода. Для других репозиториев, определенный в YAML для этого ресурса репозитория, ref определяет версию по умолчанию, извлеченную.
Рассмотрим следующий пример, где 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 |
|---|---|---|---|---|---|
main в self. |
Да | фиксация из main этого триггера конвейера |
фиксация из main этого триггера конвейера |
последняя версия из main |
последняя версия из release |
feature в self. |
Да | фиксация из feature этого триггера конвейера |
фиксация из feature этого триггера конвейера |
последняя версия из main |
последняя версия из release |
main в A. |
Да | последняя версия из main |
последняя версия из main |
фиксация из main этого триггера конвейера |
последняя версия из release |
main в B. |
Да | последняя версия из main |
последняя версия из main |
последняя версия из main |
фиксация из main этого триггера конвейера |
release в B. |
Да | последняя версия из main |
последняя версия из main |
последняя версия из main |
фиксация из release этого триггера конвейера |
Вы также можете активировать конвейер при создании или обновлении запроса на вытягивание в любом из репозиториев. To do это, объявите ресурсы репозитория в файлах YAML, как в приведенных выше примерах, и настройте политику ветви в репозитории (только Azure Repos).
Сведения о репозитории
При извлечении нескольких репозиториев некоторые сведения о self репозитории доступны в виде переменных.
При использовании триггеров с несколькими репозиториями некоторые из этих переменных содержат сведения о триггерном репозитории.
Сведения обо всех репозиториях, потребляемых заданием, доступны как объектresources.repositoriesконтекста шаблона.
Например, чтобы получить ссылку наself репозиторий, можно написать конвейер следующим образом:
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"
Вопросы и ответы
- Почему я не могу извлечь репозиторий из другого project? (Почему не удается оформить заказ на репозиторий из другого проекта? Раньше все работало.)
- Почему мне предлагается авторизовать ресурсы при первом попытке проверить другой репозиторий?
Почему я не могу извлечь репозиторий из другого project? (Почему не удается оформить заказ на репозиторий из другого проекта? Раньше все работало.)
Azure Pipelines предоставляет область авторизации задания Limit для текущего параметра project, что при включении конвейер не разрешает access ресурсам за пределами project, содержащей конвейер. Этот параметр можно задать на уровне организации или project. Если этот параметр включен, вы не сможете извлечь репозиторий в другом project, если вы явно не предоставите access. Дополнительные сведения см. в разделе Область авторизацииJob.
Почему мне предлагается авторизовать ресурсы при первом попытке проверить другой репозиторий?
При извлечении Azure Repos репозиториев Git, отличных от репозиториев, содержащих конвейер, может потребоваться авторизовать access в этот ресурс до первого запуска конвейера. Эти запросы отображаются на странице сводки по выполнению конвейера.
Выберите "Просмотреть или авторизовать ресурсы" и следуйте инструкциям по авторизации ресурсов.
Дополнительные сведения см. в разделе Устранение неполадок с авторизацией для конвейера YAML.