Github action with prepare step and caching deos not work as expected

Hey everyone,
I’m on a new project which uses github actions. Previously I used CircleCI and I came across the following problem:
Steps of my workflow

  1. Prepare (does the setup with installing all packages and caches them)
  2. Several steps like linting and testing (all of them run in parallel once the prepare step is finished)
  3. Dev deployment of the web app once all tests and linting passes
name: PR Checks

on: [push, pull_request]

jobs:
   prepare:
      runs-on: ubuntu-latest

      steps:
         - uses: actions/checkout@v2
         - name: Use Node.js
           uses: actions/setup-node@v2
           with:
              node-version: '14'
         - name: Get yarn cache directory path
           id: yarn-cache-dir-path
           run: echo "::set-output name=dir::$(yarn cache dir)"

         - uses: actions/cache@v2
           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 packages
           if: steps.yarn-cache.outputs.cache-hit != 'true'
           run: yarn --frozen-lockfile
   lint_web:
      runs-on: ubuntu-latest
      needs: prepare
      steps:
         - uses: actions/checkout@v2
         - name: Use Node.js
           uses: actions/setup-node@v2
           with:
              node-version: '14'

         - name: Lint web app
           run: yarn workspace web lint

   deploy_web:
      runs-on: ubuntu-latest
      needs: lint_web
      steps:
         - uses: actions/checkout@v2
         - uses: amondnet/vercel-action@v20
           with:
              vercel-token: ${{ secrets.VERCEL_TOKEN }}
              github-token: ${{ secrets.GITHUB_TOKEN }}
              vercel-org-id: ${{ secrets.ORG_ID}}
              vercel-project-id: ${{ secrets.PROJECT_ID}}
              scope: ${{ secrets.VERCEL_SCOPE }}

Unfortunately, as the docs state, every job runs in a different runner, thus when I install deps in the prepare step I cant use them in the next steps. Do I understand that correctly? In circleCI that worked very well.
Even if I move the installing and caching into each step (if I don’t change the package-lock the cache is used, which is super fast) the packages cant be found after retrieving the cache.

name: PR Checks

on: [push, pull_request]

jobs:
   
   lint_web:
      runs-on: ubuntu-latest
      needs: prepare
      steps:
         - uses: actions/checkout@v2
         - name: Use Node.js
           uses: actions/setup-node@v2
           with:
              node-version: '14'

         - name: Get yarn cache directory path
           id: yarn-cache-dir-path
           run: echo "::set-output name=dir::$(yarn cache dir)"

         - uses: actions/cache@v2
           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 packages
           if: steps.yarn-cache.outputs.cache-hit != 'true'
           run: yarn --frozen-lockfile
         - name: Lint web app
           run: yarn workspace web lint

   deploy_web:
      runs-on: ubuntu-latest
      needs: lint_web
      steps:
         - uses: actions/checkout@v2
         - uses: amondnet/vercel-action@v20
           with:
              vercel-token: ${{ secrets.VERCEL_TOKEN }}
              github-token: ${{ secrets.GITHUB_TOKEN }}
              vercel-org-id: ${{ secrets.ORG_ID}}
              vercel-project-id: ${{ secrets.PROJECT_ID}}
              scope: ${{ secrets.VERCEL_SCOPE }}

Here the Lint web app fails since it says something like bash could not find eslint

The gain in speed with caching would be great. Just installing requires about 2.5 minutes and with caching just 20 seconds.

Do you have any ideas how I can get that to work?

Cheers