Многоэтапные сборки VSTS - запустить восстановление nuget и установку npm параллельно - PullRequest
0 голосов
/ 25 июня 2018

У меня сборка, в которой на этапе предварительной компиляции nuget восстановление занимает ~ 3 минуты для восстановления пакетов из кэша, как и npm .

Этидва восстановления из кэшей могут выполняться параллельно, но я не уверен, возможно ли это, используя VSTS Phases .

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

Мне нужен способ передачи содержимого пакетов и node_modules каталогов из двух разных фаз в третью, которая вызывает компилятор.

Возможно ли это с фазами VSTS?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Реальная проблема здесь состояла не в том, что размещенный агент VSTS npm install и nuget restore не могли быть запущены параллельно на размещенном агенте. Нет. Настоящая проблема заключалась в том, что размещенный агент не использует кэш-память Nuget.

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

https://developercommunity.visualstudio.com/content/problem/148357/nuget-restore-is-slow-on-hostedagent-2017.html

Таким образом, решение об уменьшении времени восстановления nuget с 240 до 20 секунд заключалось в том, чтобы переместить его в локальный агент. Таким образом, локальный кэш привыкнет.

0 голосов
/ 25 июня 2018

Я бы не стал делать это с фазами. Я бы подумал не делать этого вообще. Восстановление пакетов (независимо от их типа) - операция, связанная с вводом / выводом - вряд ли вы многого выиграете от ее распараллеливания. На самом деле, это может быть медленнее. Большая часть времени, потраченного на восстановление пакетов, - это либо ожидание загрузки файла, либо копирование файлов на диск. Загрузка в два раза больше файлов просто занимает вдвое больше времени. Копирование двух файлов одновременно занимает вдвое больше времени. Это, конечно, грубо говоря - в некоторых случаях это может быть немного быстрее, но вряд ли это будет значительно быстрее для среднего случая.

Тем не менее, вы могли бы написать сценарий для выделения двух отдельных заданий и ждать их завершения. Примерно так, в PowerShell:

$dotnetRestoreJob = (Start-Job -ScriptBlock { dotnet restore } ).Id
$npmRestoreJob = (Start-Job -ScriptBlock { npm install } ).Id

do {
    $jobStatus = Get-Job -Id @($dotnetRestoreJob, $npmRestoreJob)
    $jobStatus
    Start-Sleep -Seconds 1
}
while ($jobStatus | where { $_.State -eq 'Running' })

Конечно, вы, вероятно, захотите захватить выходные данные из заданий и проверить, был ли код завершения успешным или код завершения сбоя, но это общая идея.

...