GitHub Actions:npm publish が「ENEEDAUTH」で失敗する
ジョブに npm のトークンが無いとき、npm publish は trusted publishing に頼ります。npm が GitHub に OIDC のトークンを頼み、レジストリで短い時間だけ使える公開用のトークンに換えます。このどこかで失敗しても、npm は標準のログでは何も言いません。認証情報の無いまま進み、「need auth」で止まります。エラーは結果で、理由は、こちらから頼まないと出ないログの行にあります。
見え方
npm error code ENEEDAUTH npm error need auth This command requires you to be logged in to https://registry.npmjs.org/ npm error need auth You need to authorize this machine using `npm adduser`
- ジョブにトークンもあるなら、npm はそちらを使います。そのパッケージを公開できないトークンだと、代わりに
404 Not Found - PUT https://registry.npmjs.org/<package> - Not foundになります。その1つが、v7 より前のactions/setup-nodeがregistry-urlを指定したときにNODE_AUTH_TOKENに入れていた仮の値XXXXX-XXXXX-XXXXX-XXXXXです(npm/cli #9969・setup-node #1558)。 - trusted publishing に移るワークフローが増えているのは、2FA を飛ばす npm の granular access token が直接の公開をできなくなるからです。GitHub の 2026年7月31日の changelog は、2027年1月を目標にしています。
npm に理由を表示させる
npm の lib/utils/oidc.js は、コマンドを失敗にしません。あきらめる道はどれも、verbose か silly のログに1行出るだけです。一度だけ、次のように公開します:
- run: npm publish --loglevel silly
そして oidc を含む行を探します:
npm silly oidc Skipped because incorrect permissions for id-token within GitHub workflow:ジョブにid-token: writeがありません(2)。npm verbose oidc Failed token exchange request with body message: ...:GitHub はトークンを出し、レジストリが断りました。メッセージはレジストリの理由で、たとえば「OIDC token exchange error - package not found」です(npm/cli #9969)。たいていは trusted publisher が実行と合っていません(3)。npm verbose oidc Successfully retrieved and set token:trusted publishing は動いていて、失敗の理由はほかにあります。oidcの行が1つも無い:この npm には trusted publishing がありません(1)。
交換を断られたあとで --loglevel verbose を足したプロジェクトがいくつもあります(duskfleet #314・agentboard #71)。verbose ではレジストリの理由は出ますが、権限が無いことは silly にしか出ません。
1. npm が 11.5.1 より古い
npm のドキュメントには、trusted publishing は「requires npm CLI version 11.5.1 or later and Node version 22.14.0 or higher.」(npm CLI 11.5.1 以降と Node 22.14.0 以上が必要)とあります。Ubuntu 24.04 のランナーのイメージに入っているのは Node.js 22.23.4 と npm 10.9.9 で、setup-node で node-version: '22' にしても npm は 10 です。Node 24 を入れないジョブは、試しもしない npm で公開します。homeboy のリリースのアクションは、Node の版を書いていない部品では Node のセットアップを飛ばしていて、その公開が ENEEDAUTH で失敗しました(#17247)。
- uses: actions/setup-node@v7
with:
node-version: '24'
- run: npm --version
- run: npm publish
Node の版を変えないなら、公開の前に npm install -g npm@latest を実行します。
2. id-token: write が無い
これが無いと、ジョブには GitHub に OIDC のトークンを頼む手段がありません。ジョブの permissions: はワークフローのものを置き換えるので、公開のジョブに自分の permissions: があるなら、そこにも要ります。公開が再利用可能なワークフローの中で動くなら、npm のドキュメントは、この権限は「must also be given to both parent and child workflows.」(呼ぶ側と呼ばれる側の両方に与える必要がある)と書いています。
permissions: contents: read id-token: write
3. trusted publisher が実行と合わない
npm は、npmjs.com のパッケージの設定に入れた内容と実行を照らし合わせます。保存するときには中身を確かめません。どの欄も大文字と小文字を区別します。
- Workflow filename はファイル名だけで、
.ymlか.yamlをつけます。再利用可能なワークフローでは、npm のドキュメントによると、照らし合わせに使うのは呼ぶ側のワークフローの名前で、npm publishのあるファイルではありません。 - Environment name は公開のジョブの
environment:と合っていなければなりません。ジョブに無いなら空にします。astria のメモには、環境が違うか無いと交換を断られるとあります。 - パッケージごとに、そのパッケージの設定で trusted publisher が要ります。astria のリリースでは4つのパッケージが公開され、設定の無かった3つが ENEEDAUTH で止まりました(#140)。
package.jsonのrepository.urlは GitHub のリポジトリと正確に合っていなければなりません。フォークもここで引っかかります。- 新しい trusted publisher は、2日以内に最初の公開を成功させないと期限が切れ、使うことも直すこともできなくなります。消して、新しく足します。変えたいときも同じで、直すことはできず、消して足し直すだけです。
4. セルフホストランナー
npm のドキュメントには「Self-hosted runners are not currently supported but are planned for future releases.」(セルフホストランナーはいまは対応しておらず、今後の予定)とあります。GitHub のホストランナーから公開するか、そこではトークンを使います。
見分け方
- スコープつきのパッケージで
402 Payment Required:非公開として公開しようとしています。--access publicか"publishConfig": {"access": "public"}を足します。 403と「You cannot publish over the previously published versions」:package.jsonの版がもう npm にあります。EOTP:ワンタイムパスワードの要るトークンです。trusted publishing では要りません。npm ciが非公開の依存で失敗する:trusted publishing は公開のためだけのものです。非公開のパッケージを入れるには、今まで通り読み取り専用のトークンが要ります。
失敗したジョブを 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. の商標、IntelliJ IDEA は JetBrains s.r.o. の商標です。このページは GitHub, Inc.・npm, Inc.・JetBrains のいずれとも提携しておらず、承認も受けていません。
ほかに:AWS:「Not authorized to perform sts:AssumeRoleWithWebIdentity」 · 「Node.js 20 is deprecated」の警告 · 「Input required and not supplied」 · IntelliJ IDEA で使える GitHub Actions のプラグインの比較 · English