如何在VSTS中使用Azure App Service Deploy任务部署至多个Web App
好问题!我之前刚好处理过类似的场景,给你分享两个可行的方案,你可以根据自己的需求选择:
方案一:利用ARM模板输出的动态Web App列表循环部署
这个方案最灵活,因为它直接复用ARM模板创建Web App时的输出,不需要手动维护Web App名称列表:
修改ARM模板添加输出
在你的ARM模板的outputs节点中,添加一个输出项,把所有通过copy创建的Web App名称以数组形式输出:"outputs": { "webAppNames": { "type": "array", "value": "[copyList('webAppCopy', variables('webAppNamePrefix'))]" } }注意:这里的
webAppCopy要和你ARM模板中copy块的name属性一致,webAppNamePrefix是你定义的Web App名称前缀变量。在VSTS发布流程中捕获ARM输出
找到你的Azure Resource Group Deployment任务,勾选“Output variables”选项,设置一个变量名称(比如armDeploymentOutputs),这样发布流程就能获取到ARM模板输出的数组。添加循环任务遍历部署
在ARM部署任务之后,添加一个For each循环任务,设置循环的数据源为:$(armDeploymentOutputs.webAppNames)然后在循环内部添加
Azure App Service Deploy任务,将App Service Name字段设置为$(item)(代表循环中的当前Web App名称),其余配置和DEV环境的部署任务保持一致即可。
方案二:手动定义Web App列表循环部署
如果你的UAT环境Web App名称是固定的,也可以直接在发布变量中定义列表,再循环部署:
添加发布变量
在你的UAT发布阶段的变量中,添加一个变量(比如UATWebAppNames),值为所有Web App的名称,用逗号分隔,例如:app-uat-eastus,app-uat-westus,app-uat-southcentralus添加循环任务遍历部署
添加For each循环任务,设置循环的数据源为:@split(variables('UATWebAppNames'), ',')同样在循环内部放置
Azure App Service Deploy任务,App Service Name填写$(item),配置和DEV环境一致。
额外注意事项
- 确保循环任务中的Azure订阅、资源组配置和ARM部署任务完全匹配,否则会出现找不到Web App的错误。
- 可以在循环内部添加一个
PowerShell或Bash任务,输出当前部署的Web App名称(比如Write-Host "正在部署Web App: $(item)"),方便后续排查发布问题。 - 如果你的Web App分布在不同的资源组,那需要在ARM输出中同时包含资源组名称,或者在变量中定义名称+资源组的组合(比如
app-uat-eastus|rg-uat-eastus),然后在循环中拆分使用。
内容的提问来源于stack exchange,提问作者ossentoo

