如何在使用 VSTS 的持续部署中将一个 ARM 模板的输出传递给下一个 ARM 模板的输入参数?

Posted

技术标签:

【中文标题】如何在使用 VSTS 的持续部署中将一个 ARM 模板的输出传递给下一个 ARM 模板的输入参数?【英文标题】:How to pass the output of one ARM template to the input parameter of the next ARM template in Continuous Deployment using VSTS? 【发布时间】:2018-04-10 17:32:08 【问题描述】:

我有一个 ServiceBuswithQueue ARM 模板,它的输出部分如下所示:

  "outputs": 
    "serviceBusNamespaceName": 
      "type": "string",
      "value": "[parameters('serviceBusNamespaceName')]"
    ,
    "namespaceConnectionString": 
      "type": "string",
      "value": "[listkeys(variables('authRuleResourceId'), variables('sbVersion')).primaryConnectionString]"
    ,
    "sharedAccessPolicyPrimaryKey": 
      "type": "string",
      "value": "[listkeys(variables('authRuleResourceId'), variables('sbVersion')).primaryKey]"
    ,
    "serviceBusQueueName": 
      "type": "string",
      "value": "[parameters('serviceBusQueueName')]"
    
  

为此,我在 VSTS 中创建了持续集成 (CI) 和持续部署 (CD),在 CD 中,我使用 PowerShell 任务来部署上述 ARM 模板。但我想将这个 ARM 模板的输出(如“$(serviceBusQueueName)”)传递给持续部署中下一个 ARM 模板的输入参数。

知道上述场景可以在持续部署中的两个 ARM 任务之间使用 ARM 输出来实现。但我不想要它,因为目前我正在使用 PowerShell 任务来部署 ARM 模板。

在发布此问题之前,我进行了研究并找到了以下链接,但这些链接对解决我的问题没有帮助。

Azure ARM templates - using the output of other deployments

How do I use ARM 'outputs' values another release task?

谁能建议我如何解决上述问题?

【问题讨论】:

您的意思是在 PowerShell 任务中一起部署 ARM 模板? 是的 Starian,目前我正在使用 PowerShell 任务来部署 ARM 模板。 可以直接使用输出吗?例如:$r=New-AzureRmResourceGroupDeployment ....,则可以在示例脚本中直接访问$r。 @starianchen-MSFT,实际上我的第一个 ARM 模板将输出为“serviceBusNamespaceName”。但我想将第一个 ARM 模板的输出用作下一个 ARM 模板的输入参数。 您可以覆盖参数。 【参考方案1】:

您可以通过指定相应的参数来覆盖参数。

Override template parameter in the script

【讨论】:

【参考方案2】:
# Start the deployment
Write-Host "Starting deployment...";
$outputs = New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGroupName -Mode Incremental -TemplateFile $templateFilePath -TemplateParameterFile $parametersFilePath;

foreach ($key in $outputs.Outputs.Keys)
    $type = $outputs.Outputs.Item($key).Type
    $value = $outputs.Outputs.Item($key).Value
    Write-Host "##vso[task.setvariable variable=$key;]$value"

您可以在后续脚本中显示所有环境变量:

Write-Host "Environment variables:"
gci env:* | sort-object name

【讨论】:

以上是关于如何在使用 VSTS 的持续部署中将一个 ARM 模板的输出传递给下一个 ARM 模板的输入参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用服务挂钩从VSTS触发内部部署jenkins作业

如何通过 VSTS 部署流分析作业?

VSTS 部署组的 NSG 出站规则

VSTS 发布:提高发布质量指标

VSTS 发布自动部署完成失败警报

持续集成配置之Nuget