Skip to content

Instantly share code, notes, and snippets.

@ThatGuySam
Forked from belgattitude/ci-pnpm-install.md
Created June 10, 2023 20:23
Show Gist options
  • Select an option

  • Save ThatGuySam/663e2d7b798bbedc41a0ff150858ba2c to your computer and use it in GitHub Desktop.

Select an option

Save ThatGuySam/663e2d7b798bbedc41a0ff150858ba2c to your computer and use it in GitHub Desktop.
Composite github action to improve CI time with pnpm

Why

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 (β™»οΈπŸŒ³β€οΈ).

Requirements

pnpm v7+ (not using pnpm ? see the corresponding yarn action gist)

Bench

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.

Structure

.
└── .github
    β”œβ”€β”€ actions
    β”‚   └── pnpm-install/action.yml (composite action)    
    └── workflows
        └── ci.yml (uses: ./.github/actions/pnpm-install)    

Composite action

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 }}

Workflow action

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

Recommended .npmrc

# https://pnpm.io/next/npmrc#strict-peer-dependencies
strict-peer-dependencies=true
# https://pnpm.io/npmrc#auto-install-peers
auto-install-peers=false

Notes

Install

image

Post-install

image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment