プライベート npm パッケージを CI/CD でインストールできるようにする方法
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
GitHub Actions
actions/setup-node
アクションで、 registry-url
と scope
を設定します。
npm ci
や yarn 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 }}
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
CodeBuild (Docker)
通常の変数を使用してしまうとコンテナに保持されてしまいます。 docker historyなどを用いることでアクセストークンを入手できてしまうので危険です。
代わりにsecret引数を使用します。
Dockerfile
RUN 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 .
まとめ
プライベートnpmパッケージをCI/CDでインストールできるようにする方法について解説しました。
マイクロフロントエンドやデザインシステムを適用する場面で必要な機会が増えてきそうです。
なお、有効期限のないアクセストークンを扱う以上、セキュリティのリスクがあります。日々ベストプラクティスは変わっていくので、定期的に見直しが必要です。
私は、将来的にOpenID Connectを用いたアクセス方法に置き換わっていくのではないかと予想しています。
Discussion