JFrog Japan Blog

DevOpsを加速する、JFrog日本法人メンバーによるブログです。

JFrog ArtifactoryやXrayといった自社ツールはもちろん、CI/CDやコンテナ技術(DockerやKubernetes)などDevOpsの一般的な内容も扱います。その他、日本でのDevOps事例紹介やお楽しみコンテンツも掲載予定です。 JFrogならではの面白くて役に立つブログを目指しますので、お楽しみに!

GradleでJFrog Artifactory越しに依存解決する #MavenCentral #JCenter

1月ももう終わりますが、あけましておめでとうございます。デベロッパーアドボケイトのよこなです。

JFrog Artifactoryは自分たちのアーティファクト(バイナリファイル)を保管する以外に、外部レジストリ(Maven Central, Docker Hubなど)からライブラリのアーティファクトを取得する際の仲介役としても使えます。Artifactoryを経由することで、一度取得したことのあるアーティファクトを保存しキャッシュとして活用できる他、様々なメリットがあります。

このエントリではGradleを使って依存解決する方法を紹介します。
Artifactoryを導入するなら依存解決以外にも活用するのがオススメ(本音)ですが、まずはここから始めてみるパターンも大いにアリだと思う(これもまた本音)ので、依存解決だけにフォーカスして書いていきます。おそらく、JCenterを使い続けたい方にはぴったりの内容かなと思います (参考: Bintray、JCenter、GoCenter、ChartCenterのサービス終了) 。
公式Wikiもあるものの、細かいことまで書かれているので「結局どうしたらいいの」となった方に贈る記事です!

手順

Artifactoryを利用できる状態にする

既にお使いのArtifactoryがあればそちらをお使いいただき、なくて試してみたい場合は無料なのでお気軽に登録してみてください。 jfrog.com

リモートリポジトリを作成する

Artifactoryで使えるリポジトリには種類がある中、依存解決に利用するのは「リモートリポジトリ」です。
今回はリモートリポジトリだけ作りますが、この手順も既にお持ちのものがあればスキップしてください。

f:id:ihcomega:20220128165045p:plain
リモートリポジトリ作成

右上のメニューからGradle用のリモートリポジトリを作成します。リポジトリの名前は xxx-gradle-maven-remote xxx-gradle-remote (xxxはアプリケーションやプロジェクトの名前) など、パッケージ・リポジトリの種類が分かる形がオススメです。
URLは次の値を入れてください。

使うリポジトリ URL
Maven Central https://repo.maven.apache.org/maven2
Google https://maven.google.com
JCenter https://jcenter.bintray.com

ビルドスクリプト (build.gradle) を更新する

Artifactoryを使っていない場合、次のような記述でリポジトリを指定しますよね。例えば次のような記述だと、基本的にはMaven Central -> Googleの順でアーティファクトを探しにいって依存解決します*1

buildscript {
    repositories {
        mavenCentral()
        google()
    }
}

ここでArtifactoryを使う場合、記述はこうなります。なお、紹介している設定ファイルはArtifactoryからダウンロードできます(後述)。

repositories {
  maven {
    url "${artifactory_url}"
    credentials {
      username = "${artifactory_user}"
      password = "${artifactory_password}"
    }
  }
}

変数は gradle.propertiesなどを使って埋め込んでください。

変数
artifactory_url https://yyy.jfrog.io/artifactory/xxx-gradle-maven-remote形式のURL
(https://【ArtifactoryのURL※ご自身で設定したサーバーIDを含むもの】/artifactory/【リモートリポジトリ名】)
artifactory_user Artifactoryのユーザー
artifactory_password ArtifactoryのパスワードまたはAPI Key

設定はこれだけ!あとはいつものとおり依存解決 (gradle buildとかgradle assemble) すればArtifactoryを経由するようになります。ということで最低限必要なのはここまでで、残りは補足やお役立ち情報です。

Artifactoryから設定ファイル (build.gradlegradle.properties) をダウンロードする

上記の設定ファイルは自分で記述しなくてもダウンロード可能ですが、現状だと依存解決以外に必要な設定もまとめて入ってくる形になっています。記述量はさほど多くないので、必要なものだけ取り入れてシンプルさを保つために自分で書いてしまうのも手だと思います。

f:id:ihcomega:20220128173548p:plain
「Artifacts」ビューで右上の「Set Me Up」を選択する

f:id:ihcomega:20220128182407p:plain
リモートリポジトリを選択する + ダウンロードする設定ファイルにクレデンシャル情報を含めたい場合はパスワードを入力する

f:id:ihcomega:20220128182454p:plain
「Generate Settings」をクリックする

f:id:ihcomega:20220128173755p:plain
ファイルのダウンロードまたはテキストのコピーをして使う

不要な設定に要注意

Artifactoryからダウンロードされるファイル、またウェブ上にある古い記事には artifactory.resolve.repotitories という設定が含まれている場合があります。実は冗長な設定で不要なので削除していただいても動作します *2

f:id:ihcomega:20220128181612p:plain

複数の外部リポジトリを使う

1つのリモートリポジトリに設定できる外部リポジトリは1つです。しかし、依存解決にMaven CentralもGoogleもJCenterも使いたいケースも多々あるでしょう。その場合は必要な数だけリモートリポジトリを作って、「バーチャルリポジトリ」でまとめます *3
バーチャルリポジトリは複数のリポジトリを束ねて仮想的に1つのリポジトリに見せる機能です。要はインタフェースの役割を果たしてくれ、ユーザーはその裏側にあるリポジトリの構成を意識せずに使うことができます。

こちらは右上のメニューでバーチャルリポジトリ作成を選べます。名前は xxxxxx-virtual とし、まとめたいリポジトリをすべて選択すればOKです。このとき、UI上でリポジトリが並ぶ順番に応じて依存解決先が決まります。

  • example-gradle-remote-mavencentral (Maven Centralにアクセスするリモートリポジトリ)
  • example-gradle-remote-google (GoogleのMavenリポジトリにアクセスするリモートリポジトリ)
    の2つを用いた次の例ではMaven Central -> Googleの順に優先されるというわけです (リポジトリ名長くて切れちゃってますが)。

f:id:ihcomega:20220128180355p:plain
バーチャルリポジトリを使って複数のリモートリポジトリをまとねる

以上です〜!これで取得したライブラリのアーティファクトがArtifactoryにたまっていきます。冒頭で説明したとおりキャッシュの役割を果たすので時間短縮が期待できたり、JFrog Xrayを使ってセキュリティスキャンができたり、便利なことも多いのでぜひ試してみてください!

*1:参考: Declaring repositories, 第60章 ビルドロジックの体系化など

*2:サービス上で不要な記述が「Set Me Up」から消えるよう社内でフィードバック中なので、将来のアップデートで直ります

*3:ビルドスクリプトに全リモートリポジトリを羅列することも可能ですが、リポジトリに変更があったときのメンテナンスが楽なのでバーチャルリポジトリの利用がオススメです