Как проверить, содержит ли массив строку с выражениями конвейера 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')

Другие вопросы по тегам