npm Trusted PublishingがCircleCI対応へ、GitHub利用者向け設定手順と注意点

CircleCI で npm publish しているなら、今回の更新はかなり実務的です。npm Trusted Publishing(信頼された公開)が CircleCI をサポートしたことで、GitHub でコードを管理しつつ CircleCI から npm に公開しているチームでも、長期保存の npm トークンを置かずに公開できるようになりました。GitHub Changelog では、CircleCI が GitHub Actions と GitLab CI/CD に続く OIDC プロバイダーになったと案内されています。(The GitHub Blog)

結論からいうと、公開フローの安全性は上げやすくなります。ただし、CircleCI 版には「自動 provenance がまだ付かない」「self-hosted runner は対象外」「1パッケージにつき trusted publisher は1つだけ」といった制約もあります。設定は npmjs.com の package settings か npm trust CLI から行えます。(npm ドキュメント)

目次

npm Trusted Publishing の CircleCI 対応で何が変わったのか

今回の変更の本質は、CircleCI を使うチームが publish 専用の NPM_TOKEN を持たなくて済む選択肢が増えた点です。npm の trusted publishing は OIDC で npm と CI/CD を信頼連携させ、npm publish 時に短命な認証を使います。GitHub Changelog でも、CircleCI から公開する maintainer は保存済み資格情報を排除できると説明されています。(The GitHub Blog)

まずは、今回のアップデートを実務視点で整理すると次のとおりです。(The GitHub Blog)

項目今回の内容実務での意味
対応CICircleCI Cloud が trusted publishing の対象に追加GitHub リポジトリを CircleCI でビルド・公開している構成でも OIDC に寄せやすい
認証方式NPM_ID_TOKEN に CircleCI の OIDC token を渡して publish長期トークンの保管・ローテーション負荷を下げられる
設定方法npmjs.com の Trusted publishing か npm trust circleciGitHub や CircleCI だけで設定は完結しない
対応範囲OIDC は publish 操作中心。self-hosted は未対応npm ci などは別認証を考える必要がある
provenanceGitHub Actions / GitLab は自動生成、CircleCI は未対応証跡を重視するなら publish 経路の選択が重要になる

要するに、今回の CircleCI 対応は「新しいCIを増やす話」ではなく、「既に CircleCI を使っているチームが、そのまま安全に npm 公開できるようになる話」です。(The GitHub Blog)

GitHub 利用者にとっての実務メリット

特に恩恵が大きいのは、リポジトリは GitHub にあり、CI/CD 標準は CircleCI というチームです。これまでは公開だけ GitHub Actions に寄せるか、CircleCI に publish 用トークンを持たせるかのどちらかになりがちでした。CircleCI が trusted publishing に対応したことで、公開権限を「人や秘密情報」ではなく「許可されたワークフロー」に寄せやすくなります。(The GitHub Blog)

次のようなチームほど、今回の変更の価値を感じやすいはずです。

  • GitHub でソース管理しているが、テスト・ビルド・リリースは CircleCI に統一している
  • CircleCI Contexts や project 環境変数に NPM_TOKEN を置きたくない
  • 複数人がリリースに関わるため、公開権限をタグやジョブ条件で絞りたい
  • publish のためだけに GitHub Actions を別運用したくない

公開権限を長期トークンからワークフローIDへ移せるのが、trusted publishing のいちばん大きな価値です。セキュリティ面だけでなく、引き継ぎや token ローテーションの運用負荷も下げやすくなります。(npm ドキュメント)

仕組みを短く理解する

仕組みはシンプルです。npm trusted publishing は OIDC で CI/CD と信頼関係を作り、npm CLI は OIDC 環境を検知すると従来のトークンより先にそちらを使います。CircleCI では circleci run oidc get --claims '{"aud": "npm:registry.npmjs.org"}' で audience を指定した token を取得し、それを NPM_ID_TOKEN として npm publish に渡します。npm はその ID token を短命な publish token に交換して公開を実行します。(npm ドキュメント)

