Когда-то я создал шаблон yaml, который инкапсулирует этапы развертывания одного приложения. Существует несколько конвейеров, которые вытекают из этого шаблона (передавая в шаблон определенные параметры для развертывания определенного приложения) и работают великолепно.
Теперь необходимо создать конвейер, который точно так же развернет не одно, а n приложений, но мой шаблон работает только для одного. Очевидным ответом будет: «Выполните шаги развертывания, поместите их в другой шаблон, включите новый шаблон и вызовите его n раз». Но мне нужно расширить (мой текущий шаблон — это необходимый шаблон для доступа к защищенному ресурсу).
Итак, есть какие-нибудь предложения, как с этим справиться? Моя первая мысль: могу ли я каким-то образом включить шаблон, который является продолжением другого?
Can I, in some way, include a template which extends from another?
- Боюсь, нет. Согласно определению конвейера , конвейер может расширяться только из одного конкретного шаблона.
Привет @RuiJarimba, в настоящее время шаблон, который я расширяю, получает: AppName (имя приложения, в котором нужно развернуть), BuildPipeline (имя конвейера, в котором находятся артефакты сборки), previousJob (задание, которое нужно выполнить перед развертыванием). работа)
Привет @RuiJarimba, на мой взгляд, если я включаю шаблон, который является продолжением другого, я все равно расширяюсь только из одного конкретного шаблона.
@Josto зависит от того, что вы подразумеваете под расширением. Я пытался сказать, что AFAIK вы не можете использовать ключевое слово extends
несколько раз в своем конвейере, прямо или косвенно.
Но, конечно, вы можете использовать шаблоны, ссылающиеся на подшаблоны.
@RuiJarimba, теперь я понимаю: поскольку я включаю yaml с расширением несколько раз, я также несколько раз включаю ключевое слово «расширить». Понял. Спасибо.
Судя по вашему описанию, вам необходимо использовать необходимую функцию шаблона в Azure DevOps. В этом случае шаблон расширения необходимо использовать в образце YAML.
необходимо создать конвейер, который точно так же развернет не одно, а n приложений, но мой шаблон работает только для
Если вам нужно добавить include template
в основной Yaml и использовать extend template
в дочернем Yaml, это не поддерживается.
Чтобы удовлетворить ваши требования, вы можете использовать шаблон расширения в основном файле yaml и использовать шаблон включения в дочернем файле шаблона yaml.
Вот пример:
Основной ямл:
parameters:
- name: APPs
type: object
default: [1,2,3]
pool:
vmImage: ubuntu-latest
extends:
template: test1.yml
parameters:
APPname: ${{ parameters.APPs }}
Дочерний шаблон YAML:
parameters:
- name: APPname
type: object
jobs:
- ${{ each parameter in parameters.Appname }}:
- template: test.yml
Шаблон Yaml, инкапсулирующий этапы развертывания.
jobs:
- job:
steps:
- xxx
Результат: вы можете ввести имена приложений, и каждое выражение будет зацикливать значение и запускать шаблоны.
Примечание. В этом случае вам необходимо изменить требуемый шаблон на дочерний шаблон Yaml.
Обновлять:
Обратитесь к следующему примеру, чтобы создать параметры типа объекта с тремя параметрами:
Основной ямл:
parameters:
- name: APPs
type: object
default:
- Appname: test
Pipelinename: test
JobName: test
- Appname: test1
PipelineName: test1
JobName: test1
pool:
vmImage: ubuntu-latest
variables:
- group: test
extends:
template: test1.yml
parameters:
APPObject: ${{ parameters.APPs }}
Дочерний шаблон YAML:
parameters:
- name: APPObject
type: object
jobs:
- ${{ each parameter in parameters.APPObject }}:
- template: test.yml
parameters:
appname: ${{ parameter.Appname }}
PipelineName: ${{ parameter.Pipelinename }}
JobName: ${{ parameter.JobName }}
Шаблон Yaml, инкапсулирующий этапы развертывания.
parameters:
- name: appname
type: string
- name: PipelineName
type: string
- name: JobName
type: string
jobs:
- job:
steps:
- script: echo "${{parameters.appname}}"
Привет @Kevin Lu-MSFT! Если я хорошо понимаю, ваше предложение состоит в том, чтобы предоставить список приложений для развертывания в шаблоне, который мне нужно расширить с помощью массива. Это верно? (Я не совсем уверен, какое содержимое соответствует test1.yml и test.yml)
@Йосто, да. Ваше понимание верное. Мы можем использовать параметры массива для зацикливания приложений для запуска шаблона. А test1.yml — это yaml дочернего шаблона. test.yml — это yaml с этапами развертывания.
@Josto Когда мы используем параметры и каждое выражение для зацикливания приложений, вы можете напрямую управлять значением приложения в основном yaml. Задания агента будут добавляться в зависимости от количества приложений.
Хорошо, ваше предложение является более или менее моим «планом Б», как справиться с этим. «Проблема» здесь заключается в том, что каждое развертываемое приложение — это не только имя приложения, но также имя конвейера с артефактами и предыдущим заданием (всего: 3 параметра). Нужны ли мне 3 массива или я могу смоделировать это с помощью какого-то «сложного» объекта с тремя параметрами?
@Йосто Да. Мы можем смоделировать это с помощью какого-то «сложного» объекта с тремя параметрами. Подожди пожалуйста минутку. Я поделюсь с вами образцом.
@Josto Пожалуйста, проверьте обновление в ответе. Он может смоделировать это с помощью какого-то «сложного» объекта с тремя параметрами.
Использование параметров для этого кажется немного странным, но прочитать это кажется единственным вариантом. Спасибо
Каковы типы данных параметров шаблона
extends
?steplist
?joblist
?stagelist
?