【问题标题】:Cache npm install Task in VSTS在 VSTS 中缓存 npm install 任务
【发布时间】:2018-10-01 09:37:16
【问题描述】:

我已经在 VSTS 中配置了一个私有代理,并在那里全局安装了 NPM。当我尝试通过构建任务安装 NPM 时,它仍在为每个构建安装 NPM 包,这需要花费大量时间 - 大约 12 分钟。

如何缓存 NPM 安装以减少构建时间?

【问题讨论】:

    标签: npm build azure-devops


    【解决方案1】:

    我们使用npm-cache,npm-cache 是一个节点模块,它会为每个哈希计算你的 package.json 文件的哈希,它将在你的构建服务器上创建带有 node_modules 内容的 zip 文件夹,现在 npm install 减少了在每个构建中提取一个 zip(当然只有在您实际上没有更改 package.json 的情况下)。

    这个想法是:第一次该工具下载npm包并将它们保存在本地,第二次如果package.json没有更改,他会从本地磁盘获取包并将它们复制到构建代理文件夹,仅当package.json 更改时,他才会从互联网下载软件包。

    1. 在构建机器上安装 npm-cache:

      npm install npm-cache -g

    2. 在构建定义中添加命令行任务(工具:C:\Windows\User\AppData\Roaming\npm\npm-cache(或者如果将工具添加到环境路径变量中,则只需 npm-cache);参数:install npm;工作文件夹:$(Build.SourcesDirectory)(或package.json 所在的位置)。

    【讨论】:

      【解决方案2】:

      MS 终于实现了这个功能(目前处于测试阶段)https://docs.microsoft.com/en-us/azure/devops/pipelines/caching/index?view=azure-devops#nodejsnpm

      从那里:

      variables:
        npm_config_cache: $(Pipeline.Workspace)/.npm
      
      steps:
      - task: CacheBeta@0
        inputs:
          key: $(Build.SourcesDirectory)/package-lock.json
          path: $(npm_config_cache)
        displayName: Cache npm
      
      - script: npm ci
      

      【讨论】:

      • 你验证过这个作品吗?我尝试了同样的方法,但是在查看构建日志之后,npm ci 命令仍然被执行,它只是覆盖了现有的缓存内容。 IE。我没有看到这种方法可以节省任何时间。
      • 进一步测试 - 它仅缓存 .npm 目录,即 npm 缓存。所以这节省了非常少的时间(基于我的测试项目)。但是,它确实在所有运行中运行命令 npm ci。为了避免执行脚本,您需要使用 CacheBeta 输入 cacheHitVar,然后在脚本任务中添加 condition
      • @jrap 我已经测试过了,是的。而且我也没有看到任何明显的性能改进。至少因为从 MS 服务器下载缓存也需要(几乎相同)时间。
      【解决方案3】:

      不幸的是,我们目前无法缓存 NPM 安装,因为目前没有这样的内置功能。

      但是,已经有用户提交了建议该功能的声音:Improve hosted build agent performance with build caches,而且似乎 VSTS 团队现在正在积极处理这个问题...

      暂时可以试试speed Up NPM INSTALL on Visual Studio Team Services

      【讨论】:

        【解决方案4】:

        Use Cache task

        使用缓存管道任务将缓存添加到管道中。这 任务与任何其他任务一样工作,并被添加到步骤部分 工作

        使用以下配置:

        pool:
          name: Azure Pipelines
        
        steps:
        - task: Cache@2
          inputs:    
            key: 'YOUR_WEB_DIR/package.json'
            path: 'YOUR_WEB_DIR/node_modules/'
        
        - task: Npm@1
          inputs:
            command: 'install'
            workingDir: 'YOUR_WEB_DIR/frontend'
        

        您也可以使用密钥YOUR_WEB_DIR/package-lock.json,但请注意,文件可能会被其他下一步更改,例如npm install,因此哈希也会更改。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-23
          • 1970-01-01
          • 1970-01-01
          • 2015-01-15
          • 1970-01-01
          • 2019-08-10
          • 2015-01-27
          相关资源
          最近更新 更多