【发布时间】:2018-10-01 09:37:16
【问题描述】:
我已经在 VSTS 中配置了一个私有代理,并在那里全局安装了 NPM。当我尝试通过构建任务安装 NPM 时,它仍在为每个构建安装 NPM 包,这需要花费大量时间 - 大约 12 分钟。
如何缓存 NPM 安装以减少构建时间?
【问题讨论】:
标签: npm build azure-devops
我已经在 VSTS 中配置了一个私有代理,并在那里全局安装了 NPM。当我尝试通过构建任务安装 NPM 时,它仍在为每个构建安装 NPM 包,这需要花费大量时间 - 大约 12 分钟。
如何缓存 NPM 安装以减少构建时间?
【问题讨论】:
标签: npm build azure-devops
我们使用npm-cache,npm-cache 是一个节点模块,它会为每个哈希计算你的 package.json 文件的哈希,它将在你的构建服务器上创建带有 node_modules 内容的 zip 文件夹,现在 npm install 减少了在每个构建中提取一个 zip(当然只有在您实际上没有更改 package.json 的情况下)。
这个想法是:第一次该工具下载npm包并将它们保存在本地,第二次如果package.json没有更改,他会从本地磁盘获取包并将它们复制到构建代理文件夹,仅当package.json 更改时,他才会从互联网下载软件包。
在构建机器上安装 npm-cache:
npm install npm-cache -g
在构建定义中添加命令行任务(工具:C:\Windows\User\AppData\Roaming\npm\npm-cache(或者如果将工具添加到环境路径变量中,则只需 npm-cache);参数:install npm;工作文件夹:$(Build.SourcesDirectory)(或package.json 所在的位置)。
【讨论】:
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。
不幸的是,我们目前无法缓存 NPM 安装,因为目前没有这样的内置功能。
但是,已经有用户提交了建议该功能的声音:Improve hosted build agent performance with build caches,而且似乎 VSTS 团队现在正在积极处理这个问题...
【讨论】:
使用缓存管道任务将缓存添加到管道中。这 任务与任何其他任务一样工作,并被添加到步骤部分 工作
使用以下配置:
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,因此哈希也会更改。
【讨论】: