Repository navigation
Unable to set global npm version, npm v8 is always used... #376
Description
Description:
I need to run my action using npm@6. Despite installing the correct version globablly, npm@8 is always used and my action fails. i see a series of warnings in my logs like:
my-package: npm WARN EBADENGINE Unsupported engine {
my-package: npm WARN EBADENGINE package: '@particle/[email protected]',
my-package: npm WARN EBADENGINE required: { node: '>=10', npm: '6.x' },
my-package: npm WARN EBADENGINE current: { node: '12.22.7', npm: '8.1.0' }
my-package: npm WARN EBADENGINE }
i first noticed the failure on monday (12/6/2021), the last successful run was ~7days ago (11/30/2021 - log)
inspecting the logs for both runs, i see Current runner version: '2.284.0' (success) vs. Current runner version: '2.285.1' (fail). looks like the earliest failure happened under Current runner version: '2.285.0' which was released ~8days ago (info)
running locally (outside of GH Actions entirely but within a comparable environment), i'm able to reproduce the warnings and subsequent failures by simply using npm@8. at no point does my code attempt to install npm@8. reverting to npm@6 and re-running fixes things.
the Unsupported engine warnings are triggered by running a tool which itself runs npm via child-process in a descendant directory (see here). this is what my npm run build command does under the hood.
interestingly, Node.js v12.22.7 ships w/ [email protected] by default (see ~pg10 here) so something is explicitly pulling in [email protected] somewhere
Action version:
v2.5.0, v2.4.1, and v2.4.0
Platform:
- Ubuntu
- macOS
- Windows
Runner type:
- Hosted
- Self-hosted
Tools version:
node: v12.22.7
npm: 6.14.15 (but [email protected] is always used)
Repro steps:
Using an action step like:
- uses: actions/setup-node@v2
with:
node-version: '12'
registry-url: 'https://registry.npmjs.org'
- name: Install Dependencies
run: |
npm ci
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
- name: Debug
env:
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
run: |
echo ":::: NPM SETTINGS"
npm config set '//registry.npmjs.org/:_authToken' "${NODE_AUTH_TOKEN}"
node --version
npm --version
npm whoami
npm i npm@6 --global
npm run build
(note: using either ubuntu-18.04 or ubuntu-latest yields the same result)
Expected behavior:
npm run build command succeeds, npm@6 is used
Actual behavior:
npm run build fails with the following log output:
my-package: npm WARN EBADENGINE Unsupported engine {
my-package: npm WARN EBADENGINE package: '@particle/[email protected]',
my-package: npm WARN EBADENGINE required: { node: '>=10', npm: '6.x' },
my-package: npm WARN EBADENGINE current: { node: '12.22.7', npm: '8.1.0' }
my-package: npm WARN EBADENGINE }
npm@8 is used despite previously installing npm@6 via npm i npm@6 --global and despite Node.js v12.22.7 shipping with [email protected] by default
Activity
busticated commentedon Dec 7, 2021
i should add: this pipeline has been working without issue for months. my last successful run was ~7days ago (11/30/2021 - log). i noticed things failing starting yesterday (12/6/2021)
edit: comparing the last successful run to my recent failures, i see
Current runner version: '2.284.0'(success) vs.Current runner version: '2.285.1'(fail). looks like the earliest failure happened underCurrent runner version: '2.285.0'which was released ~8days ago (info)edit: this seems relevant 👉 actions/runner#1439
edit: doesn't look like i can downgrade the runner itself ☠️
edit: actions/runner#1439 (comment) seems to confirm my expectation that
setup-nodewould handle things such that the base environment wouldn't conflict with the environment where my actions runethomson commentedon Dec 8, 2021
Your repository is private and I cannot see the runs. When I try to reproduce this, I am running the expected versions of node and npm after running setup-node.
shows:
Is this what you're seeing? Or are you seeing something different from
node --versionandnpm --version? Is this only failing in thenpm run buildstep or are you seeing odd version numbers before that step?busticated commentedon Dec 8, 2021
@ethomson thanks for taking a look 🙏
correct. i'm running a tool via the
npm run buildcommand that then builds my source code. the line that is triggering the warnings is hereas you are a Github employee, i'm happy to grant you access. fwiw, we are a Github Enterprise customer (info). if it's helpful, i can file a ticket.
busticated commentedon Dec 8, 2021
ok, should have done this from the beginning but better late than never. running locally (edit: outside of GH Actions entirely), i'm able to reproduce the warnings and subsequent failures by simply running under
npm@8. edit: reverting tonpm@6and re-running fixes things.so the question really boils down to: why would a call to execute
npmfrom a node.js script cause the base environment'snpminstance to be used instead of the one configured viasetup-node?busticated commentedon Dec 8, 2021
I should also note that I’m using the setup-node action to control node + npm versions as well (not exclusively via
npm ibut both together)dmitry-shibanov commentedon Dec 8, 2021
Hello @busticated. Thank you for your report. Could you please provide a public repository to reproduce the issue. I've tried from my side, but it works as expected.
ethomson commentedon Dec 8, 2021
I don't have an answer for you - I'd love to know if
is producing the expected values?
Expanding on this, I'd love to know what you're seeing here:
For this, I get all the expected outputs:
If you're seeing this, too, then I think that your question here is very interesting, indeed:
I'd love to know how you're invoking npm from this Node.js script.
busticated commentedon Dec 9, 2021
thanks @ethomson 🙏
i ran the debug step you provided along with a few more bits like changing directories to see if that mattered any and got the same results as you did:
[email protected]is always reported.the code that is executing is somewhat tricky:
npm run buildcommand is run from a top-level node packageoclif-dev pack,oclif-dev pack:win, andoclif-dev pack:debin that order via its ownnpm run buildcommand. the command that fails isoclif-dev pack:deb(the last one)oclif-dev pack:debitself tries to build tarballs (1) and errors out upon runningnpm install --productionvia child process(2)i patched the underlying lib to output more debugging info and discovered something interesting. all of the
oclif-devcommands i listed above run the "build tarballs" step. when i log outwhich npmin the context of that code, i see:(with a bunch of noise omitted)
so, at some point this code starts seeing
/usr/local/bin/npmas the output ofwhich npmand of course this version is[email protected].i then tried running the
oclif-dev pack:debstep on its own thinking maybe previous steps messed things up somehow and that failed on its own.but here's the wrinkle - the
oclif-dev pack:debstep is run likesudo -s -E oclif-dev pack:debb/c the command requires root (issue, pr).is that likely to be the culprit? and what changed to cause failures now? is it down to the base environment change rolled out in https://github.com/actions/runner/releases/tag/v2.285.0 ?
busticated commentedon Dec 9, 2021
ok, well adding
sudo -s -E npm i npm@6 --globaljust prior to callingnpm run buildfixes things. so, yay?i suppose you can close this out - thanks for the help 🙏 👍
6tukat commentedon Dec 10, 2021
oho tenku
6tukat commentedon Dec 10, 2021
god blesu evribare
dmitry-shibanov commentedon Dec 10, 2021
Hello everyone. For now I'm closing the issue. If you have any concerns feel free to contact us.
Thank you for the help @ethomson .
fix!: fail when there's an error while committing (actions#376)