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

gijlo24d  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(83)

我正在部署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

一定有比这更好的办法。拜托。

6za6bjd0

6za6bjd01#

没有直接的方法来实现这一点,因为模板表达式是在编译时解析的。
但是我有一个解决方案,它不需要编写额外的ps脚本,避免每次都对文件进行更改并将其检入到您的repo中。
因为所有的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流水线使用依赖关系和条件。第一个作业A会根据你在运行流水线时指定的变量(例如$(connection))输出一个变量。在下面的作业中,有条件来评估输出变量。如果条件满足,则执行作业,如果条件失败,则跳过作业。

7lrncoxx

7lrncoxx2#

我们决定添加一个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更容易维护不同的环境文件。希望这对其他人有帮助。

相关问题