我们有一个 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'
这是意料之中的。您的管道正在做两件事,部署应用服务,然后部署您的应用。如果第一部分成功,它将使用默认文件部署应用程序服务,如果您的第二步失败,那么它将保持该状态。
这应该只在第一次部署时发生。如果您在第一步成功的情况下运行后续部署,它不会覆盖 Web 应用程序中的现有文件,它将保持原样。如果您的第二步失败,那么旧文件应该仍然存在,除非您的第二步中途失败并覆盖了一些文件。
如果您想确保即使文件确实被覆盖,您也可以选择回滚到以前的版本,那么您应该考虑使用部署槽。
通过将以下应用程序设置添加到资源(臂)部署中,我自己解决了这个问题;
这使当前包保持活动状态,以前我们在包仍然可用时删除了这些应用程序设置。