Многоступенчатый конвейер YAML Azure DevOps: как оформить заказ на несколько репозиториев?
Мой конвейер Azure DevOps использует шаблоны yaml из двух разных репозиториев, которые настроены следующим образом.
- Есть репозиторий приложений, в котором есть развертываемое приложение и один yaml-файл - "корневой" шаблон конвейера.
- Репозиторий шаблонов. Корневой шаблон вызывает другие шаблоны и этапы из репозитория шаблонов. Затем шаблоны из этого репозитория вызывают другие шаблоны и скрипты (из того же репозитория)
Репозиторий шаблонов упоминается как ресурс в корневом шаблоне. Я не нашел способа проверить репозиторий шаблонов только один раз, а затем использовать шаблоны и скрипты на всех этапах конвейера. На данный момент мне нужно вручную клонировать репозиторий шаблонов на каждом этапе, когда мне нужно использовать дополнительные шаблоны или скрипты. В конце каждого этапа Azure Devops очищает клонированное репо. Есть ли простой способ проверить репозиторий шаблонов только один раз или как-то еще ссылаться на его ресурсы с подэтапов?
1 ответ
Я не уверен, поскольку вы не показывали свой файл YAML, но вы использовали этап проверки:
resources:
repositories:
- repository: devops
type: github
name: kmadof/devops-templates
endpoint: kmadof
steps:
- checkout: self
- checkout: devops
- script: |
echo $(Build.SourcesDirectory)
ls $(Build.SourcesDirectory) *
- template: templates/template.yaml@devops
parameters:
repo: devops-templates
Выше скрипта показаны два репозитория. Вdevops-templates
У меня есть шаблон, который используется в основном файле yaml сборки (расположен в self
репо).
Пожалуйста, посмотрите также здесь
РЕДАКТИРОВАТЬ
Я немного поработал с этим и попробовал несколько вещей. Позвольте мне сначала описать отношения между файлами:
- build.yaml (основное репо)
- templates / start.yml (репозиторий шаблона - шаблон с этапами)
- задание первое - templates / process.yaml (репозиторий шаблонов)
- шаги - templates / another-template.yaml (репозиторий шаблонов)
- задание два - шаги, прямо определенные в start.yaml
- задание первое - templates / process.yaml (репозиторий шаблонов)
- templates / start.yml (репозиторий шаблона - шаблон с этапами)
И вам не нужно фактически проверять репозиторий шаблонов, потому что при запуске все шаблоны обрабатываются и создается план сборки. Вам нужно только проверить репозиторий шаблонов, если вы собираетесь запускать некоторые сценарии (например, сценарии PowerShell). Вот мои файлы yaml:
build.yaml
resources:
repositories:
- repository: devops
type: github
name: kmadof/devops-templates
endpoint: kmadof
stages:
- template: templates/start.yaml@devops
parameters:
repo: devops-templates
buildSteps:
- checkout: self
- checkout: devops
- bash: echo Test #Passes
displayName: succeed
- bash: echo "Test"
displayName: succeed
start.yaml
# File: start.yml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
- name: buildSteps # the name of the parameter is buildSteps
type: stepList # data type is StepList
default: [] # default value of buildSteps
stages:
- stage: secure_buildstage
pool: Hosted VS2017
jobs:
- template: process.yaml
parameters:
pool: # this parameter is called `pool`
vmImage: ubuntu-latest # and it's a mapping rather than a string
- job: secure_buildjob
steps:
- script: echo This happens before code
displayName: 'Base: Pre-build'
- script: echo Building
displayName: 'Base: Build'
- ${{ each step in parameters.buildSteps }}:
- ${{ each pair in step }}:
${{ pair.key }}: ${{ pair.value }}
- script: echo This happens after code
displayName: 'Base: Signing'
process.yaml
parameters:
- name: 'pool'
type: object
default: {}
jobs:
- job: build
pool: ${{ parameters.pool }}
steps:
- template: another-template.yaml
parameters:
repo: devops-templates
другой-template.yaml
parameters:
- name: repo # defaults for any parameters that aren't specified
default: ''
steps:
- pwsh: Write-Host 'Hello form another template'
Взгляните сюда:
В задании сборки используется шаблон из репозитория DevOps-template, но я не проверяю репо в этом задании.
Вы можете задаться вопросом, почему у нас не может быть одной проверки для каждой сборки. И это потому, что каждое задание может запускать свой агент.
Вот несколько ссылок:
Последнее замечание: вам действительно нужно проверить репо с помощью шаблонов, когда вы шаблон вызываете файл из этого репо. Например:
steps:
- task: PowerShell@2
inputs:
filePath: /scripts/myscript.ps1