如何在Azure中为每个Pull Request创建独立唯一的预览部署
在Azure中实现PR专属预览部署的方案
方案一:利用Azure App Service部署槽(推荐)
这是最贴合现有Web App架构的方案,每个PR对应一个独立的部署槽,自动生成唯一子域名。
开启部署槽功能
登录Azure门户,进入你的Web App(appname-dev-preview),找到「部署槽」选项,启用该功能。修改Azure Pipeline配置
- 获取PR编号:Pipeline中可直接使用内置变量
$(System.PullRequest.PullRequestId)获取当前触发的PR编号。 - 自动创建/选择部署槽:
- 使用Azure Web App部署任务时,指定部署槽名称为
pr-$(System.PullRequest.PullRequestId),部分任务支持自动创建不存在的槽;若不支持,可添加Azure CLI步骤提前创建:az webapp deployment slot create --name appname-dev-preview --resource-group <你的资源组名称> --slot pr-$(System.PullRequest.PullRequestId)
- 使用Azure Web App部署任务时,指定部署槽名称为
- 部署镜像到对应槽:
在部署Docker镜像的步骤中,指定目标槽为pr-$(System.PullRequest.PullRequestId),同时给镜像打上PR编号的标签(如acr-name.azurecr.io/appname:pr-$(System.PullRequest.PullRequestId)),确保每个PR的镜像唯一。 - PR关闭后清理资源:
创建一个由PR关闭事件触发的Pipeline,执行以下命令删除对应部署槽:az webapp deployment slot delete --name appname-dev-preview --resource-group <你的资源组名称> --slot pr-$(System.PullRequest.PullRequestId)
- 获取PR编号:Pipeline中可直接使用内置变量
预览URL格式:每个PR的预览地址为
https://pr-<PR编号>.appname-dev-preview.azurewebsites.net,完全唯一且无需额外配置域名。
方案二:使用Azure Container Apps
如果希望完全隔离每个PR的运行环境,可以用Container Apps为每个PR创建独立实例。
- 提前准备:创建一个Azure Container Apps环境,用于托管所有PR预览实例。
- Pipeline配置:
- PR触发时,生成唯一实例名称:
appname-pr-$(System.PullRequest.PullRequestId)。 - 使用Azure CLI创建Container App并部署镜像:
az containerapp create --name appname-pr-$(System.PullRequest.PullRequestId) --resource-group <你的资源组名称> --environment <Container Apps环境名称> --image acr-name.azurecr.io/appname:pr-$(System.PullRequest.PullRequestId) --ingress external --target-port 3000 - PR关闭时,删除对应的Container App实例:
az containerapp delete --name appname-pr-$(System.PullRequest.PullRequestId) --resource-group <你的资源组名称> --yes
- PR触发时,生成唯一实例名称:
- 预览URL格式:默认生成
https://appname-pr-<PR编号>.<环境后缀>.azurecontainerapps.io,也可绑定自定义子域名。
关键注意事项
- 资源配额:部署槽或Container Apps实例会占用资源,需确保你的Azure订阅配额足够,同时通过清理步骤避免闲置资源浪费。
- 变量权限:确保Pipeline服务主体拥有创建/删除部署槽或Container Apps的权限。
- 测试集成:可在部署完成后,将预览URL传入E2E测试步骤,直接针对PR专属环境执行测试。
内容的提问来源于stack exchange,提问作者Ala Eddine Menai
相关产品推荐
相关产品推荐

