プライベートパッケージリポジトリのススメ

この記事は、 NTT Communications Advent Calendar 2022 23 日目の記事です。

はじめに

こんにちは、デジタル改革推進部の組橋です。普段は社内データの整備や分析をしています。

この記事では、社内ツールなどの自作ツールを管理する方法や関連するサービスを紹介します。

パッケージリポジトリとは

パッケージ

ソフトウェアにおけるパッケージとはいくつかの機能を1つにまとめて、管理しやすくしたものを指します。

例えば、Pythonのパッケージはpipコマンドでインストールできます。

pip install $PACKAGE_NAME

リポジトリ

リポジトリは、保管場所という意味があります。 パッケージリポジトリはパッケージの保管場所です。単にリポジトリというと最近はGitリポジトリを指すことが多いですが、これはソースコードの保管場所ですね。

例えば、Pythonの公式パッケージリポジトリはPython Package Index (PyPI)であり、pipでインストールする際のデフォルトの参照先に指定されています。

自分たち専用のパッケージリポジトリ

Pythonに限らず他の言語にも公式のパッケージリポジトリがあり、公開されているパッケージを利用して開発することは一般的です。

公開されているパッケージに自分たちのほしいものがないとき、自作することはよくあることかと思います。 しかし、プロジェクトごとにツールを作ってutilstoolsみたいなディレクトリに置いていくと、似たようなツールが散乱してしまいます。

そこで、自分たち専用のパッケージリポジトリを用意すると、ツールの配布や管理が便利になります。 リポジトリがあることで再利用が促進され、開発効率が上がるかもしれません。

Pythonのプライベートパッケージリポジトリ

Pythonで独自のパッケージリポジトリを用意するには、pypiserverを用いる方法が簡単です。

pypiserver自身もPython製なのでpipでインストールできます。

pip install pypiserver

本番運用はリポジトリ用のVMなどで実行するかと思いますが、ここではローカルで実行する方法を紹介します。

はじめに、htpasswdコマンドでhtpasswd.txtファイルを作成します。デフォルトではMD5で生成されます。

$ htpasswd -c htpasswd.txt $USERNAME
New password:
Re-type new password:
Adding password for user USERNAME

pypi-server runコマンドを実行することでサーバが起動します。引数に指定している./packagesはパッケージを格納するディレクトリです。

pypi-server run -p 8080 -P htpasswd.txt ./packages

パッケージをアップロードする方法は公式のPyPIと同様です。

例えば、setuptoolsを用いてパッケージをアップロードするには、~/.pypircにリポジトリのサーバ情報を書きます。

[distutils]
index-servers = local

[local]
repository: http://localhost:8080
username: $USERNAME
password: $PASSWORD

--repositoryまたは-rオプションを使用すると、~/.pypircに記載した設定を使用してアップロードできます。

python setup.py sdist upload -r local

標準ライブラリであるsetuptoolsを用いた方法を紹介しましたが、Pythonでパッケージを作成する場合、Poetryもおすすめです。 今回のテーマから逸れるので説明は割愛しますが、興味がある方はぜひ触ってみてください!

インストールするには-index-urlまたは--extra-index-urlのオプションでリポジトリのURLを指定します。 オプションではなく、環境変数に設定する方法やpip.confに記載する方法もありますが、ここでは割愛します。

pip install --extra-index-url http://localhost:8080 $PACKAGE_NAME

専用リポジトリを導入するメリットの1つとして、上記のように公式のパッケージと同じ形式(例えばpip install)でインストールできることがあります。

プライベートパッケージリポジトリサービス

前節では独自にサーバを立ててリポジトリを運用する紹介しましたが、GemfuryAWS CodeArtifactなどパッケージリポジトリのサービスが存在します。

Gemfury

Gemfuryは古くからあるサービスで、パッケージリポジトリに特化しています。また、対応している言語も豊富です。

主にユーザ数で課金されるPersonalプランと、アップロードできるプライベートパッケージ数で課金されるTeamプランの2種類があります1

Gemfuryのリポジトリにパッケージをアップロードする方法はいくつかあります。 以下の方法を用いることで言語を問わず、同じようにアップロードできます。

  • curlコマンド
  • Gemfury CLI
  • GemfuryのWebページ(GUI)

ここではGemfury CLIを利用する方法を紹介します。

Homebrewを使用してインストールできます。 Homebrew以外のインストール方法については、こちらのドキュメントを参照してください。

brew tap gemfury/tap
brew install fury-cli

loginコマンドでログインします。

$ fury login
Please enter your Gemfury credentials.
Email: : youremail@domain.com
Password: : ********
You are logged in as "USERNAME"

pushコマンドでパッケージをアップロードできます。

fury push $PACKAGE_FILE

Pythonパッケージの場合は、前述した~/.pypircを利用することもできます。

[fury]
repository: https://pypi.fury.io/$USERNAME/
username: $TOKEN
password:

アップロードしたPythonパッケージをインストールするには、自作リポジトリと同様にリポジトリのURLを指定します。

pip install --extra-index-url https://pypi.fury.io/$ACCOUNT/ $PACKAGE_NAME

プライベートなパッケージの場合はトークンを使用します。

pip install --extra-index-url https://$TOKEN:@pypi.fury.io/$ACCOUNT/ $PACKAGE_NAME

AWS CodeArtifact

CodeArtifactは、AWSのサービス群の1つです。

基本的な使用方法はGemfuryと大きく変わらないため詳細は割愛しますが、furyのように専用のCLIやGUIからのアップロードはできません。

指定されたリポジトリのURLとトークンを用いてアップロードします。 トークンは、AWS CLIで発行できます2。 また、トークンの有効期限は最大12時間といった制限があります。

対応言語の比較

紹介したサービス以外にも類似サービスはいくつかあります。

ここでは、各サービスで対応しているプログラム言語の対応表を紹介したいと思います。 なお、対応表にはプログラム言語に限定して記載しています3

Gemfury AWS CodeArtifact GCP Artifact Registry Azure Artifacts GitHub Packages
PyPI (Python) -
RubyGems (Ruby) - - -
Composer (PHP) - - - -
Go Modules (Go) - - - -
Maven (Java)
npm (JavaScript)
NuGet (.NET) -

使用感が大きく異なることはないと思われるので、対応している言語や普段使用している環境などに応じて選択すると良いでしょう。

おわりに

社内ツールを配布や管理を便利にするプライベートパッケージリポジトリの導入や利用について紹介しました。 チーム内や部門内などで共通のパッケージリポジトリを用意しておくと便利なので皆さんもお試しください。


  1. https://fury.co/pricing
  2. https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/tokens-authentication.html
  3. サービスによってはaptなどLinuxパッケージを管理できるものもあります。
© NTT Communications Corporation All Rights Reserved.