Closed7

npm.jsでPrivate Packageを運用する時のあれこれ

kyoya0819kyoya0819

GitHub PackageでPrivateのものを社内運用する〜みたいな情報はいっぱいあるけど、npm.jsのPrivate Packageは意外とないよね〜ということで書いていきます。

kyoya0819kyoya0819

Yarnのberryがラクダヨ!

Yarnのberryがおすすめ
(というよりこのスクラップはそれ前提で書いていきます。

具体的には、yarn@4.1.0を使ってます。

kyoya0819kyoya0819

.yarnrc.ymlの記述例

yarnPathnodeLinkerどうでもよくてnpmAuthTokenが重要です。
これを書くと、Yarnくんがよしなにやってくれます。

NPM_TOKENの値は、環境変数から渡す感じになっています。
その方がデプロイとかCI/CDで取り回しやすいからね。

ローカル環境はIDEのTerminal Enviroment Value的なところから設定してください()

yarnPath: .yarn/releases/yarn-4.1.0.cjs

nodeLinker: node-modules

npmAuthToken: ${NPM_TOKEN}
kyoya0819kyoya0819

CI/CDの記述例

GitHub Actions + (Eslint, Stylelint)想定です。

name: Test (Eslint, Stylelint)

on:
    push:
        branches: [ '*' ]
    pull_request:
        branches: [ '*' ]

    workflow_dispatch:

env:
    NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

jobs:
    setup:
        runs-on: ubuntu-latest

        steps:
            - uses: actions/checkout@v3

            - uses: actions/setup-node@v3
              with:
                  node-version: '20'

            - name: Cache Dependencies
              id: yarn_cache
              uses: actions/cache@v3
              with:
                  path: '**/node_modules'
                  key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

            - name: Install Dependencies
              if: steps.yarn_cache.outputs.cache-hit != 'true'
              run: yarn install


    eslint:
        runs-on: ubuntu-latest
        needs:
            - setup
        steps:
            - uses: actions/checkout@v3

            - uses: actions/setup-node@v3
              with:
                  node-version: '20'

            - name: Restore Cache Dependencies
              uses: actions/cache@v3
              with:
                  path: '**/node_modules'
                  key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

            - name: Eslint Check
              run: yarn eslint


    stylelint:
        runs-on: ubuntu-latest
        needs:
            - setup
        steps:
            - uses: actions/checkout@v3

            - uses: actions/setup-node@v3
              with:
                  node-version: '20'

            - name: Restore Cache Dependencies
              uses: actions/cache@v3
              with:
                  path: '**/node_modules'
                  key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

            - name: Stylelint Check
              run: yarn stylelint

ミソは、言わずもがなNPM_TOKEN: ${{ secrets.NPM_TOKEN }}です。
GitHubのレポジトリの設定から、NPM_TOKENを設定してあげればそれ以外に特に設定も必要ありません。

kyoya0819kyoya0819

ここで注意点

yarnで各種コマンドを実行するには、環境変数(この場合はNPM_TOKEN)が必要です。

上記例で、yarn installだけにNPM_TOKENを設定せずに、Workflow全体に環境変数を適応しているのはこのような理由があります。

yarn --helpをするのにも環境変数が必要です()

kyoya0819kyoya0819

PublishするPrivate Package側

name: Publish Package to npmjs

on:
    push:
        branches:
            - main

jobs:
    publish:
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v3

            - uses: actions/setup-node@v3
              with:
                  node-version: '20.x'
                  registry-url: 'https://registry.npmjs.org'

            - name: Cache Dependencies
              id: npm_cache
              uses: actions/cache@v3
              with:
                  path: '**/node_modules'
                  key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }}

            - name: Install Dependencies
              if: steps.yarn_cache.outputs.cache-hit != 'true'
              run: yarn install --prefer-offline

            - name: Publish Package to npmjs
              run: |
                  git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com"
                  git config --local user.name "github-actions[bot]"
                  npm version patch
                  git push
                  # npm publish --provenance
                  npm publish
              env:
                  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

package.jsonのversionが重複するとエラーを吐いてしまうので、npm version patchでパッチレベルでバージョンを変えてPUSHしてから、npm publishをしてます。

このCI / CD自体には下記の問題点があるので、実際使ったりする場合は注意 & 改善を(

1, パッチレベルのバージョン以外変えられない

npm publishとパッチレベルのバージョンを変える処理が一体化しているので、他のバージョンを変える〜みたいなのが難しいです。

2, npm publishする前に次のPushをmainブランチにするとエラーを吐く

npm publishをする直前に、package.jsonのversionを変える処理が入っています。
その影響で、versionの変更をレポジトリにCI / CDがPushした後に、次の自らの変更をレポジトリにPushしないとバージョンが重複してしまいます。

kyoya0819kyoya0819

Publishする側はyarnのバージョンはなんでもあまり労力は変わらないので、お好きなものを()
この例では、1系のClassicを使ってます。(Berryを使うなら--prefer-offlineを消してね

このスクラップは2024/02/05にクローズされました