如何将特定于环境的值传递给 Azure 管道?

问题描述 投票:0回答:2

我正在部署 Service Fabric 应用程序包,我有几个(~15)个开发测试环境,其中任何一个都可用于测试代码修复。我可以传入服务连接,因此部署最终包不是问题。我想不通的是如何根据目标环境设置其他环境特定变量。 我尝试使用服务连接名称来选择几个变量模板文件之一:

variables:
- name: envTemplateFileTest
  ${{ if eq( variables['DevConnection'], 'Environ01' ) }}:
    value: ../Templates/DEV01-Variables-Template.yml
  ${{ if eq( variables['DevConnection'], 'Environ02' ) }}:
    value: ../Templates/DEV02-Variables-Template.yml

... (snip) ...

variables:
  - template: ${{ variables.envTemplateFile }}

但是UI变量并没有在编译时设置。所以模板表达式看到空值并失败。

我可以使用管道变量,但是 QA 必须在每次他们想要部署到与上次不同的环境时更改文件并检查它。

我目前拥有的是一个空变量模板和一个根据不同脚本名称设置值的 powershell 脚本。

        - task: PowerShell@2
          inputs:
            targetType: 'filePath'
            filePath: '$(Build.ArtifactStagingDirectory)\drop\Deployment\Code\Scripts\Set-$(DevConnection)Variables.ps1'
            #arguments: # Optional
          displayName: Set environment variables

一定有比这更好的方法。请。

azure yaml azure-pipelines
2个回答
1
投票

没有直接的方法来实现这一点,因为模板表达式是在编译时解析的。

但是我有解决方法,不需要编写额外的 ps 脚本并避免更改文件并每次都将其签入您的存储库。

因为你所有的开发测试环境都有相同的部署步骤。然后你可以创建步骤模板 yaml 来保存部署步骤。

然后你可以像下面的例子一样修改你的 azure-pipelines.yml:

jobs:
- job: A
  pool:
    vmImage: 'windows-latest'

  steps:
  - powershell: |
      $con = "$(connection)" 
      if($con -eq "environ1"){echo "##vso[task.setvariable variable=variablegroup;isOutput=true]environ1"}
      if($con -eq "environ2"){echo "##vso[task.setvariable variable=variablegroup;isOutput=true]environ2"}
    name: setvarStep
  - script: echo '$(setvarStep.variablegroup)'
  

- job: environ1
  pool:
    vmImage: 'windows-latest'
  dependsOn: A
  condition: eq(dependencies.A.outputs['setvarStep.variablegroup'], 'environ1')
  variables: 
    - template: environ1.yaml
  steps:
  - template: deploy-jobs.yaml
  
  
- job: environ2
  pool:
    vmImage: 'windows-latest'
  dependsOn: A
  condition: eq(dependencies.A.outputs['setvarStep.variablegroup'], 'environ2')
  variables: 
    - template: environ2.yml
  steps:
  - template: deploy-jobs.yaml

上面的 yml 管道使用 dependencies 和 condition。第一个作业A会根据你在运行流水线时指定的变量(eg.

$(connection)
)输出一个变量。在以下作业中,存在评估输出变量的条件。如果条件满足则作业将被执行,如果条件失败则作业将被跳过。


0
投票

我们决定添加一个 Powershell 脚本步骤,根据传入的字符串设置变量。

    - task: PowerShell@2
      inputs:
        targetType: 'filePath'
        filePath: $(Build.ArtifactStagingDirectory)\drop\Deployment\Code\Scripts\Set-DefaultValues.ps1
      displayName: Set default pipeline variables

然后我们加载适当的文件并循环遍历变量,依次设置每个变量。

param(
  [string]
  $EnvironmentName
)

$environmentValues = @{}

switch ($EnvironmentName) {
  'DEV98' { . '.\Dev98-Values.ps1'}
  'DEV99' { . '.\Dev99-Values.ps1'}
}

foreach ($keyName in $environmentValues.Keys) {
  Write-Output "##vso[task.setvariable variable=$($keyName)]$($environmentValues[$keyName])"
}

这允许我们将环境特定变量放在一个普通的 PSCustom 对象文件中并点导入它。

$environmentValues = @{
    currentYear = '2020';
    has_multiple_nodetypes = 'false';
    protocol = 'http';
    endpoint = 'vm-dev98.cloudapp.com';
    ... snip ...
}

因此 QA 可以更轻松地维护不同的环境文件。 希望这可以帮助其他人。

© www.soinside.com 2019 - 2024. All rights reserved.