🏝️

Google Artifact Registryのprivate npmレジストリをbunから利用する

2024/04/08に公開

背景

package managerをbunに移行する時にgoogle-artifactregistry-authがbunに対応しておらず、困ったので認証ツールを自作しました。

https://github.com/tkow/bun-google-artifactregistry-auth

仕組み

npm版のgoogle-artifactregistry-authはプロジェクトに配置された.npmrcからregistryとscopeに設定されているregistryを抜き出し、google authライブラリから取得したtokenと一緒にHomeディレクトリの.npmrcに保存することでglobalに認証情報が有効になる仕組みだったので、そちらを踏襲しました。

bunのレジストリ認証(公式ドキュメントより)は、以下の形式で設定可能です。

[install]
# set default registry as a string
registry = "https://registry.npmjs.org"
# set a token
registry = { url = "https://registry.npmjs.org", token = "123456" }
# set a username/password
registry = "https://username:password@registry.npmjs.org"
[install.scopes]
# registry as string
"@myorg1" = "https://username:password@registry.myorg.com/"

# registry with username/password
# you can reference environment variables
"@myorg2" = { username = "myusername", password = "$NPM_PASS", url = "https://registry.myorg.com/" }

# registry with token
"@myorg3" = { token = "$npm_token", url = "https://registry.myorg.com/" }

google-artifactregsitryはurl,token型のフォーマットで認証可能なので、その形式にコンバートしています。

bunにも$HOME/.bunfig.tomlを設定するとglobalに設定が有効になる仕組みがあるので、それを利用します。また、既存にbunfig.tomlがある場合は、それを上書きせず、設定をマージします。元にする.npmrc,元となるbunfigファイル,出力先のbunfigファイルのパスはオプションで変更可能です。

使い方

  1. google-artifactregistry-auth同様にprint-settingで取得した.npmrcをプロジェクトに配置します。
gcloud artifacts print-settings npm [--project=PROJECT] \
    [--repository=REPOSITORY] \
    [--location=LOCATION] \
    --scope=@SCOPE-NAME \
  1. npx -y @tkow/bun-google-artifactregistry-authを実行すると、認証が成功した場合、$HOME/.bunfig.tomlが生成されます。

  2. セッションが持続している場合、bunでnpmがインストールできます。

  3. お好みでscriptにaliasを入れて、google-artifactregistry-authと差し替えるのを簡単にしておきます。

"scripts": {
 "npm:login": "npx -y @tkow/bun-google-artifactregistry-auth"
}
株式会社MOCHI

Discussion