GitHub Actions の npm 12:「EALLOWGIT」と止められた install scripts
npm 12 は、CI のインストールが頼っている既定を2つ変えました(12.0.0 のリリースノート)。git のリポジトリや tarball の URL を指す依存は取ってこなくなり(allow-git と allow-remote の既定が none)、依存の install scripts は、package.json の allowScripts に載っていなければ動きません。手元では確かめるよう促されるだけですが、ワークフローではエラーになるか、通ったうえで何かが欠けます。
npm 12 がジョブに入る道
npm install -g npm@latest。レジストリのlatestは npm 12 です(11月4日に 12.2.1)。trusted publishing には npm 11.5.1 以降が要るので、公開のワークフローによくこの行があります。npm install -g npm@11ならその条件を満たし、npm 11 のままです。actions/setup-nodeのnode-version: latest。10月の終わりから Node.js 27 のアルファになり、これには npm 12.1.0 が付いています(runner-images #15193。そのための設定を求める setup-node #1657 があります)。node-version: lts/*か'26'なら、Node.js 26 と npm 11.20.0 です。
ジョブがどちらを持っているかは、npm --version のステップでわかります。
1.「EALLOWGIT」
npm error code EALLOWGIT npm error Fetching packages of type "git" have been disabled npm error Refusing to fetch "hexo-next-fallback@github:wherewhere/hexo-next-fallback"
github:owner/repo、git の URL、GitHub の URL で書いた依存が断られました。リポジトリのルートの .npmrc で許します:
allow-git=root
root は自分の package.json に書いた git の依存だけを許し、all はツリーの奥の git の依存も許します(npm の設定の定義の allow-git)。1回のコマンドだけなら npm ci --allow-git=root です。tarball の URL で書いた依存には、同じ値をとる allow-remote があります。
2. install scripts が止められる
npm warn install-scripts 1 package had install scripts blocked because they are not covered by allowScripts: npm warn install-scripts better-sqlite3@12.11.1 (install: prebuild-install || node-gyp rebuild --release) npm warn install-scripts npm warn install-scripts Run `npm install-scripts ls` to review, or `npm install-scripts approve <pkg>` to allow.
インストールそのものは成功します。失敗はあとで、スクリプトが作るはずだったものから出ます。better-sqlite3 はネイティブのバインディングが無く「Could not locate the bindings file」で止まり(MultiWikiServer #141)、postinstall で自分のバイナリを取ってくるパッケージは、それ抜きで入りました(gentle-shell #2730)。自分の package.json のスクリプトは今まで通り動き、止められるのは依存のスクリプトだけです。
リポジトリで一度決めます。手元に npm 12 を入れて:
npm install-scripts ls npm install-scripts approve better-sqlite3
approve は package.json の allowScripts に書き込みます。それをコミットすれば、ワークフローの npm ci もそれに従います。azure-mud は、確かめた版ごとにパッケージを許し、1つを断っています(azure-mud #1083):
"allowScripts": {
"core-js": false,
"@parcel/watcher@2.6.0": true,
"@swc/core@1.16.20": true
}
approveは既定で確かめた版を固定するので、その依存を上げると、新しい版を許すまでまた止められます。--no-allow-scripts-pinなら名前だけを書き、これからの版も許します(npm install-scripts)。- プロジェクトの
npm installやnpm ciのコマンドラインに--allow-scriptsを付けるとエラーです。これはnpm install -g・npx・npm execのためのもので、たとえばnpm install -g --allow-scripts=sharp sharpのように使います。 - 最近の npm 11 は「not yet covered by allowScripts」と出して、スクリプトは動かします。今のうちに
allowScriptsを足しておけば、npm 11 と 12 で同じツリーが入ります(#1083)。
3. または、当面は npm 11 にとどまる
- run: npm install -g npm@11 - run: npm ci
npm 11 もまだ新しい版が出ていて(11.21.1 は 12.2.1 と同じ10月15日)、trusted publishing にも足ります。ただし決めるのを先に延ばすだけで、allowScripts の作業はあとで同じだけ要ります。
ほかに、ワークフローで出る npm 12 の変化
同じリリースノートから:
- 知らないフラグ、省略したフラグ、ハイフン1つの複数文字のフラグは、警告でなくエラーになります。
npm-shrinkwrap.jsonは読まれなくなり、npm shrinkwrapとnpm adduserは無くなりました。npm view --jsonはいつも配列を返し、npm packとnpm publishの--jsonの出力も変わりました。そこから値を読むスクリプトは直す必要があるかもしれません。
見分け方
npm publishで「ENEEDAUTH」や「404 Not Found - PUT」:npm は有効なログイン無しでレジストリに届きました。- 自分のパスの
ls-remoteのあとに「git@github.com: Permission denied (publickey)」:npm が tarball のパスを GitHub のリポジトリと読みました。 - npm 10 や 11 で「Could not locate the bindings file」:スクリプトは動き、ネイティブモジュールのビルドが失敗しています。理由はそのステップのログの上の方にあります。
失敗したジョブを IntelliJ IDEA から見るなら
Pipeline Inbox for GitHub Actions Workflows は、Lesstep が作っている JetBrains IDE(2024.1 以降)のプラグインです。すべてのリポジトリの実行を、ジョブ・ステップと一緒に IDE のツールウィンドウに並べ、いまのブランチの実行はステータスバーに出ます。読むのは無料、失敗したジョブの再実行・キャンセル・ワークフローの実行・デプロイのレビューは Pro(月 US$1.50・30日の無料試用つき)です。
GitHub・GitHub Actions は GitHub, Inc. の商標、npm は npm, Inc. の商標、Node.js は OpenJS Foundation の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・npm, Inc.・OpenJS Foundation・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:npm publish と「ENEEDAUTH」 · npm publish と「Permission denied (publickey)」 · 「Node.js 20 actions are deprecated」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English