Как я могу изящно отключить веб-приложение во время развертывания 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, которая заявляет, что все изменения базы данных НЕ ДОЛЖНЫ вызывать деградацию или сбой в существующем коде. Это означает, что вы должны быть очень осторожны с базами данных и конфигурациями. Таким образом, вы можете обновлять свои базы данных, прежде чем начать развертывание в первом пуле вашего сайта.