先日 npm を Trusted Publishing 形式で publish しようとしたらハマってしまいました…。
Trusted Publishing CI/CD プロセスからトークン管理をなくす素晴らしい機能です。
publish 方法の変更で CI/CD がうまくいかない!って方のための記事となっております。
ぜひお役立てください!
yaml の書き換えループ
導入直後に「Token expired」のエラーを確認したとき、トークンや権限設定が原因だと考えました。
その思い込みから公式ドキュメントの Note に書かれた実行環境要件の記述を見落としてました…。
もちろん、Trusted Publishing は npm CLI がエラーの場合もあるのでその点はご留意ください。
GitHub Actions からトークンレスで publish するため、ドキュメント通りに以下の設定を行いました。
permissions:
id-token: write
contents: read
しかし、実行結果は 401 Unauthorized: Token expired。さらに 404 Not Found も併発しました。
npm notice Access token expired or revoked. Please try logging in again.
npm error code E404
npm error 404 Not Found - PUT https://registry.npmjs.org/@your-scope/pkg - Not found
lint などの動作は問題なかったため、permissions のインデントやリポジトリ名の完全一致を何度も確認する「YAML の書き換えループ」に陥りました。
ただ、答えはドキュメントの 1 行に示されていました…。
数時間の試行錯誤の末、ドキュメントを隅々まで読み直して見つけたのが以下の「Note」でした。
Note: To use Trusted Publishing with the npm CLI, you must be using npm CLI version 11.5.1 or later and Node version 22.14.0 or higher.
https://docs.npmjs.com/trusted-publishers
Trusted Publishing が依存する認証フローには、22 系の中でも比較的新しいパッチバージョンが必要だったのです。
解決:GitHub Actions の修正
actions/setup-node で、要件を満たすバージョンを明示的に指定しました。
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '22.14.0' # 22系ならOKではなく、22.14.0以上が必要
これでパブリッシュに成功しました。
教訓:最新機能ではメジャーバージョンではなく「詳細な制約」を疑う
今回のハマりどころから得た技術的な判断基準は以下の通りです。
- 認証エラーの「Token expired」を鵜呑みにしない: 最新の認証基盤では、実行環境(Node/npm)が未対応だと、内部的にトークンの生成や交換に失敗し、結果として見当違いなメッセージを吐くことがある
- 「最新メジャーバージョン」という過信を捨てる: 認証フローに関わる機能追加は、Node.js のマイナー/パッチリリースで行われることがある
- 「22 系だから大丈夫」ではなく「22.14.0 以上か?」まで疑う必要がある
- 「設定は合っているはずなのに動かない」ときは、一度 YAML から離れ、公式ドキュメントに書かれた最小構成要件(特に小数点以下のバージョン)を再確認する
まとめ
npm Trusted Publishing を導入する際は、YAML の設定を疑う前に、実行環境(Node.js / npm CLI)のバージョンが「パッチレベルまで」要件を満たしているかを確認してください。
「22系だから大丈夫」ではない: 公式ドキュメントの Note にある 22.14.0 といった詳細な数値を必ずチェックしてください。
エラーメッセージを信じすぎない: 環境が古いと「Token expired」や「404 Not Found」といった、実態と異なるメッセージで時間を溶かすことになります。