Как ссылаться на матричную переменную Azure DevOps внутри выражения? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь выяснить, как получить доступ к матричной переменной Azure DevOps в выражении времени компиляции. Ссылочное значение всегда нулевое / пустое / отсутствует. Как будто переменная не была установлена.

вот пример файла yml, который я пробовал:


jobs:
- job: LinuxBuild
  displayName: Pew Pew
  strategy:
    matrix:
      debugJob:
        buildConfiguration: Debug
      releaseJob:
        buildConfiguration: Release
  pool:
    vmImage: 'ubuntu-16.04'

 steps:
  - script: echo ${{variables.debugJob.buildConfiguration}} ## <-- always null/empty

  - script: echo ${{variables['debugJob.buildConfiguration']}}  ## <-- always null/empty

  - ${{ if eq(variables.debugJob.buildConfiguration, 'Debug') }}: ## <-- never ran/executed
    - template: doSomething.yml@templates

1 Ответ

1 голос
/ 08 апреля 2020

Для ключевых слов Matrix он используется для расширения мультиконфигов в несколько заданий времени выполнения. Другими словами, YAML, который содержит ключевые слова Matrix, будет расширен в время выполнения вместо parse time. Таким образом, переменная buildConfiguration является переменной времени выполнения , и она недоступна во время компиляции, также не может быть получена тогда.

Кроме того, ${{ }} - это формат для обработки переменных в время компиляции .

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


Итак, чтобы распечатать значение buildConfiguration, вам нужно использовать формат $()

Измените свой YAML-скрипт на:

jobs:
- job: LinuxBuild

  displayName: Pew Pew
  strategy:
    matrix:
      debugJob:
        buildConfiguration: Debug
      releaseJob:
        buildConfiguration: Release
  pool:
    vmImage: 'ubuntu-16.04'

  steps:
  - script: echo $(buildConfiguration) 

  - script: echo "hello"
    condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))

Теперь давайте сосредоточимся на еще одной вашей попытке: - ${{ if eq(variables.debugJob.buildConfiguration, 'Debug') }}:.

Во-первых, вам нужно знать, что ${{ if xxx }}, это template expression, обработанный во время времени компиляции . Это означает, что система go проанализирует значение, а затем решит, следует ли запускать следующие шаги / задания / шаблоны. Этот процесс происходит до запуска трубопровода. Мы называем это начальный шаг.

Как я уже упоминал выше, buildConfiguration - это переменная времени выполнения . Это доступно только во время выполнения. Таким образом, его значение не может быть получено во время компиляции. Во время компиляции его значение будет проанализировано в null. Вот почему ваш шаблон никогда не запускается.

Существует 2 способа обойти это условие.

1) Измените на использование другой переменной в условии тот, который может быть доступен как во время компиляции, так и во время выполнения. например, Build.SourceBranchName.

2) Разделить условие и заменить его на задачи condition, определенные в файле yml шаблона.

Как:

  - script: echo "hello"
    condition: and(succeeded(), eq(variables.buildConfiguration, 'Debug'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...