Swayam Ghosh
Swayam Ghosh

Reputation: 91

Cache npm install Task in VSTS

I have configured a private agent in VSTS and have installed NPM there globally. When I'm trying to install NPM through my build task, it is still installing NPM packages for every build which is taking an aweful lot of time- approximately 12 minutes.

How can I cache the NPM installations so that the build time is reduced?

Upvotes: 6

Views: 4882

Answers (4)

DiPix
DiPix

Reputation: 6083

Use Cache task

Caching is added to a pipeline using the Cache pipeline task. This task works like any other task and is added to the steps section of a job

With the following configuration:

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'

You can use key YOUR_WEB_DIR/package-lock.json too, but be aware that file might be changed by other next step like npm install so hash also will be changed.

Upvotes: 0

Andrey Stukalin
Andrey Stukalin

Reputation: 5919

MS has finally implemented this feature (currently in beta) https://learn.microsoft.com/en-us/azure/devops/pipelines/caching/index?view=azure-devops#nodejsnpm

From there:

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

Upvotes: 4

Shayki Abramczyk
Shayki Abramczyk

Reputation: 41545

We use npm-cache, npm-cache is a node module that will calculate a hash of your package.json file for every hash it will create zip folder on your build server with the content of node_modules, now npm install is reduced to extracting a zip on every build (of course only in case you didn’t actually change package.json).

The idea is: in the first time the tool download the npm packages and save them locally, in the second time if the package.json not changed he takes the packages from the local disk and copy them to the build agent folder, only if the package.json changed he downloads the packages from the internet.

  1. Install the npm-cache on the build machine:

    npm install npm-cache -g

  2. In the build definition add Command Line task (Tool: C:\Windows\User\AppData\Roaming\npm\npm-cache (or just npm-cache if you add the tool to environment path variables); Arguments:install npm; Working folder: $(Build.SourcesDirectory) (or where package.json located).

Upvotes: 5

Andy Li-MSFT
Andy Li-MSFT

Reputation: 30372

Unfortunately we cannot cache the NPM installations as no such a built-in feature for now.

However there's already a user voice submitted to suggest the feature : Improve hosted build agent performance with build caches, and seems the VSTS team are actively working on this now...

For now, you can try to speed Up NPM INSTALL on Visual Studio Team Services

Upvotes: 0

Related Questions