根据分支名称和参数选择构建配置

Choose build configuration according to branch name & parameter

我正在使用 Azure 构建管道构建 DotNet 应用程序。

到目前为止,此构建管道配置为在发布模式下构建。

我想要的是 select 构建配置取决于已推送提交的分支:

由于我可以在触发手动构建之前选择一个参数,因此我也想覆盖此行为。

这是一张图表来展示我想要的:

这是我的构建管道和尝试的相关 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) return 为真。

提前致谢。

编辑:我尝试使用以下语法,但没有成功:

  - 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'

您更新后的语法是正确的。

我只是在您更新的语法中发现了一个小错误。您弄错了 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'