Gitea runner cache

I use gitea and a gitea runner in a docker container. When I push, the runner does its job properly: first - npm install and then - npm run test. But when I push another commit, the runner runs the command “npm install” again downloading packages that previously were downloaded, and wasting time. How to make the runner use the previously downloaded packages? Is there anything like cache?

Here is the runner code:

name: Gitea Actions Demo
run-name: ${{ }} is testing out Gitea Actions 🚀
on: [push]

    runs-on: ubuntu-latest
      - run: echo "🎉 The job was automatically triggered by a ${{ gitea.event_name }} event."
      - run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by Gitea!"
      - run: echo "🔎 The name of your branch is ${{ gitea.ref }} and your repository is ${{ gitea.repository }}."
      - name: Check out repository code
        uses: actions/checkout@v3
      - run: echo "💡 The ${{ gitea.repository }} repository has been cloned to the runner."
      - run: echo "🖥️ The workflow is now ready to test your code on the runner."
      - run: npm install
      - run: npx playwright install --with-deps
      - run: npm run test
      - name: List files in the repository
        run: |
          ls ${{ gitea.workspace }}
      - run: echo "🍏 This job's status is ${{ job.status }}."