【问题标题】:VSTS multi-phased builds - run nuget restore and npm install in parallelVSTS 多阶段构建 - 并行运行 nuget restore 和 npm install
【发布时间】:2018-06-25 14:48:40
【问题描述】:

我有一个构建,在预编译阶段 nuget restore 需要大约 3 分钟才能从缓存中恢复包,npm 也是如此。

这两个从缓存中恢复可以并行运行,但我不清楚这是否可以使用VSTS Phases

每个阶段可能使用不同的代理。您不应该假设早期阶段的状态在后续阶段中可用。

我需要一种将 packagesnode_modules 目录的内容从两个不同阶段传递到调用编译器的第三个阶段的方法。

VSTS 阶段可以做到这一点吗?

【问题讨论】:

    标签: npm nuget azure-devops


    【解决方案1】:

    我不会对阶段进行此操作。我会考虑根本不这样做。恢复包(无论类型如何)是一项 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' })
    

    当然,您可能希望捕获作业的输出并检查是否存在成功退出代码或失败退出代码,但这是大体思路。

    【讨论】:

    • 谢谢。用工作做到了这一点。我认为你是对的,这些都是 I/O 绑定操作,但是对作业执行这些操作会导致缓存恢复操作的总持续时间几乎相同,只是它们现在是同时运行的。
    【解决方案2】:

    这里真正的问题不是 VSTS 托管代理 npm installnuget restore 不能在托管代理上并行运行。不。 一个真正的问题是托管代理在设计上并未使用 nuget 缓存。

    我们已确定此问题不是错误。托管代理将 每次排队新构建时下载 nuget 包。你可以 不使用托管代理加快此 nuget 还原步骤。

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

    因此,将 nuget 还原时间从 240 秒缩短到 20 秒的解决方案是将其移至本地代理。这样就可以使用本地缓存了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2021-03-26
      • 2017-11-29
      • 2014-12-18
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多