如何在八达通部署期间优雅地使Web应用程序脱机?

Jas*_*ver 15 octopus-deploy

我有点疏忽发现Octopus虽然令人惊讶,但在升级前关闭你的网络应用并没有做任何可爱或聪明的事情.

在我们的解决方案中,我们有两个依赖于相同数据库的Web应用程序(一个网站和一个单独的API Web应用程序),因此当一个正在升级时,另一个仍处于活动状态,并且仍有可能仍在维护Web或API请求数据库正在升级.

不干净!

清理将是Octopus关闭Web应用程序,等到它们关闭然后继续升级,完成后将应用程序池重新联机.

怎么能实现呢?

Jas*_*ver 16

自拍回答!

使用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.
Run Code Online (Sandbox Code Playgroud)

然后在最后添加另一个步骤以重新启动应用程序池:

# 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
Run Code Online (Sandbox Code Playgroud)


RMK*_*RMK 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"; 
Run Code Online (Sandbox Code Playgroud)

$ WebSiteName通常是"默认网站".另请注意,`不是单引号,而是反引号字符(通常在键盘上的tilda中找到).

现在,如果章鱼将您的网站部署到新位置,您的网站将自动返回在线状态.如果您不希望这样,您可以部署具有app_offline文件的新网站.然后,您可以使用以下脚本将其删除.

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";
Run Code Online (Sandbox Code Playgroud)

  • 所以听起来理想的方法是使用两者? (2认同)