ただし、OIDC が効くのは publish 操作です。private dependency の npm cinpm install に必要な認証までは置き換わりません。private package を取得するジョブでは、読み取り専用トークンを別途使う前提で設計したほうが安全です。(npm ドキュメント)

導入前に確認すること

導入前に見落としやすい前提条件をまとめます。ここを外すと「設定は保存できたのに公開だけ失敗する」になりやすいです。(npm ドキュメント)

確認項目必要条件見落としやすい点
npm publish 実行環境npm CLI 11.5.1以上、Node 22.14.0以上CircleCI executor image が古いと OIDC publish 自体が使えない
npm trust CLI 管理npm 11.10.0以上、package の write 権限、account-level 2FA、対象 package が registry 上に存在brand-new package や権限不足だと CLI で詰まりやすい
対応環境GitHub-hosted runners / GitLab.com shared runners / CircleCI cloudself-hosted runner は未対応
運用単位1 package に trusted publisher は1つGitHub Actions と CircleCI を同時に本番 publish の正規経路にはしにくい
OIDC の適用範囲publish 時の認証npm whoamiinstallviewaccess は別扱い

npm trust は workspaces を認識しないため、monorepo ではカレントディレクトリの package.json に依存しすぎないほうが安全です。package 名を明示して実行するほうが事故を減らせます。(npm ドキュメント)

CircleCI で設定する手順

npm 側で trusted publisher を登録する

設定の起点は GitHub ではなく npm 側です。npmjs.com で Packages → 対象 package → Settings → Trusted publishing を開き、CircleCI を選んで信頼関係を作ります。変更は将来の publish にすぐ反映されます。(npm ドキュメント)

Web 画面で求められる主な情報は次の5つです。(npm ドキュメント)

  1. Organization ID
    CircleCI Organization Settings の Overview で確認する UUID です。
  2. Project ID
    CircleCI Project Settings の Overview で確認する UUID です。
  3. Pipeline definition ID
    CircleCI Project Setup で確認する UUID です。
  4. VCS origin
    GitHub リポジトリなら、github.com/owner/repo のような origin を指定します。
  5. Context IDs(任意)
    特定 context を使う job だけに publish を制限したいときに使います。

どのIDをどこで確認するかは npm Docs が画面単位で案内しています。実務的には、publish 用の CircleCI context を別に切り出し、その context ID を trusted publisher に登録しておくと、同じ project 内の別 job から不用意に publish されるリスクを下げやすくなります。(npm ドキュメント)

CLI で登録する場合

Web UI ではなく CLI で管理したいなら npm trust circleci が使えます。これは npm website での設定のコマンドライン版で、CircleCI 向けには org / project / pipeline definition / vcs origin を指定します。CLI を使う場合は npm 11.10.0以上、2FA、有効な package 権限が必要です。(npm ドキュメント)

npm trust circleci my-package \
  --org-id <circleci-org-uuid> \
  --project-id <circleci-project-uuid> \
  --pipeline-definition-id <pipeline-definition-uuid> \
  --vcs-origin <origin> \
  -y

既に GitHub Actions など別の trusted publisher を使っている package は、そのまま CircleCI を追加できません。1 package 1設定なので、npm trust list で既存設定を確認し、必要なら npm trust revoke --id <trust-id> で外してから切り替えるか、npmjs.com 側で既存設定を編集します。(npm ドキュメント)

CircleCI の publish ジョブ例

CircleCI 側の publish job は、NPM_TOKEN を埋め込む代わりに、OIDC token を NPM_ID_TOKEN として渡す構成に変わります。公式例の要点だけ残すと、次のように考えると分かりやすいです。(npm ドキュメント)

version: 2.1

jobs:
  publish:
    docker:
      - image: cimg/node:22.14
    steps:
      - checkout
      - run: npm ci
      - run: npm test
      - run:
          name: Publish to npm with OIDC
          command: |
            export NPM_ID_TOKEN=$(circleci run oidc get --claims '{"aud": "npm:registry.npmjs.org"}')
            npm publish

workflows:
  release:
    jobs:
      - publish:
          filters:
            tags:
              only: /^v.*/
            branches:
              ignore: /.*/

