この記事は、 NTT Communications Advent Calendar 2022 23 日目の記事です。
はじめに
こんにちは、デジタル改革推進部の組橋です。普段は社内データの整備や分析をしています。
この記事では、社内ツールなどの自作ツールを管理する方法や関連するサービスを紹介します。
パッケージリポジトリとは
パッケージ
ソフトウェアにおけるパッケージとはいくつかの機能を1つにまとめて、管理しやすくしたものを指します。
例えば、Pythonのパッケージはpipコマンドでインストールできます。
pip install $PACKAGE_NAME
リポジトリ
リポジトリは、保管場所という意味があります。 パッケージリポジトリはパッケージの保管場所です。単にリポジトリというと最近はGitリポジトリを指すことが多いですが、これはソースコードの保管場所ですね。
例えば、Pythonの公式パッケージリポジトリはPython Package Index (PyPI)であり、pip
でインストールする際のデフォルトの参照先に指定されています。
自分たち専用のパッケージリポジトリ
Pythonに限らず他の言語にも公式のパッケージリポジトリがあり、公開されているパッケージを利用して開発することは一般的です。
公開されているパッケージに自分たちのほしいものがないとき、自作することはよくあることかと思います。
しかし、プロジェクトごとにツールを作ってutils
やtools
みたいなディレクトリに置いていくと、似たようなツールが散乱してしまいます。
そこで、自分たち専用のパッケージリポジトリを用意すると、ツールの配布や管理が便利になります。 リポジトリがあることで再利用が促進され、開発効率が上がるかもしれません。
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
)でインストールできることがあります。
プライベートパッケージリポジトリサービス
前節では独自にサーバを立ててリポジトリを運用する紹介しましたが、GemfuryやAWS 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) | ○ | ○ | - | ○ | ○ |
使用感が大きく異なることはないと思われるので、対応している言語や普段使用している環境などに応じて選択すると良いでしょう。
おわりに
社内ツールを配布や管理を便利にするプライベートパッケージリポジトリの導入や利用について紹介しました。 チーム内や部門内などで共通のパッケージリポジトリを用意しておくと便利なので皆さんもお試しください。
- https://fury.co/pricing↩
- https://docs.aws.amazon.com/ja_jp/codeartifact/latest/ug/tokens-authentication.html↩
- サービスによってはaptなどLinuxパッケージを管理できるものもあります。↩