こんにちは。テクマトリックスの天久です。
開発における成果物管理をどの様に行っていますか?ファイルサーバーで管理したり、GitやSubversionなどバージョン管理システムでソースコードと一緒に管理している場合もあるでしょう。しかし、この様な管理方法では様々な問題が発生する事があります。

  • ファイルサーバーによる管理の課題
    • 日付やファイル名を工夫してするなど管理が煩雑になりがちです。
    • 目的のファイルを見つけにくい場合があります。
  • SCM(ソースコード管理システム)による管理の課題
    • バイナリーファイルの検索が困難な場合があります。
    • バイナリーファイルの全体を保存するため、リポジトリサイズが大きくなります。

そこで今回は、成果物管理ツールであるバイナリリポジトリマネージャーを試してみました。

バイナリリポジトリマネージャーとは?

バイナリリポジトリマネージャーは、開発で生成したデータやファイルを保管する場所です。GitやSubversionもリポジトリマネージャーの一種ですが、バイナリリポジトリマネージャーは特にバイナリファイル(Jar、DLL、Exe、コンテナイメージなど)の管理に特化しています。Maven Central、NuGet、Docker Hubなども、バイナリリポジトリマネージャーの一種です。

バイナリリポジトリマネージャーの機能

大きく分けて2つの機能があります。

  1. 外部リポジトリのキャッシュ
  2. 成果物管理

1. 外部リポジトリのキャッシュ

Java開発でMavenを使用する場合を例に説明します。通常、依存するライブラリはMaven Centralからインターネット経由で取得します。

バイナリリポジトリマネージャーを使わない場合

この場合、各開発者が同じライブラリをそれぞれ別々に取得するため、ネットワークトラフィックが増加します。また、セキュリティが重要な環境では、各開発者のアクセスを個別に監視する必要が出てきます。

バイナリリポジトリマネージャーを外部リポジトリのキャッシュとして利用することで、開発者はバイナリリポジトリマネージャーからライブラリを取得する様になります。

バイナリリポジトリマネージャーを使った場合

これにより、インターネットへの接続はバイナリリポジトリマネージャーのみとなり、ネットワークトラフィックを削減できます。

また、インターネットへの接続が制限された環境の場合、インターネット接続が可能な環境でライブラリを収集し、バイナリリポジトリマネージャーにインポートすることで、インターネットに接続する事無くライブラリの取得が行えるようになります。

2. 成果物管理

開発で生成された様々なバイナリファイルを管理できます。主な機能は以下の通りです。

・バージョン管理
・チーム間での成果物の共有
・検索
・アクセス制御

一部のツールでは、有償機能としてメタデータの追加も可能です。これによって、成果物の状態などを付加情報として追加し、検索出来るようになります。

Sonatype Nexus Repositoryを試してみる

今回は、Sonatype Nexus Repositoryを使用します。他にはJFrogのArtifactoryなども選択肢として挙げられます。どちらもCommunity版が無償で利用可能です。

インストール

DockerHubからイメージを取得してインストール出来ます。
https://hub.docker.com/r/sonatype/nexus3/

今回はデフォルト設定でインストールしますが、システム要件を確認し、必要に応じて設定を変更してください。
https://help.sonatype.com/en/sonatype-nexus-repository-system-requirements.html

データを永続化するためにホスト側のディレクトリをマウントする場合は、ディレクトリのオーナーを変更する必要があります。

$ mkdir /some/dir/nexus-data && chown -R 200 /some/dir/nexus-data
$ docker run -d -p 8081:8081 --name nexus -v /some/dir/nexus-data:/nexus-data sonatype/nexus3

http://localhost:8081/ にアクセスすると、Nexus Repositoryのトップ画面が表示されます。デフォルトの管理者アカウントはadminです。(adminパスワードは/some/dir/nexus-data/配下のadmin.passwordファイルを参照してください)

Nexus Repositoryに用意されているMavenのリポジトリ

Nexus Repositoryにはデフォルトで以下のMavenリポジトリが用意されています。

  • maven-central(proxy)… Maven Central(外部リポジトリ)からライブラリを取得してローカルにキャッシュする
  • maven-public(group) … 複数のリポジトリを論理的にグループ化したものです。
  • maven-releases(hosted) … リリース版の成果物を保存します。
  • maven-snapshots(hosted) … 開発中のスナップショットを保存します

Mavenの設定

Nexus Repositoryを参照するように~/.m2/settings.xml を変更します。 localhost:8081 はNexus Repositoryが稼働しているホスト名とポート番号に合わせて変更してください。Nexus Repositoryの認証情報は<server>タグで設定します。この時、<id>を参照する他のサーバーの<id>と同じものにします。

  <servers>
    <server>
      <id>nexus</id>
      <username>admin</username>
      <password>admin</password>
    </server>
  </servers>
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>central</mirrorOf>
      <url>http://localhost:8081/repository/maven-public/</url>
    </mirror>
  </mirrors>

Nexus Repositryに成果物を保存する場合は、pom.xml に以下のように記述します。

  <distributionManagement>
    <repository>
      <id>nexus</id>
      <url>http://localhost:8081/repository/maven-releases/</url>
    </repository>
    <snapshotRepository>
      <id>nexus</id>
      <url>http://localhost:8081/repository/maven-snapshots/</url>
    </snapshotRepository>
  </distributionManagement>

Mavenを使った動作の確認

ビルド

早速ビルドしています。

$ mvn compile

以下の様に、MavenCentralではなく、http://localhost:8081からライブラリを取得しているのがわかります。

Mavenコマンドログ

MavenからアクセスされたNexus RepositoryはMaven Centralから必要なライブラリを取得し、キャッシュします。

Nexus Repositoryの画面

成果物の保存

次のコマンドを実行すると、上記のdistributionManagementで指定した場所に成果物が配置されます。

$ mvn deploy

pom.xmlの<version>に-SNAPSHOTが含まれていると、<snapshotRepository>に定義したURLにデプロイされます。

以下の様な場合は<snapshotRepository>に保存されます。

<version>3.0.0-SNAPSHOT</version>

以下の様な場合は<repository>に定義されたURLにデプロイされます。

<version>3.0.0</version>

バージョンを変更すると、ファイルのメタデータとともに成果物が管理されます。

CI/CDでの利用

CI/CDパイプラインでも、Mavenコマンドを使用してデプロイできます。実行ジョブとの紐づけやソースコードとの紐づけは、ファイル名にコミットハッシュを追加したり、Nexus Repositoryの成果物へのURLをCI側に保存したりなど、Jenkinsファイルやスクリプトで様々な工夫が可能です。Maven以外のツールを使用する場合も、API経由でファイルをアップロードできます。JenkinsではNexus Artifact Uploaderプラグインがありますが、現在(2025年7月)はメンテナンスが停滞しているため注意が必要です。

まとめ

バイナリリポジトリマネージャーは、成果物管理だけでなく、ライブラリキャッシュによるネットワークトラフィックの削減やセキュリティ向上にも役立ちます。今回はNexus Repositoryを紹介しましたが、GitHubやGitLabにも同様の機能があります。成果物管理でお困りの方は、ぜひ検討してみてください。

By amahisa