チェーンと南京錠で固定されたスマートフォン
技術解説

Maven・Docker・npmを1つのアーティファクトサービスに統合する手順

目次を見る

Java、フロントエンド、Python、.NETを並行運用していると、パッケージレジストリ(ビルド成果物を保管・配布する仕組み)がバラバラになりがちです。Maven用にNexus、npm用に別サービス、Docker用にまた別のレジストリ、という構成を見直したいインフラ担当・ビルドパイプライン担当の方に向けて、複数フォーマットを1つのサービスに集約する際の考え方と確認手順を整理します。

ここで扱うのはAngusRepoというアーティファクト管理サービスの事例です。Maven、Docker、npm、PyPI、NuGet、Helm、Go、APT、YUM、Rawという10種類のフォーマットに対応しています。重要なのは、これが単なる製品紹介ではなく「レジストリ統合」という設計判断そのものを考える材料になる点です。

なぜレジストリ統合が注目に値するか

マルチスタックのチームでは、フォーマットごとに別サービスを立てるのが従来の発想でした。Mavenのバイナリ成果物はNexus、npmパッケージはVerdaccioや社内npmレジストリ、ContainerイメージはHarborやECR、という具合です。

この構成には運用コストの問題があります。認証基盤を複数持つ必要があり、バックアップ・監視・アクセス権限の設計もサービスの数だけ増えます。CI/CD(継続的インテグレーション・継続的デリバリー)パイプラインの設定も、レジストリごとに個別の資格情報管理が必要になります。

1つのサービスに複数フォーマットを集約できれば、認証トークンの発行フローやアクセス権限管理を一本化できます。これは「1つのリポジトリが全フォーマットを受け付ける」という意味ではない点に注意が必要です。実際にはフォーマットごとにHOSTEDリポジトリ(成果物を直接保管するリポジトリ種別)を個別に作成します。たとえばMaven用には「maven-releases」、Docker用には「docker-releases」という名前のリポジトリを分けて用意する構成です。

技術的な仕組みを段階的に見る

統合の実体は「1つのサービスの中に、フォーマットごとのリポジトリが並ぶ」という構造です。サービスは1つのドメイン(例では「repo.anguskit.com」)で稼働し、パス以下にフォーマットごとのエンドポイントが分かれます。

認証の仕組みはどのフォーマットでも共通です。コンソールのUser Settings画面でアクセストークンを発行し、各クライアントツールのパスワード欄にそのトークンを渡します。ログイン名はアカウントのユーザー名、パスワード欄にはトークンを使う点が統一ルールです。

たとえばMavenなら「settings.xml」の「server」ブロックに環境変数「REPO_TOKEN」を埋め込み、Dockerなら「docker login」時にトークンをパスワードとして渡します。npmなら「.npmrc」の「_authToken」に同じトークンを設定します。ツールごとに設定ファイルの形式は違っても、認証の考え方は共通化されている点が設計上のポイントです。

もう1つの共通パターンが「公開したら必ず取得して検証する」という手順です。アップロードが成功したログが出ても、実際に別環境からpull・downloadできるとは限りません。ネットワークACL、リポジトリの公開範囲設定、クライアント側のプロキシ設定など、公開経路と取得経路で異なる設定ミスが起こり得るためです。

既存のレジストリ運用との比較

日本の開発現場でよく使われる構成と比較すると位置づけが分かりやすくなります。JFrog ArtifactoryやSonatype Nexusも同様に複数フォーマット対応をうたう製品ですが、フォーマットごとのリポジトリタイプ(Hosted・Proxy・Virtual)を使い分ける設計思想は共通しています。

GitHub Packagesのようなホスティング型サービスとの違いは、自前のネットワーク内またはクラウド上に単一のサービスとしてデプロイできる点です。オンプレミス要件があるチームや、社内ネットワークからのみアクセスを許可したいセキュリティ要件があるチームにとっては選択肢になり得ます。

一方で、フォーマット数が増えるほど運用側が覚える設定パターンも増えます。Maven・npm・Dockerのように認証方式がトークンベースで統一されているフォーマットもあれば、APT・YUMのようにアップロード先のパス構造が独自のものもあります。導入前にチームが実際に使うフォーマットの数を洗い出し、「本当に全部を1つのサービスに集約する必要があるか」を見極める判断が必要です。

今日確認できること

実際に試す前に、以下の点を確認しておくと導入判断がしやすくなります。

  • 現在運用中のレジストリが何種類あるか、フォーマットごとに棚卸しする
  • 各フォーマットの認証方式(トークン・APIキー・Basic認証)が統一できそうか確認する
  • CI/CDパイプラインの資格情報管理がSecret Managerなど安全な仕組みで行われているか確認する
  • トークンをURLに直接埋め込む運用になっていないか、シェル履歴や設定ファイルへの平文保存がないか確認する

手を動かして確認する場合は、まず1フォーマットだけで検証するのが安全です。たとえばMavenであれば以下の手順になります。

export REPO_USER="your-username"
export REPO_TOKEN="your_access_token"
mvn -s settings.xml clean deploy

公開が成功したら、別プロジェクトから同じgroupId・artifactId・versionを指定して取得できるか必ず確認します。公開ログに「BUILD SUCCESS」と出ても、取得側の設定(プロキシ、ネットワークACL、リポジトリの公開範囲)が間違っていればpullできません。

CIパイプラインに組み込む際は、「export」コマンドで設定した環境変数がそのターミナルセッション内でしか有効でない点にも注意が必要です。CI環境ではシークレットストアやCIツールのSecret機能を使い、検証後は一時的な設定ファイルを削除する運用が安全です。

まとめ

複数フォーマットのアーティファクト管理を1つのサービスに集約する動きは、認証基盤や運用コストを一本化したいチームにとって検討材料になります。

ポイントは「1サービス」であって「1リポジトリで全フォーマット受付」ではない点、そして公開と取得は別々に検証が必要な点です。

アップロード成功のログだけで安心せず、別環境からの取得(pull・download)まで検証して初めて設定が正しいと言えます。

導入を検討する場合は、まず自チームで使っているフォーマットを棚卸しし、1フォーマットだけで認証・公開・取得の一連の流れを試してみることから始めてみてください。トークン管理の仕組みを先に整えておくと、フォーマットを追加する際の作業もスムーズになります。

参考

Connect 10 formats to one artifact service: Maven, Docker, npm, PyPI, and Helm

この記事について: 本記事は AI を活用して作成し、forva AI 編集部が内容を確認・監修しています。

AI 駆動開発のご相談は forva AI へ。まずはお気軽にどうぞ。