![Azure 部署失败后,我们部署的 AppService 为空](https://linux22.com/image/763945/Azure%20%E9%83%A8%E7%BD%B2%E5%A4%B1%E8%B4%A5%E5%90%8E%EF%BC%8C%E6%88%91%E4%BB%AC%E9%83%A8%E7%BD%B2%E7%9A%84%20AppService%20%E4%B8%BA%E7%A9%BA.png)
我们有一个 Azure DevOps 管道,它首先使用 ARM 模板部署我们的资源,然后使用 zip 文件部署我们的 AppServices。我们已多次运行该管道,应用程序正常运行。
另一次部署尝试后不久,资源的第一次部署步骤失败。部署中的更改不是包含对 AppService 的任何更改。失败的部分是不是AppService(而是我们的数据库),AppService 仍然不可用。而且它似乎已重置为默认托管设置。似乎以前的部署在“/data/SitePackages”文件夹中仍然可用,但“/site/wwwroot”文件夹仅包含默认的“hostingstart.html”文件。
我对增量部署的理解是,如果 AppService 不变,它应该保留所有设置!(因此,之前的部署处于活动状态。)
这是默认行为吗?当部分部署失败时,我们能以某种方式保持先前的应用程序运行吗?我们需要选择另一种部署策略吗?
我们的管道看起来像这样;
jobs:
- deployment: 'Deploy'
environment: '${{ parameters.environment }}' # The environment to use in Azure Devops (controls the required approvals)
variables:
- template: '../variables/deploy-variables.yml'
parameters:
environment: '${{ parameters.environment }}'
strategy:
runOnce:
deploy:
steps:
- task: AzureResourceManagerTemplateDeployment@3
displayName: 'Azure - Deploy resources'
inputs:
deploymentScope: 'Resource Group'
azureResourceManagerConnection: '${{ parameters.azureServiceConnection }}'
subscriptionId: '$(azureSubscriptionId)'
action: 'Create Or Update Resource Group'
resourceGroupName: '$(resourceGroup)'
location: 'West Europe'
templateLocation: 'Linked artifact'
csmFile: '$(Pipeline.Workspace)/drop-resources/files/arm/resources/azuredeploy.json'
csmParametersFile: '$(Pipeline.Workspace)/drop-resources/files/arm/resources/azuredeploy.parameters.json'
deploymentMode: 'Incremental'
- task: AzureWebApp@1
displayName: 'Deploy Service'
inputs:
azureSubscription: '${{ parameters.azureServiceConnection }}'
appName: '$(serviceName)'
package: '$(Pipeline.Workspace)/drop-app/archives/Service.zip'
答案1
这是意料之中的。您的管道正在做两件事,部署应用服务,然后部署您的应用。如果第一部分成功,它将使用默认文件部署应用服务,如果第二步失败,它将保持该状态。
这应该只发生在第一次部署时。如果您运行后续部署,其中第一步成功,它将不会覆盖 Web 应用程序中的现有文件,而是保持原样。如果第二步失败,那么旧文件应该仍然存在,除非第二步部分失败并覆盖了部分文件。
如果你想确保即使文件被覆盖,也可以选择回滚到以前的版本,那么你应该考虑使用部署槽。
答案2
我已经通过将以下应用程序设置添加到资源(arm)部署中来自己解决了这个问题;
"WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true",
"WEBSITE_RUN_FROM_PACKAGE": "1",
这将使当前包保持活动状态,之前我们在包仍然可用时删除了这些应用程序设置。