GitHub Package Registry に npm パッケージを Publish してみた
普段 npm パッケージを利用する際は、registry.npmjs.org
という npm 公式のレジストリからダウンロードしている。
npm レジストリは npm 公式以外にも存在し、GitHub にも GPR : GitHub Package Registry というレジストリが用意されている。
npm 自体が GitHub に吸収されたので (参考)、GPR を使う意義がどのくらいあるかは分からないが、とりあえず試してみた。
目次
GitHub Actions で GPR に npm Publish する
GPR への npm publish
は npm
コマンドでもできるが、レジストリの切り替えなどが面倒臭いので、GitHub Actions から行うことにする。
前提となるプロジェクトでは、@neos21/hoge
というように Owner 名を含んだスコープパッケージ名を package.json
に定義しているものとする。publishConfig
オプションの指定は不要。
master
ブランチへの Push 時に起動し、can-npm-publish
というパッケージで npm publish
できそうかチェックした上で公開する、という Workflow を書いた。
name: Publish To GPR
on:
push:
branches:
- master
# ↓ 手動で再実行できるように書いておく
workflow_dispatch:
jobs:
publish-to-gpr:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v1
- name: Use Node.js And Setup .npmrc
uses: actions/setup-node@v1
with:
node-version: '12.x'
# ↓ GPR に接続するにはココで以下のレジストリ URL を指定する
registry-url: 'https://npm.pkg.github.com'
# ↓ ユーザ名および package.json で指定したスコープに合わせる
scope : '@neos21'
always-auth : true
env :
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Can Publish
run : npx can-npm-publish --verbose
env :
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Install
run : npm install
env :
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Build
run : npm run build --if-present
env :
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Publish
run : npm publish --access=public
env :
NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
workflow_dispatch
イベントは最近追加されたモノ。GitHub 画面上から Workflow を手動で実行できるようになるactions/setup-node
にてregistry-url
とscope
を指定するのがミソ。コレで GPR を経由してnpm install
したりnpm publish
したりできる- GPR と接続するための認証トークンは、環境変数
NODE_AUTH_TOKEN
で渡すのが決まり NODE_AUTH_TOKEN
に渡すトークンは、GitHub が自動で用意してくれるGITHUB_TOKEN
シークレットを渡せば良い。GitHub が自動的に用意してくれるので、自分で「Secrets」を用意する必要はない- GPR にない npm パッケージは、npmjs.org にプロキシされるので、
npm install
なんかも普通に動く。とりあえずnpm
コマンドを叩く全ての Step でNODE_AUTH_TOKEN
を指定している
- GPR と接続するための認証トークンは、環境変数
can-npm-publish
はnpx
で実行する。package.json
のバージョン番号を見て、既に当該バージョンが公開されていたら、このコマンドがエラーで終了する。コレにより、以降の Step が動かないように制御してあるnpm install
は依存パッケージがなければ何の影響もないので、どんなパッケージにもこのまま流用できるだろうnpm run build
には--if-present
オプションを付けている。ビルドが必要なく、package.json
でbuild
スクリプトを用意していないパッケージでも、エラーにならず続行できる。どんなパッケージにもこのまま流用できるだろうnpm publish
に--access=public
オプションを付けているが、付けなくても Publish はできた。念のため付けてある感じ
とまぁこんな感じ。
GitHub Actions のことも GitHub Package Registry のことも、イマイチ分かりやすいコードが見当たらず、試行錯誤の結果、コレで Publish できた。
GPR に Publish したパッケージを使うには
こうして GPR に公開した npm パッケージを、今度は使用する側に回る。
まず ~/.npmrc
に次の1行を追記する。
registry=https://npm.pkg.github.com/【Owner 名】
Owner 名は、先程 npm publish
したパッケージの Owner 名を指定する。例えば僕のパッケージなら
registry=https://npm.pkg.github.com/neos21
とする。
続いて npm login
する。
$ npm login --registry=https://npm.pkg.github.com
ユーザ名、パスワード、メールアドレスを聞かれるので、GitHub のユーザ名、パスワード、メールアドレスを入力する。ログイン時に二段階認証を使っている場合は、パスワードは API Token を使うこと。git push
時の認証と同じ考え。
ログインできると、~/.npmrc
に次の1行が追記される。コレを直接書いてしまっても同じ効果になる。
//npm.pkg.github.com/:_authToken=【トークン文字列】
よって、~/.npmrc
に以下の2行があれば、GPR からパッケージを取得できるようになる。
registry=https://npm.pkg.github.com/【Owner 名】
//npm.pkg.github.com/:_authToken=【トークン文字列】
あとは指定した Owner 名の配下のパッケージを npm install
してみたりすれば良い。--verbose
を付ければキチンと GPR からダウンロードしていることが分かる。
オマケ : GPR のバージョンバッジを作る
Sheilds.io というバッジを作成できるサービスも、GPR に対応しているので、GPR のバージョンバッジが作れるようになった。次のような Markdown を書けば良い。
![GPR Version](https://img.shields.io/github/package-json/v/neos21/npm-neos21?label=gpr)
/v/【ユーザ名】/【リポジトリ名】
と指定する?label=gpr
部分は、ラベル名を任意で指定できる
GPR パッケージは一度公開すると次のような URL を生成する。
https://github.com/Neos21/npm-neos21/packages/
- 当該リポジトリ配下で
npm publish
されたパッケージ一覧ページ - モノレポに対応するためか、このような一覧ページが存在する
- 当該リポジトリ配下で
https://github.com/Neos21/npm-neos21/packages/323375
- パッケージ一つのページ
- 一度でも
npm publish
すると末尾の番号部分が自動採番される - バージョンアップしても URL は変わらない
コレをリンクに組み込んでも良いだろう。
[![NPM Version](https://img.shields.io/npm/v/@neos21/neos21.svg)](https://www.npmjs.com/package/@neos21/neos21)
[![GPR Version](https://img.shields.io/github/package-json/v/neos21/npm-neos21?label=gpr)](https://github.com/Neos21/npm-neos21/packages/323375)
こんな風に Markdown を書けば、npm と GPR のバージョンバッジを両方並べられる。
以上
GitHub Package Registry への npm Publish を GitHub Actions で自動化し、それを利用する方法も押さえた。
一般的なパッケージの利用ではあまり GPR を使うことは少ないかもしれないが、社内向けのプライベートレジストリとして使うような機会はあり得るので、知っておくと良いかと。