Как проверить, содержит ли массив строку с выражениями конвейера Azure DevOps
У меня есть следующий шаблон конвейера, который я хочу использовать для условного выполнения этапов на основе входного параметра stages
.
parameters:
- name: dryRun
default: false
type: boolean
- name: path
type: string
default: terraform
- name: stages
type: object
default:
- test
- prod
stages:
- stage:
pool:
vmImage: 'ubuntu-latest'
displayName: "Deploy to test"
condition: in('test', ${{ parameters.stages }})
jobs:
- template: terraform-job.yaml
parameters:
stage: test
path: ${{ parameters.path }}
dryRun: ${{ parameters.dryRun }}
- stage:
pool:
vmImage: 'ubuntu-latest'
displayName: "Deploy to production"
condition: in('prod', '${{ join(', ', parameters.stages) }}')
jobs:
- template: terraform-job.yaml
parameters:
stage: production
path: ${{ parameters.path }}
dryRun: ${{ parameters.dryRun }}
В этом примере вы можете увидеть два подхода, которые я пробовал (много пробовал...). Последний (in('prod', '${{ join(', ', parameters.stages) }}')
) фактически компилируется, но тогда проверка работает только частично, так как массив преобразуется в одну строку: 'test,prod'
что подведет in('test', 'test,prod')
проверить.
И первый пример (in('test', ${{ parameters.stages }})
) - это тот, который, по моему мнению, должен работать с логическим мышлением, но при компиляции шаблона я получаю следующую ошибку: /terraform-deployment.yml (Line: 19, Col: 16): Unable to convert from Array to String. Value: Array
.
Итак, теперь вопрос:
Как проверить, является ли строка частью массива, определенного как параметр?
2 ответа
обновление 2022 г.
Теперь вы можете использовать containsValue:
condition: ${{ containsValue(parameters.stages, 'test') }}
Try содержит вместо этого:
condition: contains('${{ join(';',parameters.stages) }}', 'test')