[英]Azure DevOps Release Pipeline - How to set and pass values in variables in pipeline with Azure Powershell
[英]How to pass environment specific values to Azure pipeline?
我正在部署 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 管道使用依賴項和條件。 第一個作業 A 將根據您在運行管道時指定的變量(例如$(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 可以更輕松地維護不同的環境文件。 希望這可以幫助其他人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.