我正在部署 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
一定有比这更好的方法。请。
没有直接的方法来实现这一点,因为模板表达式是在编译时解析的。
但是我有解决方法,不需要编写额外的 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)
)输出一个变量。在以下作业中,存在评估输出变量的条件。如果条件满足则作业将被执行,如果条件失败则作业将被跳过。
我们决定添加一个 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 可以更轻松地维护不同的环境文件。 希望这可以帮助其他人。