根据租户选择的 if else 逻辑选择 Azure DevOps 服务连接

Selecting Azure DevOps service connection based on if else logic for tenant selection

我正在尝试 select 基于 if else 逻辑的服务连接。

我有以下两条管道 azure-caller.yml 和 template.yaml。

azure-caller.yml

parameters:
  - name: directory
    displayName: 'select appropriate environment directory' 
    values:
      - Dev
      - Stage
  

stages:
- template: job-templates/template.yml
  parameters:
    selectdirectory: $(select-directory)

template.yml

parameters:
  selectdirectory: default

stages:
  - stage: A
    variables:
    - name: service-connection
      ${{ if eq(parameters.selectdirectory, 'Dev') }}:
        value: Dev-Service-connection
      ${{ elseif eq(parameters.selectdirectory, 'Stage') }}:
        value: Stage-Service-connection
    jobs:

    - job: Install_terraform
      displayName: Intialize Terraform
      continueOnError: true
      steps:
        - checkout: self
        - task: TerraformInstaller@0
          inputs:
            terraformVersion: '1.0.5'

    - job: Validate_terraform_Plan
      displayName: Validate Terraform
      continueOnError: true
      dependsOn: Install_terraform

      steps:
        - checkout: self

        - task: TerraformTaskV2@2
          inputs:
            provider: 'azurerm'
            command: 'init'
            backendServiceArm: ${{ variables.service-connection }}
            backendAzureRmResourceGroupName: 'any-rg'
            backendAzureRmStorageAccountName: 'any-storage'
            backendAzureRmContainerName: 'statefile'
            backendAzureRmKey: abcd.tfstate

        - task: TerraformTaskV2@2
          displayName: 'plan'
          inputs:
            provider: 'azurerm'
            command: 'plan'
            commandOptions: '-out="plan.out"' 
            environmentServiceNameAzureRM: ${{ variables.service-connection }}


我的任务失败了,因为它在编译时获取服务连接的值,该值是空的。 Azure Caller 是一个 wrapper/main 管道,模板是唯一允许使用 Dev 或 Stage 服务连接进行部署以实现安全性的管道。有办法实现吗?

您的意见将很有帮助。谢谢

你检查过这个答案了吗:AzureDevops: Can we pass dynamic value as service connection in yaml

本质上,而不是通过 if 语句传递您的服务连接名称,将服务连接名称存储在 variable.yml 文件中,该文件由您选择的目录确定,并将加载适当的服务连接名称。

不支持有条件地动态指定管道变量的值。

在YMAL流水线中,可以使用if条件判断是否使用流水线变量。您不能使用它来判断给管道变量指定一个值还是另一个值。

但是,您可以根据任务条件动态设置输入。参见“Conditionally set a task input”。

您也可以有条件地动态指定参数值。

下面是一个有条件地动态指定参数值的例子。您可以参考它来更改您的 YAML 文件。

  • template.yml
parameters:
- name: ServiceConnection
  type: string

stages:
- stage: A
  displayName: 'Stage A'
  jobs:
  - job: A1
    displayName: 'Job A1'
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: Bash@3
      displayName: 'Show parameter value'
      inputs:
        targetType: inline
        script: echo "The value of ServiceConnection is ${{ parameters.ServiceConnection }}"
  • azure-pipelines.yml
parameters:
- name: directory
  displayName: 'Select appropriate environment directory:'
  type: string
  values:
  - Dev
  - Stage

stages:
- template: template.yml
  parameters:
    ${{ if eq(parameters.directory, 'Dev') }}:
      ServiceConnection: Dev-Service-connection
    ${{ if eq(parameters.directory, 'Stage') }}:
      ServiceConnection: Stage-Service-connection
  • 结果

[更新]

根据任务动态设置输入条件。

  • template.yml
parameters:
- name: selectdirectory
  type: string

stages:
- stage: A
  displayName: 'Stage A'
  jobs:
  - job: Validate_terraform_Plan
    displayName: 'Validate Terraform'
    . . .
    steps:
    . . .

    - task: TerraformTaskV2@2
      inputs:
        provider: 'azurerm'
        command: 'init'
        ${{ if eq(parameters.selectdirectory, 'Dev') }}:
          backendServiceArm: Dev-Service-connection
        ${{ if eq(parameters.selectdirectory, 'Stage') }}:
          backendServiceArm: Stage-Service-connection
        backendAzureRmResourceGroupName: 'any-rg'
        backendAzureRmStorageAccountName: 'any-storage'
        backendAzureRmContainerName: 'statefile'
        backendAzureRmKey: abcd.tfstate

. . .
  • azure-pipelines.yml
parameters:
- name: directory
  displayName: 'Select appropriate environment directory:'
  type: string
  values:
  - Dev
  - Stage

stages:
- template: template.yml
  parameters:
    selectdirectory: ${{ parameters.directory }}