我正在构建一个版本,其中在预编译阶段 nuget 还原需要大约3分钟的时间才能从缓存中还原软件包,而 npm 也是。
这两个从缓存中恢复可以并行运行,但是我不清楚使用VSTS Phases是否可以实现。
每个阶段可以使用不同的代理。您不应假定先前阶段的状态在后续阶段中可用。
我需要的是一种将来自两个不同阶段的 packages 和 node_modules 目录的内容传递给调用编译器的第三阶段的方法。
VSTS阶段有可能吗?
答案 0 :(得分:2)
我不会分阶段进行此操作。我会考虑完全不这样做。恢复包(不管类型如何)是一个受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' })
当然,您可能希望捕获作业的输出,并检查是否存在成功退出代码或失败退出代码,但这是一般的想法。
答案 1 :(得分:0)
这里真正的问题不是VSTS托管代理npm install
和nuget restore
不能在托管代理上并行运行。没有。
一个真正的问题是托管代理在设计上没有使用nuget缓存。
我们已确定此问题不是错误。托管代理将 每次排队新版本时,都下载nuget软件包。你可以 无法使用托管代理加快此nuget恢复步骤。
因此,将nuget恢复时间从240秒缩短至20秒的解决方案是将其移至本地代理。这样就可以使用本地缓存。