Как я могу изящно отключить веб-приложение во время развертывания Octopus?
Я был немного недостоверным, обнаружив, что Octopus, как ни удивительно, не делает ничего симпатичного или умного об отключении вашего веб-приложения до его обновления.
В нашем решении у нас есть два веб-приложения (веб-сайт и отдельное веб-приложение API), которые полагаются на одну и ту же базу данных, поэтому, пока кто-то обновляется, другой по-прежнему жив, и существует вероятность того, что запросы веб-или API обслуживается во время обновления базы данных.
Не чистый!
Чистота будет для Octopus закрывать веб-приложения, ждать, пока они будут закрыты, а затем продолжить обновление, после чего завершите работу с пулами приложений.
Как это можно достичь?
Ответы
Ответ 1
селфи-ответ!
Легко сделать Octopus-deploy немного осторожным с вашими развертываниями, вам нужно всего лишь несколько дополнительных шагов Execute-Powershell в вашей процедуре развертывания.
Добавьте новый первый шаг, чтобы остановить пул приложений:
# Settings
#---------------
$appPoolName = "PushpayApi" # Or we could set this from an Octopus environment setting.
# Installation
#---------------
Import-Module WebAdministration
# see http://technet.microsoft.com/en-us/library/ee790588.aspx
cd IIS:\
if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
{
Write-Host "AppPool already stopped: " + $appPoolName
}
Write-Host "Shutting down the AppPool: " + $appPoolName
Write-Host (Get-WebAppPoolState $appPoolName).Value
# Signal to stop.
Stop-WebAppPool -Name $appPoolName
do
{
Write-Host (Get-WebAppPoolState $appPoolName).Value
Start-Sleep -Seconds 1
}
until ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Stopped" )
# Wait for the apppool to shut down.
Затем добавьте еще один шаг в конец, чтобы перезапустить пул приложений:
# Settings
#---------------
$appPoolName = "PushpayApi"
# Installation
#---------------
Import-Module WebAdministration
# see http://technet.microsoft.com/en-us/library/ee790588.aspx
cd IIS:\
if ( (Get-WebAppPoolState -Name $appPoolName).Value -eq "Started" )
{
Write-Host "AppPool already started: " + $appPoolName
}
Write-Host "Starting the AppPool: " + $appPoolName
Write-Host (Get-WebAppPoolState $appPoolName).Value
# To restart the app pool ...
Start-WebAppPool -Name $appPoolName
Get-WebAppPoolState -Name $appPoolName
Ответ 2
Подход, который мы предприняли, заключался в том, чтобы развернуть файл _app_offline.htm(Офлайн файл) с приложением. Таким образом, мы получаем хорошее сообщение, объясняющее, почему сайт не работает.
Затем, когда пришло время для развертывания, мы используем Mircrosofts Webdeploy для переименования его в app_offline.htm. Мы поместили код для переименования в powershell script, который запускается как первый шаг нашего развертывания Octopus.
write-host "Website: $WebSiteName"
# Take Website Offline
$path = "$WebDeployPath";
$path
$verb = "-verb:sync";
$verb
# Take root Website offline
$src = "-source:contentPath=```"$WebSiteName/_app_offline.htm```"";
$src
$dest = "-dest:contentPath=```"$WebSiteName/app_offline.htm```"";
$dest
Invoke-Expression "&'$path' $verb $src $dest";
# Take Sub Website 1 offline
$src = "-source:contentPath=```"$WebSiteName/WebApp1/_app_offline.htm```"";
$dest = "-dest:contentPath=```"$WebSiteName/WebApp1/app_offline.htm```"";
Invoke-Expression "&'$path' $verb $src $dest";
$WebSiteName обычно является "веб-сайтом по умолчанию". Также обратите внимание, что `не являются одинарными кавычками, а на самом деле символом обратного хода (обычно с тильдой на клавиатуре).
Теперь, если осьминог развертывает ваш веб-сайт в новом месте, ваш веб-сайт автоматически возвращается в сеть. Если вы этого не хотите, вы можете развернуть новый сайт с файлом app_offline allready на своем месте. Затем вы можете использовать следующий script, чтобы удалить его.
write-host $WebSiteName
# & "c:\Program Files (x86)\IIS\Microsoft Web Deploy V2\msdeploy.exe" -verb:delete -dest:contentPath="$WebSiteName/app_offline.htm"
# those arn't QUOTES!!!!, they are the back accent thing.
write-host "Website: $WebSiteName"
# Put Web app Online.
$path = "$WebDeployPath";
$path
$verb = "-verb:delete";
$verb
$dest = "-dest:contentPath=```"$WebSiteName/app_offline.htm```"";
$dest
Invoke-Expression "&'$path' $verb $dest";
# Put Sub Website Online
$dest = "-dest:contentPath=```"$WebSiteName/WebApp1/app_offline.htm```"";
Invoke-Expression "&'$path' $verb $dest";
Ответ 3
Остановка приложения и/или настройка файла App_Offline для меня недостаточна. Оба не дали правильное объяснение клиентам, почему сайт не работает. Особенно App_Offline. Мне нужно очистить папку bin, и это вызывает YSOD (http://blog.kurtschindler.net/more-app_offline-htm-woes/).
Мое решение:
Первая задача перенаправляет развернутый сайт в другую папку, содержащую только index.html с правильным сообщением. Последняя задача возвращает исходную папку.
Ответ 4
Лучшим решением было бы использовать балансировщик сетевой нагрузки, такой как f5 LTM. Вы можете настроить несколько серверов для приема трафика для своего сайта, а затем, когда вы развертываете, вы можете просто отключить один node в NLB, чтобы весь другой трафик перешел на другой компьютер.
Мне нравится f5, потому что он очень доступен для сценариев. Когда мы используем наши веб-сайты, мы не берем никаких отступов. весь трафик на сайт просто указывается на сервер, который в настоящее время не обновляется.
Есть оговорки:
Вы должны script отключить запрет элемента пула в NLM, чтобы он работал с вашим сайтом. Если на вашем сайте требуются сеансы (например, в зависимости от состояния сеанса или общих объектов), тогда вам нужно будет сбрасывать трафик с узлов NLB. в f5 вы можете просто отключить их, а затем следить за тем, чтобы количество подключений было равным нулю (также доступно для сценариев).
Вы должны применять политику в своих девелоперах /dbas, которая заявляет, что все изменения базы данных НЕ ДОЛЖНЫ вызывать деградацию или сбой в существующем коде. Это означает, что вы должны быть очень осторожны с базами данных и конфигурациями. Таким образом, вы можете обновлять свои базы данных, прежде чем начать развертывание в первом пуле вашего сайта.