Выберите конфигурацию сборки в соответствии с именем и параметром ветки

Я использую конвейер сборки Azure для создания приложения DotNet.

До сих пор этот конвейер сборки был настроен для сборки в режиме выпуска.

Я хочу выбрать конфигурацию сборки в зависимости от ветки, на которую была нажата фиксация:

  • develop ветвь → Release режим
  • ветвь функций → режим Debug

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

Вот диаграмма, чтобы показать, что я хотел бы:

введите здесь описание изображения

И вот соответствующий YAML моего конвейера сборки и моей попытки:

parameters:
  - name: buildConfiguration
    displayName: Build Configuration
    default: Default
    values:
      - Default
      - Release
      - Debug

variables:
  - name: runsOnDevelop
    value: ${{ eq( variables['Build.SourceBranch'], 'refs/heads/develop') }}
  - name: defaultConfigurationSelected
    value: ${{ eq(parameters['buildConfiguration'], 'Default') }}
  - name: releaseConfigurationSelected
    value: ${{ eq(parameters['buildConfiguration'], 'Release') }}
  - name: buildForRelease
    value: ${{ or(and( variables.runsOnDevelop, variables.defaultConfigurationSelected), variables.releaseConfigurationSelected )}}
    #value: $[ or(and( variables.runsOnDevelop, variables.defaultConfigurationSelected), variables.releaseConfigurationSelected )] # same result
  - name: buildConfiguration
    ${{ if variables.buildForRelease }}: # Conditional insertion: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/expressions?view=azure-devops#conditional-insertion
      value: 'Release'
    ${{ if not(variables.buildForRelease) }}:
      value: 'Debug'


steps:
  - task: Bash@3
    inputs:
      targetType: 'inline'
      script: 'env | sort'

  - task: DotNetCoreCLI@2
    displayName: 'Build (${{ variables.buildConfiguration }})'
    condition: 
    inputs:
      command: build
      arguments: '--configuration ${{ variables.buildConfiguration }} -p:Version=$(Version)'

  - task: DotNetCoreCLI@2
    displayName: 'Run Tests'
    inputs:
      command: test
      arguments: '--configuration ${{ variables.buildConfiguration }}'

Вывод env | inline показывает, что buildConfiguration всегда равно Release, даже если я заменю длинное выражение, присвоенное buildForRelease, на ${{ false }} или false.

Я подозреваю, что переменная оценивается как строка, а не логическое значение, поэтому and( variables.runsOnDevelop, variables.defaultConfigurationSelected) возвращает значение true.

Заранее спасибо.

РЕДАКТИРОВАТЬ: я пробовал со следующим синтаксисом, не повезло:

  - name: buildForRelease
    value: ${{ or(
        and(
          eq(variables.runsOnDevelop, True),
          eq(variables.defaultConfigurationSelected, True)
        ),
        eq(variables.debugConfigurationSelected, True)
      ) }}
  - name: buildConfiguration
    ${{ if eq(variables.buildForRelease, True) }}:
      value: 'Release'
    ${{ if ne(variables.buildForRelease, True) }}:
      value: 'Debug'

person Hellium    schedule 08.10.2020    source источник


Ответы (1)


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

Просто я нашел небольшую ошибку в вашем обновленном синтаксисе. Вы ошиблись выражением для значения buildForRelease. Второй variables.debugConfigurationSelected должен быть variables.releaseConfigurationSelected

После того, как я изменил его на variables.releaseConfigurationSelected . Это сработало отлично.

 - name: buildForRelease
    value: ${{ or(
        and(
          eq(variables.runsOnDevelop, True),
          eq(variables.defaultConfigurationSelected, True)
        ),
        eq(variables.releaseConfigurationSelected, True)
      ) }}
  - name: buildConfiguration
    ${{ if eq(variables.buildForRelease, True) }}:
      value: 'Release'
    ${{ if ne(variables.buildForRelease, True) }}:
      value: 'Debug'
person Levi Lu-MSFT    schedule 09.10.2020