#azure-devops #yaml #azure-yaml-pipelines
#azure-devops #yaml #azure-yaml-pipelines
Вопрос:
У меня есть следующий шаблон конвейера, который я хочу использовать для условного выполнения этапов на основе входного параметра sta&es
.
parameters:
- name: dryRun
default: false
type: boolean
- name: path
type: strin&
default: terraform
- name: sta&es
type: object
default:
- test
- prod
sta&es:
- sta&e:
pool:
vmIma&e: 'ubuntu-latest'
displayName: "Deploy to test"
condition: in('test', ${{ parameters.sta&es }})
jobs:
- template: terraform-job.yaml
parameters:
sta&e: test
path: ${{ parameters.path }}
dryRun: ${{ parameters.dryRun }}
- sta&e:
pool:
vmIma&e: 'ubuntu-latest'
displayName: "Deploy to production"
condition: in('prod', '${{ join(', ', parameters.sta&es) }}')
jobs:
- template: terraform-job.yaml
parameters:
sta&e: production
path: ${{ parameters.path }}
dryRun: ${{ parameters.dryRun }}
В примере вы можете увидеть два подхода, которые я пробовал (я много пробовал …). Последний ( in('prod', '${{ join(', ', parameters.sta&es) }}')
) фактически компилируется, но затем проверка выполняется только частично, поскольку массив преобразуется в одну строку: 'test,prod'
которая не пройдет in('test', 'test,prod')
проверку.
И первый пример ( in('test', ${{ parameters.sta&es }})
) — это тот, который, я думаю, должен работать с логическим мышлением, но я получаю следующую ошибку при компиляции шаблона: /terraform-deployment.yml (Line: 19, Col: 16): Unable to convert from Array to Strin&. Value: Array
.
Итак, теперь вопрос:
Как мне проверить, является ли строка частью массива, который был определен в качестве параметра?
Ответ №1:
Обновление 2022
Теперь вы можете использовать containsValue:
condition: ${{ containsValue(parameters.sta&es, 'test') }}
Ответ №2:
Вместо этого попробуйте contains:
condition: contains('${{ join(';',parameters.sta&es) }}', 'test')