audnpm:registry.npmjs.org にする必要があります。また、CircleCI でこの方法で生成した OIDC token はマスクされずに表示され得るので、echo やデバッグ出力に流さない運用が重要です。(npm Registry API)

実運用では、GitHub 側の release tag 作成を publish の入口にすると管理しやすくなります。CircleCI の公式例もタグ実行限定で、branches は無視する形です。GitHub の tag protection と組み合わせると、「誰が公開を開始できるか」まで締めやすくなります。(npm ドキュメント)

既存の NPM_TOKEN 運用から安全に移行する手順

既存の NPM_TOKEN 運用から切り替えるなら、いきなり token を消さず、次の順で進めると事故が少なめです。

  1. CircleCI executor の Node / npm バージョンを条件以上に上げる
  2. npm 側で trusted publisher を登録し、CircleCI job を OIDC 版に切り替える
  3. まずは小さな patch リリースや検証用 package で publish 成功を確認する
  4. npm の Publishing access で token を禁止する設定に切り替える
  5. 使わなくなった automation token を revoke し、CircleCI Contexts / project env vars からも削除する
  6. GitHub の tag 作成権限を見直し、公開トリガーを release 担当者に絞る

npm Docs も、trusted publisher を先に動作確認してから token を禁止し、不要な automation token を revoke する順を勧めています。追加の安全策として、tag protection や trusted publisher 設定の定期棚卸しも挙げられています。(npm ドキュメント)

CircleCI を選ぶべきケースと、まだ見送るべきケース

すぐ導入しやすいケース

  • CI/CD の標準がすでに CircleCI
  • npm publish のためだけに GitHub Actions を別管理している
  • CircleCI の context や環境変数から publish token をなくしたい
  • release pipeline を1本に揃えたい

まだ見送るべきケース

  • npm package に provenance を自動付与したい
  • self-hosted runner 前提の運用をしている
  • npm publish 以外の npm 操作まで OIDC 一元化したい
  • GitHub Actions を正規の release path として既に安定運用している

判断基準はかなり明快です。CircleCI trusted publishing は「CircleCI を使い続けながら token 管理を減らす」には向いていますが、「provenance も今すぐ自動で欲しい」には向きません。現時点で自動 provenance が付くのは GitHub Actions と GitLab CI/CD で、しかも trusted publishing かつ public repository / public package が条件です。private repository では provenance は自動生成されません。(npm ドキュメント)

よくある失敗と対処

最後に、実務で詰まりやすいポイントを先に潰しておきます。公式ドキュメントで明示されているものと、そこから見える典型パターンをまとめると次の通りです。(npm ドキュメント)

症状よくある原因対処
ENEEDAUTH / Unable to authenticateOrg / Project / Pipeline / VCS origin などが不一致、または未対応環境各値を厳密に見直し、CircleCI Cloud かどうかも確認する
設定保存後も publish だけ失敗するnpm は trusted publisher 設定を保存時に検証しない一字一句見直し、実 publish で検証する
npm ci が通らないtrusted publishing は publish 専用private dependency 取得には read-only token を残す
OIDC token がログに出るtoken を echo や debug 出力したcircleci run oidc get の結果を表示しない
npm whoami で確認できないOIDC 認証は publish 時だけ成否確認は publish 実行ログで行う
provider 切り替えで混乱する1 package 1 trusted publishernpm trust list / revoke か npmjs.com の編集で切り替える

npm Trusted Publishing の CircleCI 対応で、GitHub を使う JavaScript / Node.js チームは「CircleCI から安全に npm 公開する」選択肢を正式に持てるようになりました。価値が大きいのは、公開用の長期トークンを減らしつつ、既存の CircleCI release flow を崩さずに済む点です。(The GitHub Blog)

次にやることは3つです。CircleCI executor の Node / npm を条件に合わせる、npm 側で trusted publisher を登録する、publish 成功後に NPM_TOKEN と automation token を撤去する。逆に、provenance の自動生成を最優先するなら、現時点では GitHub Actions で publish を維持する判断も十分合理的です。(npm ドキュメント)

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次