我有一个构建,在预编译阶段,nuget还原需要3分钟从缓存恢复包,npm也是如此。
这两个从缓存恢复可以并行运行,但我不清楚这是否可能使用VSTS阶段。
每个阶段可以使用不同的药剂。您不应该假设早期阶段的状态在后续阶段是可用的。
我需要的是一种将包和node_modules目录的内容从两个不同的阶段传递到调用编译器的第三个阶段的方法。
对于VSTS阶段,这是可能的吗?
发布于 2018-06-25 15:41:28
我不会分阶段这么做的。我会考虑不去做。还原包(不管类型如何)是一种I/O绑定操作--您不太可能从并行化中获得太多好处。事实上,它可能会慢一些。还原软件包所花费的大部分时间要么是等待文件下载,要么是在磁盘上复制文件。下载两倍的文件只需要两倍的时间。同时复制两个文件要花费双倍的时间。这是粗略地说,当然--在某些情况下,它可能会更快一些,但对于一般情况来说,它不太可能显著加快。
也就是说,您可以编写一个脚本来分离两个独立的作业,然后等待它们完成。就像这样,在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' })当然,您可能希望捕获作业的输出并检查是否有成功的退出代码或失败的退出代码,但这是总的想法。
发布于 2018-06-28 10:33:08
这里真正的问题并不是VSTS承载的代理npm install和nuget restore不可能在托管代理上并行运行。不是的。一个真正的问题是宿主代理没有按设计使用nuget缓存。
我们已经确定这个问题不是一个问题。宿主代理每次排队新构建时都会下载nuget包。无法使用宿主代理加速此nuget还原步骤。
因此,将nuget恢复时间从240到20年代的解决方案是将其转移到本地代理。这样就可以使用本地缓存。
https://stackoverflow.com/questions/51026279
复制相似问题