npmパッケージをトークン無しで公開する方法〜実際にハマったエラーも解説〜

自作npmパッケージ editprompt をGitHub Actionsからnpm publishしていました。先日、今まで使っていたトークンが切れたため、 トークン無しでpublishできる Trusted publishingに切り替えました。

この記事ではTrusted publishingの設定方法と実際にハマったエラー・解決策を解説します。

Trusted publishingとは

Trusted publishingは「ワークフローからnpmパッケージを公開するためのしくみ」の1つです。今までのしくみだとトークンが必要でしたが、Trusted publishingであればOIDCを使うのでnpmトークンが不要です。

設定方法

npmの公式ドキュメントを参考にしつつ、ここでは実際に筆者が設定した流れを解説します。

設定方法はめっちゃ簡単なので重い腰ならさっさと上げましょう。

npmパッケージ側の設定

まずnpmパッケージのSettings > Trusted Publisherから使いたいPublisherをクリックします。

publisherの選択

次にリポジトリ情報とワークフローのファイル名を入力します。

Publisherの編集

たとえばeditpromptは.github/workflows/publish.yamlnpm publishを実行しています。なのでWorkflow filenameにはpublish.yamlと書きます。

GitHub Actions側の設定

ワークフローでの注意点は2つです。

まず、permissionsid-token: writeを指定します。npmパッケージに限らずOIDCで必要なやつですね。

publish.yaml
# ...
jobs:
publish:
runs-on: ubuntu-latest
permissions:
contents: read
id-token: write # for OIDC
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Node
uses: actions/setup-node@v5
with:
node-version: "24.x"
registry-url: "https://registry.npmjs.org"
# ...
- name: Publish to npm
run: npm publish --provenance --access public

npmのバージョンは 11.5.1以上を指定 しましょう。これを忘れると404エラーになります。 setup-nodeのv5 であれば問題ありません。

実際に筆者が実行してみたとき(2025年10月12日)のactions/setup-node@v5でのnpmのバージョンは11.6.0でした。

今まで使っていたトークンを消す

リポジトリのシークレットやnpmのアクセストークン管理で、トークンを消しましょう。

トラブルシューティングとFQA

随時追記します。

404になるパターン

公式ドキュメントをよく読まずに実行したら、次のように404になりました。

Run npm publish --provenance --access public
npm warn publish npm auto-corrected some errors in your package.json when publishing. Please run "npm pkg fix" to address these errors.
npm warn publish errors corrected:
npm warn publish "bin[editprompt]" script name was cleaned
npm warn publish "repository.url" was normalized to "git+https://github.com/eetann/editprompt.git"
npm notice
npm notice 📦 editprompt@0.4.1
...
npm notice total files: 5
npm notice
npm notice Publishing to https://registry.npmjs.org/ with tag latest and public access
npm notice publish Signed provenance statement with source and build information from GitHub Actions
npm notice publish Provenance statement published to transparency log: https://search.sigstore.dev/?logIndex=601175819
npm error code E404
npm error 404 Not Found - PUT https://registry.npmjs.org/editprompt - Not found
npm error 404
npm error 404 'editprompt@0.4.1' is not in this registry.
npm error 404
npm error 404 Note that you can also install from a
npm error 404 tarball, folder, http url, or git url.
npm error A complete log of this run can be found in: /home/runner/.npm/_logs/2025-10-12T08_26_17_611Z-debug-0.log
Process completed with exit code 1.

筆者の今まで使っていたsetup-nodeのv4はnpmのバージョンが10.9.3でした。これが原因です。すでに書きましたが、v5であれば問題ありません。

setup-nodeであればActionsのログのEnvironment detailsにバージョンが記録されてます。

Actionsからnpmのバージョンをチェック

それでも404が出るなら「リポジトリ名が間違っていないか」などを確認してみましょう。

pnpm使っていないのに「pnpmが〜」とか怒られる

setup-nodeをv5に上げた後に再度ワークフローを実行したら、次のようなエラーになりました。

Error: Unable to locate executable file: pnpm.
Please verify either the file path exists or the file can be found within a directory specified by the PATH environment variable. Also check the file mode to verify the file is executable.

この原因はpackage.jsonにありました。以前はpnpmを使っていたのですがpnpmからBunに切り替えました。そのときにpackageManagerを消し忘れたのがエラーの原因です。

package.json
{
// ...
"packageManager": "pnpm@10.8.1+sha512....",
}

というわけでこのpackageManagerの行を消したらエラーが消えました。

mainブランチ以外でpushしてもOKなのか?

OKです。mainブランチ以外でタグ付けてpushしてもちゃんと公開できます。

筆者のワークフローの例を見てみましょう。実行条件は「vから始まるタグを付けてpushしたとき」です。

publish.yaml
on:
push:
tags:
- "v*"

つまり、今回の対応をするとこんな流れになります。

  • ローカルのdevブランチでワークフローをTrusted Publishingに変更
  • ローカルのdevブランチでタグを打つ
  • devブランチをpush
  • ワークフローが実行される

最初に前述の404が出たときに「ワークフローって、mainブランチにマージした後じゃないと変更が反映されない?」とか考えましたが、そんなことはありませんでした。

まぁこれはnpmパッケージ関係なくGitHub Actionsの話です。


以上、Trusted Publishingを使ったnpmパッケージの公開でした。