One weird trick to reduce build time! CI services hate him!

This is a fairly simple way to reduce your build time if you spend a lot of time bundling dependencies prior to performing tests or deployments in CI.

The trick is to bundle any build dependencies into a Docker image so that you don’t have to install them each time you run a job.

Let’s take a look at my .gitlab-ci.yml file that I used in “GitLab Review Apps with Zeit’s Now.sh service”:

As you can see above, I’m installing build dependencies for now with npm install -g now --silent in both the start_review and stop_review pipeline stages. This is unnecessary and is done every single time a job runs (not DRY). If you run enough builds, that’s a significant amount of time wasted.

Let’s build a simple Docker image that includes the now dependency:

With a simple .gitlab-ci.yml file to push the image to the GitLab container registry:

Now, instead of pulling from image: node in our initial .gitlab-ci.yml, we can use image: my.registry/hugo/now-image:latest and remove the section of our .gitlab-ci.yml where we install our build dependencies, because they’re already bundled!

Now we’ve shaved a bit of time off our builds 👌

If you liked this post, have questions or queries, or can help me make it better, please tweet me!