-->

понедельник, 15 февраля 2016 г.

Снятие бэкапа TeamCity через PowerShell

Задача: выполнять регулярный бэкап билд-конфигураций TeamCity, получать и хранить файл с бэкапом.

Простейший способ получить резервную копию содержимого сервера TeamCity - это зайти в админке в Administration - Backup, указать, что мы собираемся копировать и нажать Start Backup. В зависимости от количества билд-конфигураций, упаковка файла может занять несколько минут, а результат работы будет сохранен в указанную папку на сервере TeamCity.
К сожалению, этот билд-сервер не предоставляет "из коробки" функциональности по автоматизации снятия бэкапа. Поискав в сети, конечно же я наткнулся на широко известный PowerShell-скрипт от Ivan Leonenko, позволяющий запустить бэкапирование удаленно посредством отправки HTTP POST-запроса.

Вместо того, чтобы складывать бэкапы на той же машине, где развернут TeamCity (что совершенно неправильно) и писать службу по их миграции в надежное хранилище, мы решили сразу получать файл в свое распоряжение. Для получения файла достаточно GET-ом с той же авторизацией обратиться по адресу:
{server}/get/file/backup/{filename}
поэтому наша доработка скрипта Ivan'a свелась к периодическому опросу этого URL и скачиванию файла (как подписаться на событие "бэкап готов" даже смотреть не стали).

Готовый скрипт на GitHub. Остается настроить периодический запуск скрипта через любой планировщик задач, и файлы с бэкапами начнут поступать в ваше распоряжение. Если собираетесь делать через SQL Server Agent - прочитайте предыдущую заметку, поскольку у агента свои причуды выполнения PowerShell-скриптов.

Кстати, скачать файл через PowerShell несложно, достаточно использовать командлет Invoke-WebRequest:

function Save-FileFromWeb()
{
param(
[string] $url,
[string] $username,
[string] $password,
[string] $targetFile
)
$authInfo = $username + ":" + $password
$authInfo = [System.Convert]::ToBase64String([System.Text.Encoding]::Default.GetBytes($authInfo))
$Headers = @{ Authorization = "Basic $authInfo" }
Invoke-WebRequest -Uri $url -Headers $Headers -OutFile $targetFile
}

Комментариев нет:

Отправить комментарий