После неудачного развертывания 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",
При этом текущий пакет остается активным, ранее эти настройки приложения были удалены, пока пакет был еще доступен.