Search code examples
typescriptyarnpkggithub-actions

How to cache yarn packages in GitHub Actions


I am using GitHub Actions to build my TypeScript project. Everytime I run action I am waiting 3 minutes for all dependencies to get installed.

Is there way to cache yarn dependencies, so build time will be faster?

I tried this:

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

    - name: Install yarn
      run: npm install -g yarn

    - name: Install project dependencies
      run: yarn

but build time is still same.


Solution

  • 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.