Azure 部署失败后,我们部署的 AppService 为空

Azure 部署失败后,我们部署的 AppService 为空

我们有一个 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",

这将使当前包保持活动状态,之前我们在包仍然可用时删除了这些应用程序设置。

相关内容