После неудачного развертывания Azure развернутая служба приложений пуста.

У нас есть конвейер Azure DevOps, который сначала развертывает наши ресурсы с помощью ARM-шаблонов, а затем развертывает наши AppServices с помощью zip-архивов. Мы запускали конвейер несколько раз, и приложение работает правильно.

Через некоторое время при другой попытке развертывания первый этап развертывания (ресурсов) завершается неудачно. Изменения в развертывании не содержат никаких изменений в 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'

2 ответа

Это ожидаемо. Ваш конвейер делает две вещи: развертывает службу приложений, а затем развертывает ваше приложение. Если первая часть выполнена успешно, служба приложений развертывается с файлами по умолчанию, а если второй шаг завершится неудачей, она останется в этом состоянии.

Это должно происходить только при первом развертывании. Если вы запустите последующее развертывание, при котором первый шаг будет успешным, существующие файлы в веб-приложении не будут перезаписаны, а останутся как есть. Если ваш второй шаг не удался, старые файлы все равно должны быть там, если только ваш второй шаг не завершился неудачно и некоторые файлы не были перезаписаны.

Если вы хотите иметь возможность вернуться к предыдущей версии, даже если файлы будут перезаписаны, вам следует рассмотреть возможность использования слотов развертывания.

Я сам решил эту проблему, добавив следующие настройки приложения в развертывание ресурса (рука);

      "WEBSITE_ENABLE_SYNC_UPDATE_SITE": "true",
"WEBSITE_RUN_FROM_PACKAGE": "1",

При этом текущий пакет остается активным, ранее эти настройки приложения были удалены, пока пакет был еще доступен.

Другие вопросы по тегам