Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

npm install in GitHub Action fails with "ENOENT: no such file or directory" - Works fine elsewhere

I am currently working on replacing our Drone CI installation with GitHub Actions.

The Action Workflow I have so far boils down to the following .github/workflows/ci.yml file:

on: [ push, pull_request ]

name: CI
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Install Node
        uses: actions/setup-node@v1
        with:
          node-version: '13.x'

      - name: Install Dependencies
        run: npm install

The log itself comes out as a long series of npm WARN tar ENOENT: no such file or directory ala the truncated list below.

2020-04-29T21:15:31.7899082Z npm install
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/acorn-26d8ba97/dist/acorn.js.map'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/coffeescript-acee515b/lib/coffee-script/register.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/coffeescript-acee515b/lib/coffee-script/repl.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/coffeescript-acee515b/lib/coffee-script/rewriter.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/tslint-c216b578/LICENSE'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/eslint-cd3dbe58/LICENSE'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/eslint-cd3dbe58/README.md'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/typescript-b4b55d18/lib/diagnosticMessages.generated.json'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/jquery-1794793b/dist/jquery.min.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/lodash-05c1df31/fp/_convertBrowser.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/lodash-70e4a396/fp/_convertBrowser.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/lodash-79f5ae17/fp/_convertBrowser.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/lodash-e49b02f6/fp/_convertBrowser.js'
npm WARN tar ENOENT: no such file or directory, open '/home/runner/work/project/project/node_modules/.staging/lodash-16fa050d/fp/_convertBrowser.js'

The advice I have found online is to rm package-lock.json but that's not an acceptable solution as I need to test our code with the exact versions of our dependencies we have locked.

Further, I don't believe there is anything wrong with our package-lock.json file to begin with because it still npm install 's as expected both locally and on our Drone CI installation.

like image 490
donatJ Avatar asked Apr 29 '20 21:04

donatJ


People also ask

How do I fix Enoent No such file or directory open?

To resolve the ENOENT warning message, you need to add a package. json file in the directory where you run the npm install command. And then run your npm install command again. This time, the warning message should not appear.

Why do node modules go into .staging folder?

While doing npm install, inside node_modules . staging folder is getting created. Reasons: This is a temporary folder where the modules will be kept untill npm downloads all the modules specified in the package.


2 Answers

At long wait, I found the solution here:

Install an npm module from a private GitHub repository using GitHub Actions

      - uses: actions/checkout@v2
        with:
          persist-credentials: false
      - uses: actions/setup-node@v1
        with:
          node-version: 12.x
      - run: git config --global url."https://${{ secrets.PAT }}@github.com/".insteadOf ssh://[email protected]/
      - run: npm ci
      ...

I had tried basically all of this on my own but the most important part was missing:

        with:
          persist-credentials: false

actions/checkout@v2 will by default mess with some settings for Git and prevent insteadOf from working properly.

like image 142
donatJ Avatar answered Oct 26 '22 09:10

donatJ


This error condition can also happen if you are using a private npm package, and simply forget to add the secret to the repo.

E.g. if you have something like this in your GitHub Actions workflow:

- name: Add token for private package access to .npmrc
  run: echo "//npm.pkg.github.com/:_authToken=$ACME_CORP_TOKEN" > ~/.npmrc
  env:
    ACME_CORP_TOKEN: ${{ secrets.ACME_CORP_TOKEN }}

...an action like the above won't fail if $ACME_CORP_TOKEN doesn't exist (though it would be better to make it do so), so if you've forgotten to actually add the ACME_CORP_TOKEN secret to the repository (in the Secrets tab of the repository settings), then you will get this same problem.

The enormous list of npm WARN tar ENOENT errors for normal-looking dependencies inside of node_modules won't make it obvious that the problem is actually the missing private registry access token.

like image 31
Mason Avatar answered Oct 26 '22 07:10

Mason