Azure Параметры конвейера YAML DevOps не работают из триггера API REST - PullRequest
3 голосов
/ 25 марта 2020

Я пытаюсь создать конвейер на основе YAML, который принимает параметр, а затем запустить конвейер из Azure REST API DevOps. Я могу видеть, что сборка ставится в очередь, но параметр не был переопределен из моего тела POST.

Мой шаблон my-template.yaml.

parameters:
    - name: testParam
      type: string
      default: 'N/A'


steps:
    - script: echo ${{ parameters.testParam }}

Мой конвейерный yaml, расширяющий шаблон.

trigger:
    - master

extends:
    template: my-template.yaml

Затем я запускаю этот конвейер с помощью queue build REST API : https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.1 с телом POST, как показано ниже.

{
    "parameters": "{\"testParam\": \"hello world\"}",
    "definition": {
        "id": 50642
    },
    "sourceBranch": "refs/heads/master"
}

Так что я ожидаю, что конвейерное выполнение выдаст эхо hello world вместо N/A. К сожалению, я все еще вижу N/A в результатах конвейера.

Кто-нибудь имеет представление о том, что произошло? Я что-то пропустил?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

Я столкнулся с точно такой же проблемой - конвейер, принимающий параметры времени выполнения, которые работали при запуске через пользовательский интерфейс, но не через API REST сборки очереди * .

, который мне удалось решить это с помощью недокументированного API, точно такого же, который пользовательский интерфейс Az DevOps Pipelines вызывает при запуске конвейера:

https://dev.azure.com/{organization}/{project}/_apis/pipelines/{pipelineId}/runs?api-version=5.1-preview

со следующим телом POST:

{
  "stagesToSkip": [],
  "resources": {
    "repositories": {
      "self": {
        "refName": "refs/heads/master"
      }
    }
  },
  "templateParameters": {
    "testParam": "hello world"
   },
  "variables": {}
}

Обратите внимание, что с этим API ваши параметры времени выполнения представляются как фактические JSON, не строковые JSON и под ключом templateParameters.

Также не забудьте включить стандартные заголовки, которые можно ожидать для этого вызова:

  • Content-Type: application/json
  • Accept: application/json
  • AUTHORIZATION: bearer $SYSTEM_ACCESSTOKEN.

Используя этот подход, в вызываемом конвейере вы всегда сможете получить доступ к значению ${{ parameters.testParam }}, независимо от того, вызывается ли конвейер через REST API или вручную в пользовательском интерфейсе.

Пока вы правильно указали значение доступен как $(testParam) при выполнении через REST API, эта переменная не является pop При использовании конвейера в пользовательском интерфейсе.

Поэтому я бы рекомендовал использовать этот недокументированный API, поскольку вызываемый конвейер может использовать ${{ parameters.testParam }} независимо от того, как он вызывается. Конечно, он (на момент написания) недокументирован, так что ... ¯_ (ツ) _ / ¯

Также следует отметить, что ваш конвейер должен быть отформатирован как @ Jo sh Gust предложено:

my-template.yaml:

parameters:
  - name: testParam
    type: string
    default: 'N/A'
steps:
  - script: echo ${{ parameters.testParam }}

azure -pipelines.yaml:

parameters:
  - name: testParam
    type: string
    default: 'N/A'
trigger:
  - master
extends:
  template: my-template.yaml
  parameters:
    testParam: ${{ parameters.testParam }}
0 голосов
/ 26 марта 2020

Вы не отправляете свой параметр из своего конвейера в шаблон.

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

В основном ваш шаблон должен выглядеть следующим образом:

# File: simple-param.yml
parameters:
- name: yesNo # name of the parameter; required
  type: boolean # data type of the parameter; required
  default: false

steps:
    - script: echo ${{ parameters.yesNo }}

И ваш конвейер должен быть таким:

# File: azure-pipelines.yml
trigger:
- master

extends:
    template: simple-param.yml
    parameters:
        yesNo: false # set to a non-boolean value to have the build fail

Обратите внимание на parameters: yesNo: false

Также , Документация по параметрам времени выполнения может предложить вам определить параметры конвейера как явные параметры.

0 голосов
/ 25 марта 2020

Похоже, что parameters в этом случае не требуется, я объединил yaml в один, как показано ниже.

# File: azure-pipelines.yml
trigger:
    - master

steps:
    - script: echo $(testParam)

Обратите внимание на разницу между $(testParam) и ${{ parameters.testParam }}.

Затем я запускаю его из REST API, и он работает совершенно нормально.

enter image description here

...