Существует шаблон вакансии (управляемый извне). Я хочу использовать этот шаблон в своем конвейере. Мне нужно предоставить ряд параметров, чтобы этот шаблон работал. Я хотел бы динамически генерировать значение для одного из этих параметров, а именно пароля.
Я думал об использовании pwgen для этого следующим образом:
jobs:
- job: generate_key_password
steps:
- bash: |
set -e
echo "Installing pwgen"
sudo apt install pwgen && echo "Successfully installed pwgen"
pw=$(pwgen -y -s 25 1)
displayName: Installing pwgen
Затем я хотел бы использовать результаты этого шага в шаблоне:
- template: /x/y/z/a-template.yml@some-repo
parameters:
theParameterName: <this should be the password I generated>
Раньше я использовал vso для передачи переменных от одного задания к другому, но это кажется невозможным в контексте моей задачи (я не могу установить dependsOn
). Существует ли какая-либо простая стратегия передачи переменной и ее использования в последующем задании шаблона или нет?
В совокупности это будет выглядеть так:
stages:
- stage: the_stage
jobs:
- job: generate_key_password
steps:
- bash: |
set -e
echo "Installing pwgen"
sudo apt install pwgen && echo "Successfully installed pwgen"
pw=$(pwgen -y -s 25 1)
displayName: Installing pwgen
- template: /x/y/z/a-template.yml@some-repo
parameters:
theParameterName: <this should be the password I generated>
Можете ли вы разделить на два этапа: pw
созданное задание на этапе 1 и a-template.yml
задание на этапе 2, чтобы вы могли установить dependsOn
на этапе, чтобы избежать его в шаблоне вакансии.
@wenbo Да, это возможно
«Я не могу установить зависимость» — это проблема дизайна. Должно быть возможно установить некоторые параметры, такие как зависимости заданий, условия, тайм-ауты и другие, чтобы создавать настраиваемые и расширяемые шаблоны заданий. Подумайте о том, чтобы попросить автора(ов) шаблона добавить параметр dependsOn
и другие, которые могут облегчить вашу жизнь (и жизнь других).
Если вы можете установить dependsOn
на уровне stage
, вы можете перенести переменную на следующий этап. Пожалуйста, обратитесь к моему образцу ниже:
основной.yml:
trigger: none
pool:
vmImage: ubuntu-latest
stages:
- stage: One
jobs:
- job: A
steps:
- bash: echo "##vso[task.setvariable variable=MyVar;isOutput=true]testpwd"
name: ProduceVar
- stage: Two
dependsOn: One
variables:
varFromA: $[ stageDependencies.One.A.outputs['ProduceVar.MyVar'] ]
jobs:
- template: template4.yml
parameters:
pwd: $(varFromA)
шаблон4.yml
parameters:
- name: pwd
type: string
jobs:
- job: job2
steps:
- script: echo ${{ parameters.pwd}}
Результат выполнения:
Или вы можете поместить шаблон в new pipeline
. Вы можете сгенерировать пароль в 1-м конвейере, использовать rest API Runs — Run Pipeline , чтобы запустить 2-й конвейер сборки, и установить параметр во 2-й конвейер для параметра шаблона.
Образец вы можете найти в моем ответе здесь.
По умолчанию этапы запускаются один за другим, поэтому ваш пример должен работать без dependsOn: One
, верно?
Да, это работает. Но я предпочитаю добавить dependsOn: One
, чтобы было понятнее.
«Я предпочитаю добавить dependOn: One, чтобы было понятнее» — да, я согласен.
Сгенерированная среда выполнения
pw
не может быть отображена в параметрах.theParameterName
выдаст ошибку, чтобы указать значение, поскольку оно отображается в начале, аpw
не выводится.