Как я могу вызвать конвейер YAML, который имеет как переменные, так и параметры времени выполнения? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть сценарий, в котором мне нужно иметь оба:

  1. параметры времени выполнения , чтобы конвейер можно было запускать вручную из пользовательского интерфейса, когда пользователи запускают он может выбирать из предопределенного набора параметров (определенных в YAML)

  2. переменных , так что конвейер может быть вызван через API REST

Что касается параметров времени выполнения, я смог создать следующий пример конвейера:

parameters:
- name: image
  displayName: Pool Image
  type: string
  default: ubuntu-latest
  values:
  - windows-latest
  - ubuntu-latest

trigger: none

stages:
- stage: A
  jobs:
  - job: A
    steps:
    - pwsh: |
        echo "This should be triggering against image: $MY_IMAGE_NAME"
      env:
        MY_IMAGE_NAME: ${{ parameters.image }}

Когда я его запускаю, я вижу раскрывающийся список, в котором я могу выбрать имя изображения, и оно отражено в выходном сообщении скрипта PowerShell.

Что касается переменных, я определил здесь одну из них под названием «изображение» (обратите внимание, что значение пусто):

pipeline variable

Идея сейчас это вызвать конвейер из API REST и заменить имя изображения значением, полученным из переменной:

{
    "definition": {
        "id": 1
    },
    "sourceBranch": "master",
    "parameters":  "{\"image\": \"windows-latest\" }"
}

Чтобы шаг напечатал значение, которое я передаю здесь, мне нужно исправить переменная окружения в некотором роде. Я думал, что было бы достаточно написать что-то вроде:

env:
  MY_IMAGE_NAME: ${{ coalesce(variables.image, parameters.image) }}

Это потому, что я хочу отдавать приоритет переменным, а затем параметрам, чтобы в случае, если ничего не указано, у меня всегда было значение по умолчанию трубопровод может использовать.

Однако этот подход не работает, возможно, потому что мы имеем дело с разным временем раскрытия для переменных, но я не знаю, что мне следует писать вместо этого (если есть жизнеспособный вариант, конечно).

Я также попробовал:

env:
  MY_IMAGE_NAME: ${{ coalesce($(image), parameters.image) }}
  MY_IMAGE_NAME: ${{ coalesce('$(image)', parameters.image) }}
  MY_IMAGE_NAME: $[ coalesce(variables.image, parameters.image) ]
  MY_IMAGE_NAME: $[ coalesce($(image), parameters.image) ]

Ни один из них не работает, поэтому я подозреваю, что это может быть неосуществимым вообще.

В настоящее время я думаю об обходном пути, заключающемся в создании двух разных конвейеров, чтобы их можно было запускать независимо, но в то же время мне довольно просто выполнить sh, учитывая, что я ' Я использую много шаблонов, я не нахожу правильный способ продолжить, поэтому я открыт для любых предложений.

1 Ответ

1 голос
/ 04 мая 2020

Я протестировал и обнаружил, что вам может потребоваться определить переменную и присвоить ей значение параметра (например, Mimage: ${{parameters.image}}). И определите другую переменную (например, Vimage) и присвойте ей $[coalesce(variables.image, variables.Vimage)]. Затем обратитесь к $(Vimage) в поле env задачи powershell. Пожалуйста, проверьте ниже yaml.

parameters:
- name: image
  displayName: Pool Image
  type: string
  default: ubuntu-latest
  values:
  - windows-latest
  - ubuntu-latest

trigger: none

stages:

- stage: A
  jobs:
  - job: A
    variables:
      Mimage: ${{parameters.image}}
      Vimage: $[coalesce(variables.image, variables.Mimage)]

    steps:
    - pwsh: |
        echo "This should be triggering against image: $env:MY_IMAGE_NAME"
      env:
        MY_IMAGE_NAME: $(Vimage)

Поле env задачи powershell обычно для отображения секретных переменных . Вы можете напрямую ссылаться на $(Vimage) в скрипте powershell: echo "This should be triggering against image: $(Vimage).

Примечание. Чтобы поставить в очередь сборку через REST API с предоставленными параметрами, необходимо установить Let users override this value when running this pipeline, чтобы переменную можно было установить во время очереди.

enter image description here

Обновление:

Вы можете попробовать передать переменные в параметры шаблона, чтобы сделать параметры для шаблон динами c. Пожалуйста, проверьте ниже простой yaml.

 jobs:
  - template: template.yaml
    parameters:
      MTimage: ${{parameters.image}}
      VTimage: $(Vimage)

template.yaml:

parameters:
  MTimage: 
  VTimage:  

jobs:
- job: buildjob
  steps:
  - powershell: |
      echo "${{parameters.VTimage}}"
      echo "${{parameters.MTimage}}"
...