Невозможно использовать предопределенную переменную — ['System.PullRequest.targetBranchName'] в ADO во время условия выбора конкретной среды

У меня есть требование запускать конвейер, когда в ADO создается запрос на извлечение, и когда запущенный конвейер достигает успеха, будет обработано слияние (с использованием политик ветвей). значением по умолчанию для параметра среды является NONPROD, но при автоматическом срабатывании конвейера я хочу выбрать другую среду на основе целевой ветки, например NFT для разработки и PROD для основной.

Я попытался с помощью приведенного ниже кода установить переменную и попробовал условный параметр с предопределенной переменной ['System.PullRequest.targetBranchName'], но похоже, что я могу видеть ожидаемую целевую ветвь на выходе, но условие не выполняется.

variables:
  - name: mode
    value: 'apply'
  - name: environment
    ${{ if eq( variables['System.PullRequest.targetBranchName'], 'main' ) }} : 
      value: 'PROD'
    ${{ if eq( variables['System.PullRequest.targetBranchName'], 'develop' ) }} : 
      value: 'NFT'
    ${{ else }}:
      value: 'NONPROD'

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

stages:
  - stage: setprerequisites
    displayName: "setprerequisites"
    jobs:
      - job: checkvariables
        displayName: "check variables"
        steps:
          - script: |
                   echo "source working directory               --> $(System.DefaultWorkingDirectory)"
                   echo "selected default environmentparameter  --> ${{ parameters.environment }}"
                   echo "selected environment from variables    --> $(environment)"
                   echo "target branch                          --> $(System.PullRequest.targetBranchName)"
                   echo "selected terraform mode to apply       --> ${{ parameters.mode }}"
                   echo "terraform ${{ parameters.mode }} will be applied on $(environment) environment"

Ниже приведен вывод:

  • выбранная среда из переменных --> NONPROD
  • целевая ветка -> разработать
  • выбранный режим терраформирования для применения --> применить

заранее спасибо


65
1

Ответ:

Решено

Согласно предопределенным переменным , переменная System.PullRequest.targetBranchName недоступна в шаблонах, поэтому следующее не будет работать:

${{ if eq( variables['System.PullRequest.targetBranchName'], 'main' ) }}

Вместо этого вы должны использовать синтаксис макроса $(var) или выражение времени выполнения $[variables.var].

Пример

Установка выходной переменной конвейера с именем ENVIRONMENT и отображение ее в консоли:

trigger: none

stages:
  - stage: setprerequisites
    displayName: "setprerequisites"
    jobs:
      - job: checkvariables
        displayName: "check variables"
        steps:
          - script: |
              TARGET_BRANCH='$(System.PullRequest.targetBranchName)'

              if [ $TARGET_BRANCH == "main" ]; then
                echo "Found branch 'main', setting the environment to PROD"
                echo "##vso[task.setvariable variable=ENVIRONMENT;isOutput=true]PROD"
              elif [ $TARGET_BRANCH == "develop" ]; then
                echo "Found branch 'develop', setting the environment to NFT"
                echo "##vso[task.setvariable variable=ENVIRONMENT;isOutput=true]NFT"
              else
                echo "Couldn't find branches 'main' nor 'develop'. Setting the environment to NONPROD"
                echo "##vso[task.setvariable variable=ENVIRONMENT;isOutput=true]NONPROD"
              fi
            displayName: "Set environment"
            name: SetEnvironment

          - script: |
              echo "selected environment from variables --> $(SetEnvironment.environment)"
            displayName: Check variables

Запуск конвейера как часть запроса на включение (целевая ветка: разработка):

Запуск конвейера вручную:

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

Чтобы узнать, как использовать переменную на другом задании/этапе, обратитесь к разделу Уровни выходных переменных.