I have a GitLab Pages site that uses Gulp for building. My .gitlab-ci.yml file looks similar to this:
image: node:latest
before_script:
- npm install gulp-cli -g
- npm install gulp [...and a whole bunch of packages] --save-dev
build:
stage: build
script:
- gulp buildsite
artifacts:
paths:
- public
pages:
stage: deploy
script:
- gulp
artifacts:
paths:
- public
cache:
paths:
- node_modules/
Before both the build
and pages
jobs, the npm install
commands are executed (once before each job). Since I have quite a few packages, this usually takes a while.
Is there a way to only do the installs once across the entire build?
I thought that's what cache
was supposed to help with, but it still seems like it still redownloads everything.
Though the answer in the comments is essentially correct. I think a specific answer for your case would be good though. One approach you could use is adding a third stage that would bear the load of installing node modules plus you could also cache them to speed up subsequent builds:
image: node:latest
stages:
- prep
- build
- deploy
before_script:
- npm install gulp-cli -g
prep:
stage: prep
script:
- npm install gulp [...and a whole bunch of packages] --save-dev
artifacts:
paths:
- node_modules
cache:
paths:
- node_modules
build:
stage: build
script:
- gulp buildsite
artifacts:
paths:
- public
pages:
stage: deploy
script:
- gulp
artifacts:
paths:
- public
This solution will only perform the installation once and will cache the result for future ci pipelines, you may also place an expiry on the node modules artifacts.