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をクリックします。

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

たとえばeditpromptは.github/workflows/publish.yamlでnpm publish
を実行しています。なのでWorkflow filename
にはpublish.yaml
と書きます。
GitHub Actions側の設定
ワークフローでの注意点は2つです。
まず、permissions
にid-token: write
を指定します。npmパッケージに限らずOIDCで必要なやつですね。
# ...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 publicnpm 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 cleanednpm warn publish "repository.url" was normalized to "git+https://github.com/eetann/editprompt.git"npm noticenpm notice 📦 editprompt@0.4.1...npm notice total files: 5npm noticenpm notice Publishing to https://registry.npmjs.org/ with tag latest and public accessnpm notice publish Signed provenance statement with source and build information from GitHub Actionsnpm notice publish Provenance statement published to transparency log: https://search.sigstore.dev/?logIndex=601175819npm error code E404npm error 404 Not Found - PUT https://registry.npmjs.org/editprompt - Not foundnpm error 404npm error 404 'editprompt@0.4.1' is not in this registry.npm error 404npm error 404 Note that you can also install from anpm 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.logProcess completed with exit code 1.
筆者の今まで使っていたsetup-nodeのv4はnpmのバージョンが10.9.3
でした。これが原因です。すでに書きましたが、v5であれば問題ありません。
setup-nodeであればActionsのログのEnvironment details
にバージョンが記録されてます。

それでも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
を消し忘れたのがエラーの原因です。
{ // ... "packageManager": "pnpm@10.8.1+sha512....",}
というわけでこのpackageManager
の行を消したらエラーが消えました。
mainブランチ以外でpushしてもOKなのか?
OKです。mainブランチ以外でタグ付けてpushしてもちゃんと公開できます。
筆者のワークフローの例を見てみましょう。実行条件は「v
から始まるタグを付けてpushしたとき」です。
on: push: tags: - "v*"
つまり、今回の対応をするとこんな流れになります。
- ローカルのdevブランチでワークフローをTrusted Publishingに変更
- ローカルのdevブランチでタグを打つ
- devブランチをpush
- ワークフローが実行される
最初に前述の404が出たときに「ワークフローって、mainブランチにマージした後じゃないと変更が反映されない?」とか考えましたが、そんなことはありませんでした。
まぁこれはnpmパッケージ関係なくGitHub Actionsの話です。
以上、Trusted Publishingを使ったnpmパッケージの公開でした。