2013-11-17 5 views
15

Я был немного недостоверным, чтобы найти, что Осьминог, как ни удивительно, не делает ничего симпатичного или умного об отключении вашего веб-приложения до его обновления.Как изящно использовать веб-приложение в автономном режиме во время развертывания Octopus?

В нашем решении у нас есть два веб-приложения (веб-сайт и отдельное веб-приложение API), которые полагаются на одну и ту же базу данных, поэтому, пока один из них обновляется, другой по-прежнему жив, и есть потенциал, который требует веб-или API-запрос все еще обслуживается во время обновления базы данных.

Не чистый!

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

Как это можно достичь?

+0

Что такое осьминог? есть ли свободное сообщество? – Kiquenet

+1

Octopus Deploy http://octopusdeploy.com/ –

ответ

15

Selfie-answer!

Легко сделать Octopus-развертывание немного осторожнее с вашими развертываниями, все, что вам нужно, это пара дополнительных 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 
+0

Значит ли это, что пользователь получает ошибку сервера 503 в своем браузере во время развертывания? – Savage

11

Подход, который мы приняли было развернуть файл _app_offline.htm (App Offline) с приложением. Таким образом, мы получаем хорошее сообщение, объясняющее, почему сайт не работает.

Затем, когда пришло время для развертывания, мы используем Mircrosofts Webdeploy для переименования его в app_offline.htm. Мы помещаем код для переименования в сценарий powershell, который запускается как первый шаг нашего развертывания 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 на своем месте. Затем вы можете использовать следующий скрипт, чтобы удалить его.

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"; 
+1

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

+2

Так звучит, как идеальный подход - использовать оба? –

+0

Может создать пул приложений temp для размещения 'app_offline.htm'. Удалите приложение, чтобы использовать этот пул приложений на время развертывания, выключите реальный пул приложений, а затем, в конце концов, выполните обратные шаги. –

2

Остановить приложение и/или установить файл App_Offline для меня недостаточно. Оба не дали правильное объяснение клиентам, почему сайт не работает. Особенно App_Offline. Мне нужно очистить папку bin, и это вызывает YSOD (http://blog.kurtschindler.net/more-app_offline-htm-woes/).

Мое решение: Первая задача перенаправляет развернутый сайт в другую папку, содержащую только index.html с правильным сообщением. Последняя задача возвращает исходную папку.

0

Лучшим решением было бы использовать сетевой балансировщик нагрузки, такой как f5 LTM. Вы можете настроить несколько серверов для получения трафика для своего сайта, а затем, когда вы развертываете, вы можете просто отключить один узел в NLB, чтобы весь другой трафик перешел на другой компьютер.

Мне нравится f5, потому что он очень доступен для сценариев. Когда мы используем наши веб-сайты, мы не берем никаких отступов. весь трафик на сайт просто указывается на сервер, который в настоящее время не обновляется.

Есть предостережения:

Вы должны написать сценарий Даунинг Disable члена пула в НМГЕ, так что он работает с вашим сайтом. Если на вашем сайте требуются сеансы (например, в зависимости от состояния сеанса или общих объектов), тогда вам нужно будет сбрасывать трафик с узлов NLB. в f5 вы можете просто отключить их, а затем следить за тем, чтобы количество подключений было равным нулю (также доступно для сценариев).

Вы должны ввести в действие политику с вашими девелоперами/dbas, которая заявляет, что все изменения базы данных НЕ ДОЛЖНЫ вызывать деградацию или сбой в существующем коде. Это означает, что вы должны быть очень осторожны с базами данных и конфигурациями. Таким образом, вы можете обновлять свои базы данных, прежде чем начать развертывание в первом пуле вашего сайта.