Как сделать резервную копию физического пути к папке веб-сайта IIS перед развертыванием с использованием Nant или PowerShell в Teamcity

Я нахожусь в процессе создания Автоматизированного процесса с использованием TeamCity. Мой план перед развертыванием на Prod Server, создающем резервную папку:

  1. Остановите IIS и скопируйте или резервное копирование папки физического пути веб-сайта IIS VersionNo как X (используя Nant или Powershell)
  2. Переименуйте папку физического пути веб-сайта IIS в VersionNo как X + 1 (с помощью Nant или Powershell) 3. Разверните папку физического пути веб-сайта IIS X + 1
  3. Перезагрузите 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

Сценарий делает следующее:

  1. Получить название сайта от пользователя
  2. Если имя сайта не является допустимым именем сайта, сценарий будет прерван
  3. Из предоставленного имени сайта будет определен пул приложений и физическая папка сайта.
  4. Пул приложений остановлен
  5. Подождите 30 секунд и проверьте, остановлен ли пул приложений
  6. Используя физический путь к папке, будет создан путь к папке резервного копирования. Например, если путь к веб-сайту - D:\Sites\MySite, тогда папка резервной копии будет находиться в D:\Backup. Имя папки резервной копии - SiteName+_+Date. Дата имеет формат month.day.year.hour.min.seconds.
  7. Выполнить резервное копирование
  8. После резервного копирования ВАМ НУЖНО ВЫПОЛНИТЬ СВОЮ РАЗВЕРТКУ. СЦЕНАРИЙ НЕ СДЕЛАН.
  9. Сценарий предложит вам подтвердить, что вы выполнили развертывание.
  10. Если вы подтвердите, что развертывание выполнено, введя либо true, либо yes, либо 0, сценарий запустит пул приложений.
  11. Подождите 30 секунд и проверьте, запущен ли пул приложений. Если нет, то сообщу вам то же самое.

ЗАПОМНИТЕ СНОВА, ЧТО СКРИПТ НЕ ЗАБОТАЕТСЯ О ВАШЕМ РАЗМЕЩЕНИИ. ВАМ НУЖНО СДЕЛАТЬ СВОЮ РАЗВЕРТКУ. ПОКА ВЫ ВЫПОЛНЯЕТЕ РАЗВЕРТЫВАНИЕ, ВЫ МОЖЕТЕ СОХРАНИТЬ ОТКРЫТИЕ СЕССИИ ПОРОШКОВОЙ ОБОЛОЧКИ.

ТАКЖЕ скрипт не удаляет содержимое папки сайта. Пожалуйста, включите этот шаг по мере необходимости.

Надеюсь это поможет.

Другие вопросы по тегам