Как сделать резервную копию физического пути к папке веб-сайта IIS перед развертыванием с использованием Nant или PowerShell в Teamcity
Я нахожусь в процессе создания Автоматизированного процесса с использованием TeamCity. Мой план перед развертыванием на Prod Server, создающем резервную папку:
- Остановите IIS и скопируйте или резервное копирование папки физического пути веб-сайта IIS VersionNo как X (используя Nant или Powershell)
- Переименуйте папку физического пути веб-сайта IIS в VersionNo как X + 1 (с помощью Nant или Powershell) 3. Разверните папку физического пути веб-сайта IIS X + 1
- Перезагрузите IIS
Как сделать это с помощью сценария Nant или PowerShell в Nant? Любая помощь будет отличной помощью. Спасибо
1 ответ
Что касается скрипта Powershell, этот скрипт поможет с шагами IIS и резервным копированием.
Import-Module WebAdministration
function Get-SiteName
{
[cmdletBinding()]
param(
[Parameter(Mandatory)]
$site)
if(Test-Path IIS:\Sites\$site)
{
Write-Host "The provided website name is $site and it is a valid website`r`n" -ForegroundColor Cyan
}
else
{
Write-Host "There is not a website present in the name provided`r`n" -ForegroundColor Red
Exit
}
}
function Stop-AppPool
{
# Get the app pool of the website
$appPool = Get-Item IIS:\Sites\$site | Select-Object applicationPool
# Get the app pool name
$appPoolName = $appPool.applicationPool
# Stop the app pool. If already stopped then a message will be shown
if ((Get-WebAppPoolState $appPoolName).Value -ne "Stopped")
{
Stop-WebAppPool $appPoolName
Write-Host "App pool $appPoolName is $((Get-WebAppPoolState $appPoolName).Value)"
}
else
{
Write-Host "App pool $appPoolName is already stopped`r`nNo need to stop it again`r`n" -ForegroundColor DarkGreen
}
}
function Test-IsStoppedOrNot
{
# Check the status of the app pool before taking backup
sleep -Seconds 30
if ((Get-WebAppPoolState $appPoolName).Value -eq "Stopped")
{
Write-Host "App pool $appPoolName is in stopped state`r`nBackup and Deploy can start`r`n" -ForegroundColor Cyan
}
else
{
Write-Host "App pool is not yet stopped`r`nTry after sometime`r`n" -ForegroundColor Red
Exit
}
}
function Make-BackupFolder
{
# Get the website physical folder of the website
$SiteFolder = Get-Item IIS:\Sites\$site
$SiteFolderName = $SiteFolder.physicalPath
Write-Host "The physical folder of the website is $SiteFolderName" -ForegroundColor DarkCyan
# Forming backup folder name
$backupFolder = $site + "_" + (Get-Date).ToString('MM.dd.yyyy.hh.mm.ss')
# Creating backup folder path
$DriveName = Split-Path -Path $SiteFolderName -Qualifier
$backupFolderPath = Join-Path "$DriveName" -ChildPath "Backup" | Join-Path -ChildPath "$backupFolder"
# Creating backup folder
mkdir $backupFolderPath
}
function Test-IsBackupFolderCreatedOrNot
{
# Confirm if the backup folder is created
if (Test-Path $backupFolderPath)
{
Write-Host "Backup folder $backupFolderPath is created`r`n" -ForegroundColor DarkGreen
Get-ChildItem $SiteFolderName | Copy-Item -Destination $backupFolderPath
Write-Host "Backup is complete`r`n" -ForegroundColor Blue
Write-Host "Perform the deployment`r`n" -ForegroundColor Cyan
}
else
{
Write-Host "Backup folder is not created`r`nTake a look please" -ForegroundColor Red
Exit
}
}
# Start the app pool. If already started then a message will be shown
function Start-AppPool
{
if ((Get-WebAppPoolState $appPoolName).Value -ne "Started")
{
Start-WebAppPool $appPoolName
Write-Host "App pool $appPoolName is $((Get-WebAppPoolState $appPoolName).Value)"
}
else
{
Write-Host "App pool $appPoolName is already started`r`nNo need to start it again`r`n" -ForegroundColor DarkGreen
Write-Host "THE DEPLOYMENT IS COMPLETE`r`n" -ForegroundColor DarkBlue
}
}
function Test-IsStartedOrNot
{
# Check the status of the app pool once again
sleep -Seconds 30
if ((Get-WebAppPoolState $appPoolName).Value -eq "Started")
{
Write-Host "App pool $appPoolName is not in started state yet`r`nTAKE A LOOK" -ForegroundColor Cyan
}
else
{
Write-Host "App pool is in started state`r`n" -ForegroundColor Red
Write-Host "THE DEPLOYMENT IS COMPLETE`r`n" -ForegroundColor DarkBlue
}
}
function Confirm-Deployment
{
[cmdletBinding()]
param(
[Parameter(Mandatory)]
[ValidateSet('true','false','yes','no','1','0')]
$CanProceed)
if (($CanProceed -eq 'true') -or ($CanProceed -eq 'yes') -or ($CanProceed -eq '0'))
{
Start-AppPool
}
}
Get-SiteName
Stop-AppPool
Test-IsStoppedOrNot
Make-BackupFolder
Confirm-Deployment
Test-IsStartedOrNot
Сценарий делает следующее:
- Получить название сайта от пользователя
- Если имя сайта не является допустимым именем сайта, сценарий будет прерван
- Из предоставленного имени сайта будет определен пул приложений и физическая папка сайта.
- Пул приложений остановлен
- Подождите 30 секунд и проверьте, остановлен ли пул приложений
- Используя физический путь к папке, будет создан путь к папке резервного копирования. Например, если путь к веб-сайту - D:\Sites\MySite, тогда папка резервной копии будет находиться в D:\Backup. Имя папки резервной копии - SiteName+_+Date. Дата имеет формат month.day.year.hour.min.seconds.
- Выполнить резервное копирование
- После резервного копирования ВАМ НУЖНО ВЫПОЛНИТЬ СВОЮ РАЗВЕРТКУ. СЦЕНАРИЙ НЕ СДЕЛАН.
- Сценарий предложит вам подтвердить, что вы выполнили развертывание.
- Если вы подтвердите, что развертывание выполнено, введя либо true, либо yes, либо 0, сценарий запустит пул приложений.
- Подождите 30 секунд и проверьте, запущен ли пул приложений. Если нет, то сообщу вам то же самое.
ЗАПОМНИТЕ СНОВА, ЧТО СКРИПТ НЕ ЗАБОТАЕТСЯ О ВАШЕМ РАЗМЕЩЕНИИ. ВАМ НУЖНО СДЕЛАТЬ СВОЮ РАЗВЕРТКУ. ПОКА ВЫ ВЫПОЛНЯЕТЕ РАЗВЕРТЫВАНИЕ, ВЫ МОЖЕТЕ СОХРАНИТЬ ОТКРЫТИЕ СЕССИИ ПОРОШКОВОЙ ОБОЛОЧКИ.
ТАКЖЕ скрипт не удаляет содержимое папки сайта. Пожалуйста, включите этот шаг по мере необходимости.
Надеюсь это поможет.