Generally I started playing with Concourse CI for a few days and found it to be a great server for automation for my private projects. In this post I will describe how to speed up npm install.

Concourse has a built-in directory caching system from our workspace. Just add directories to the task configuration in the caches: field.

build.yml

---
platform: linux

image_resource:
  type: docker-image
  source: { repository: node, tag: 12 }

inputs:
  - name: game-repo

run:
  path: game-repo/ci/tasks/build.sh

caches:
  - path: .npm
  - path: game-repo/node_modules

In our case it will be the .npm and node_modules directory. By default, npm stores the cache in ~/.npm which for Concourse means /root/.npm. And here a problem arises, because Concourse can only cache files and folders from a workspace that may have a different path e.g: /tmp/23f2d2/build/.
Below is an example script with a changed cache path to /tmp/23f2d2/build/.npm.

build.sh

#!/bin/sh

set -eux

npm config set cache $(pwd)/.npm --global

npm install -g npm

cd game-repo

npm install --unsafe-perm
npm run build

After such an operation, we can be sure that the next tasks will have the preserved packages from previous builds.