воскресенье, 21 октября 2012 г.

Run Powershell deploy scripts in parallel

Я являюсь большим поклонником Continues Integration и считаю, что каждый современный разработчик должен иметь возможность в один клик (или автоматически) собрать свой продукт, поставить его на тестовые машины и прогнать по всему этому все имеющиеся тесты. Причем чем быстрее этот процесс проходит и чем надежнее, тем лучше.
Так получается, что части моего продукта ставятся в процессе билда уже на 5 виртуальных машин (а один из прошлых проектов делал тоже самое почти на 40 виртуалок). Сам процесс состоит из отправки HyperV команды на откат машины в snapshot, запуска ее, ожидания загрузки и инсталляции продукта.

В большинстве случаев, с которыми я сталкивался, инсталляция продукта на одну машину совершенно независима от инсталляции на другие. Почему бы это не делать параллельно? Мне замена последовательной установки на параллельную позволила сократить фазу отката с 24 минут до 8 минут.

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

$ps = "powershell.exe" 
$paramstr = "lab1;lab2;lab3;lab4;lab5;lab6;lab7;lab8;lab9;lab0" 
$psparam = "-File .\build\InstallToOneLab.ps1 " 
[System.Diagnostics.Process[]] $procs = $() 
foreach ($labname  in $paramstr.split(";")) 
{ 
    $currentpath = (gl).Path
    $args = $($psparam, $labname, $currentpath)     
    Write-Host "Install new to lab='$labname' with params '$args'" 
    $p = Start-Process $ps -ArgumentList $args  -PassThru -NoNewWindow -RedirectStandardOutput ".\$labname.out" 
    $procs += $p 
} 
$procs | Wait-Process 
Write-Host "Finished all"

Я пытался реализовывать этот скрипт через script-блоки и Job'ы, но увы эти механизмы в моей среде отказывались работать.

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