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

时间:2020-01-08 15:03:04

标签: azure yaml azure-pipelines

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

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变量。因此模板表达式看到空白值并失败。

我可以使用管道变量,但是质量检查人员必须在每次要部署到与上次不同的环境时进行文件更改并进行检查。

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

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

必须有一个比这更好的方法。拜托。

2 个答案:

答案 0 :(得分:0)

由于template expression是在编译时进行解析的,因此没有直接的方法来实现。

但是我有一种解决方法,无需编写其他ps脚本,并且避免进行文件更改并将其每次都检入到您的仓库中。

由于所有devtest环境都具有相同的部署步骤。然后,您可以创建步骤模板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管道上方使用depenpencies and condition。第一个作业A将根据您在运行管道时指定的变量(例如$(connection))输出一个变量。在以下作业中,存在一些条件来评估输出变量。如果满足条件,则将执行作业,如果条件失败,则将跳过该作业。

答案 1 :(得分: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 ...
}

因此,质量检查人员可以更轻松地维护不同的环境文件。 希望这可以帮助其他人。