How to cache yarn packages in GitHub Actions How to cache yarn packages in GitHub Actions typescript typescript

How to cache yarn packages in GitHub Actions


     - name: Get yarn cache directory path       id: yarn-cache-dir-path       run: echo "::set-output name=dir::$(yarn cache dir)"     - uses: actions/cache@v1       id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)       with:         path: ${{ steps.yarn-cache-dir-path.outputs.dir }}         key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}         restore-keys: |           ${{ runner.os }}-yarn-

The caching code above only caches and restores the yarn cache directory, it doesn't cache the node_modules directory. So if you use this code (@Edric's answer),

- name: Install project dependencies  if: steps.yarn-cache.outputs.cache-hit != 'true' # Over here!  run: yarn

node_modules is not created and you will receive dependencies not found errors.

Instead, you can use this:

- name: Install project dependencies  run: yarn --prefer-offline

This tells yarn to always run but use cached downloads (in the cache directory mentioned above) whenever possible instead of downloading from the server.


You can also cache the node_modules directory directly and skip the installation step when the cache is available. This is actually NOT recommended (see comments). Example:

    - name: Get yarn cache directory path      id: yarn-cache-dir-path      run: echo "::set-output name=dir::$(yarn cache dir)"    - name: Cache yarn cache      uses: actions/cache@v2      id: cache-yarn-cache      with:        path: ${{ steps.yarn-cache-dir-path.outputs.dir }}        key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}        restore-keys: |          ${{ runner.os }}-yarn-    - name: Cache node_modules      id: cache-node-modules      uses: actions/cache@v2      with:        path: node_modules        key: ${{ runner.os }}-${{ matrix.node-version }}-nodemodules-${{ hashFiles('**/yarn.lock') }}        restore-keys: |          ${{ runner.os }}-${{ matrix.node-version }}-nodemodules-    - run: yarn      if: |        steps.cache-yarn-cache.outputs.cache-hit != 'true' ||        steps.cache-node-modules.outputs.cache-hit != 'true'


As mentioned in the comment next to the id field for the caching step:

Use this to check for cache-hit (steps.yarn-cache.outputs.cache-hit != 'true')

You're missing a conditional if property that determines whether the step should be run:

- name: Install yarn  run: npm install -g yarn- name: Install project dependencies  if: steps.yarn-cache.outputs.cache-hit != 'true' # Over here!  run: yarn

P.S. You should probably use the Setup NodeJS GitHub Action that additionally sets up Yarn for you:

- uses: actions/setup-node@v1  with:    node-version: '10.x' # The version spec of the version to use.

See the action.yml file for a full list of valid inputs.


EDIT: As it turns out, Yarn is included in the list of software installed on the GitHub-hosted Ubuntu 18.04.4 LTS (ubuntu-latest/ubuntu-18.04) runner, so there's no need to include a step to globally install Yarn.


I'm not sure why other answer doesn't mention the simple way of caching npm and yarn dependencies with the built-in way of actions/setup-node@v2, so I'm going to just add the docs, which is much more simple.

As the readme of the github package says:

steps:- uses: actions/checkout@v2- uses: actions/setup-node@v2  with:    node-version: '14'    cache: 'npm' # or yarn- run: npm install- run: npm test