🔐

プライベート npm パッケージを CI/CD でインストールできるようにする方法

2023/02/20に公開

npm private packagesやGitHub Packagesなどのプライベートnpmパッケージをインストールする場合のCI/CDの設定方法を解説します。

背景

デザインシステムを構築した際、プライベートnpmパッケージをGitHub Packages経由で配信することにしたのですが、CI/CDでの依存関係インストールに苦戦したので、各プラットフォームでの設定方法を解説します。 (2023年2月現在)

ローカル開発環境

意外と忘れてしまうので、まずはローカル環境での設定について解説します。

package.jsonと同じディレクトリに .npmrcファイルを追加し、次のように設定します。

コミットする前に .gitignoreに .npmrcを追加しましょう!

# @bicstone/ の場合は GitHub Packages を参照するように設定
@bicstone:registry=https://npm.pkg.github.com/
# トークンを設定 (GitHub の場合は read:packages 権限の付いた PAT を使用)
//npm.pkg.github.com/:_authToken=accessToken

https://docs.npmjs.com/cli/v9/configuring-npm/npmrc

GitHub Actions

actions/setup-node アクションで、 registry-urlscope を設定します。

npm ciyarn install する際には NODE_AUTH_TOKEN を環境変数として渡します。

環境変数を渡す際はGitHubのEnvironment Secretを使用するようにしましょう。

steps:
  - uses: actions/checkout@v3
  - uses: actions/setup-node@v3
    with:
      registry-url: "https://npm.pkg.github.com"
      scope: "@bicstone"
  - run: npm ci
    env:
      NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}

https://github.com/actions/setup-node/blob/main/docs/advanced-usage.md#use-private-packages

https://docs.github.com/ja/actions/security-guides/encrypted-secrets

CircleCI

.npmrcを作成することで設定します。

依存関係インストール後、不要になった .npmrcを削除する処理を入れておくようにしましょう。

steps:
  - checkout
  - run:
      name: Set npm config
      command: |
        npm config set "@bicstone:registry" "https://npm.pkg.github.com/"
        echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> ~/.npmrc
  - run: npm ci
  - run:
      name: Remove npm config
      command: rm ~/.npmrc

https://circleci.com/blog/publishing-npm-packages-using-circleci-2-0/

CodeBuild (Docker)

通常の変数を使用してしまうとコンテナに保持されてしまいます。 docker historyなどを用いることでアクセストークンを入手できてしまうので危険です。

代わりにsecret引数を使用します。

Dockerfile

RUN --mount=type=secret,id=npmrc,dst=.npmrc npm ci
version: 0.2
env:
  variables:
    DOCKER_BUILDKIT: 1
phases:
  pre_build:
    commands:
      - echo "@bicstone:registry=https://npm.pkg.github.com/" > .npmrc && echo "//npm.pkg.github.com/:_authToken=${NODE_AUTH_TOKEN}" >> .npmrc
  build:
    commands:
      - docker build -t $REPOSITORY_URI:$ENV_NAME --secret id=npmrc,src=.npmrc .

https://docs.docker.com/engine/reference/builder/#run---mounttypesecret

まとめ

プライベートnpmパッケージをCI/CDでインストールできるようにする方法について解説しました。

マイクロフロントエンドやデザインシステムを適用する場面で必要な機会が増えてきそうです。

なお、有効期限のないアクセストークンを扱う以上、セキュリティのリスクがあります。日々ベストプラクティスは変わっていくので、定期的に見直しが必要です。

私は、将来的にOpenID Connectを用いたアクセス方法に置き換わっていくのではないかと予想しています。

Discussion