Althought @setup/node as a built-in cache optionit lacks an opportunity regarding cache persistence. Depending on usage, the action below might give you faster installs and potentially reduce carbon emissions (β»οΈπ³β€οΈ).
pnpm v7+ (not using pnpm ? see the corresponding yarn action gist)
Based on the nextjs-monorepo-example with pnpm.
A cold cache install on the ci is around Β±1m20s.
With warmed cache: Β±40s + (add Β±10s for compression). Crafted from benchmarks results in https://gist.github.com/belgattitude/0ecd26155b47e7be1be6163ecfbb0f0b. Depending on repo (renovatebot...), the slight complexity increase in ci setup might worth it.
.
βββ .github
βββ actions
β βββ pnpm-install/action.yml (composite action)
βββ workflows
βββ ci.yml (uses: ./.github/actions/pnpm-install)
Create a file in .github/actions/pnpm-install/action.yml and paste
#######################################################################################
# "pnpm install" composite action #
#--------------------------------------------------------------------------------------#
# - bench: https://gist.github.com/belgattitude/0ecd26155b47e7be1be6163ecfbb0f0b #
########################################################################################
name: 'Monorepo install (pnpm)'
description: 'Run pnpm install'
inputs:
skip-prisma-postinstall-generate:
description: 'Avoid prisma to automatically generate schema on postinstall'
required: false
default: 'true'
runs:
using: 'composite'
steps:
- uses: pnpm/[email protected]
- name: Expose pnpm config(s) through "$GITHUB_OUTPUT"
id: pnpm-config
shell: bash
run: |
echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT
- name: Cache rotation keys
id: cache-rotation
shell: bash
run: |
echo "YEAR_MONTH=$(/bin/date -u "+%Y%m")" >> $GITHUB_OUTPUT
- uses: actions/cache@v3
name: Setup pnpm cache
with:
path: ${{ steps.pnpm-config.outputs.STORE_PATH }}
key: ${{ runner.os }}-pnpm-store-cache-${{ steps.cache-rotation.outputs.YEAR_MONTH }}-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-store-cache-${{ steps.cache-rotation.outputs.YEAR_MONTH }}-
# Prevent store to grow over time (not needed with yarn)
# Note: not perfect as it prune too much in monorepos so the idea
# is to use cache-rotation as above. In the future this might work better.
#- name: Prune pnpm store
# shell: bash
# run: pnpm prune store
- name: Install dependencies
shell: bash
run: pnpm install --frozen-lockfile --strict-peer-dependencies --prefer-offline
env:
# Other environment variables
HUSKY: '0' # By default do not run HUSKY install
PRISMA_SKIP_POSTINSTALL_GENERATE: ${{ inputs.skip-prisma-postinstall-generate }}To use it in the workflows
steps:
- uses: actions/checkout@v3
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
- name: π₯ Monorepo install
uses: ./.github/actions/pnpm-install# https://pnpm.io/next/npmrc#strict-peer-dependencies
strict-peer-dependencies=true
# https://pnpm.io/npmrc#auto-install-peers
auto-install-peers=false
Install
Post-install

