Azure发布流水线同一App Service部署不同名WebJob避免覆盖问题咨询
问题根因
默认Azure App Service部署任务启用了部署时删除目标服务器上不存在于当前部署包的文件规则。你每个阶段生成的部署包内仅包含当前阶段对应的SampleWebJob_{阶段名}文件夹,所以后序阶段部署时会将前序阶段已经上传的其他WebJob文件夹判定为冗余文件直接删除。
可行解决方案
方案1:修改部署任务规则,关闭冗余文件删除
改动最小的方案,直接调整Azure App Service Deploy任务配置即可:
- 可视化界面配置:找到任务中的「部署时删除目标上的其他文件」复选框,取消勾选
- YAML配置:在
AzureWebApp@1任务中添加参数removeAdditionalFilesFlag: false - 自定义Web Deploy参数场景:直接添加规则参数
-enableRule:DoNotDeleteRule
注意:该方案的副作用是废弃的WebJob需要手动删除,不会被部署任务自动清理。
方案2:通过Kudu API单独上传WebJob(更稳定,不影响站点其他文件)
不使用全量站点部署逻辑,直接调用App Service的Kudu接口单独上传对应阶段的WebJob到指定路径,完全不会触碰其他已存在的WebJob文件,步骤如下:
- 在任务组中替换原有的Azure App Service Deploy步骤,改用Azure PowerShell/CLI任务
- 运行脚本将重命名后的WebJob文件夹打包为zip,调用Kudu的zip部署接口上传到指定路径:
# 示例PowerShell脚本 $webJobName = "SampleWebJob_$(Release.EnvironmentName)" $zipPath = "$(System.DefaultWorkingDirectory)/$webJobName.zip" Compress-Archive -Path "$(ArtifactPath)/triggered/$webJobName/*" -DestinationPath $zipPath -Force # 获取Kudu发布凭证 $resourceGroupName = "你的资源组名" $appServiceName = "你的App Service名" $creds = Get-AzWebAppPublishingCredential -ResourceGroupName $resourceGroupName -Name $appServiceName $base64Auth = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("$($creds.PublishingUserName):$($creds.PublishingPassword)"))) # 上传到对应WebJob路径,triggered对应触发式WebJob,continuous对应持续式WebJob $apiUrl = "https://$appServiceName.scm.azurewebsites.net/api/zip/site/wwwroot/App_Data/jobs/triggered/$webJobName/" Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64Auth)} -Method Put -InFile $zipPath -ContentType "multipart/form-data"
方案3:提前打包所有阶段的WebJob到部署包
如果一定要用全量部署逻辑,可以在构建阶段就把所有阶段的WebJob都生成好放到同一个部署包内,每个阶段部署时不会删除其他阶段的文件,但该方案灵活性较低,新增阶段需要同步修改构建逻辑。
验证步骤
配置完成后依次触发dev、test阶段部署,完成后进入App Service的「高级工具(Kudu)」页面,打开site/wwwroot/App_Data/jobs/triggered/路径,确认两个WebJob文件夹都存在即可。
内容的提问来源于stack exchange,提问作者Nasir
相关产品推荐
相关产品推荐

