Goalist Developers Blog

AmazonS3に社内用Mavenリポジトリを作成し、Gradleから使う

こんにちは、毛虫にさされて赤いポツポツ持ちの鈴木です。

タイトルの通り、AmazonS3 で Mavenリポジトリ を作成しGradleから使う手順をかきました。

社内のモジュールに依存するモジュールを開発する際に、サーバー上で依存関係を解決しビルドするために使ったりします。

Qiitaにも同様の内容を投稿済みなので、最新情報はこちらを参照してください。

qiita.com

前提

  • Gradleをインストールしている
  • S3のバケットにファイルをアップロードできるAWS IAMユーザーを作成している
  • 上記IAMユーザーのアクセスキーIDとシークレットアクセスキーを持っている

本記事のゴール

S3上にアップロードしたライブラリを別のGradleプロジェクトからダウンロードできるようにします。

具体的には以下のようなbuild.gradleの設定で「gradle build」コマンドを実行した際にダウンロードできるようにします。

build.gradle

dependencies {
    compile 'jp.co.goalist:library:1.0.0'
}

以下の内容については本記事では扱いません。いつかまた。

  • Jenkinsなどビルドサーバー側での設定
  • S3上のリポジトリへのアクセス管理

Mavenリポジトリへのアップロード

Gradleプロジェクト作成

以下のコマンドを実行します。

mkdir gradle-upload-s3repo
cd gradle-upload-s3repo/
gradle init --type=java-library

生成されたファイルはこんな感じです。

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
    ├── main
    │   └── java
    │       └── Library.java
    └── test
        └── java
            └── LibraryTest.java

この時点で build.gradle の内容は以下の通りです。(不要なコメントと依存ライブラリの設定は削除しています)

build.gradle

apply plugin: 'java'

//依存ライブラリが未定義のため、
//現時点ではrepositoriesとdependenciesは不要ですが、
//後ほど使うので残しておきます。
repositories {
    jcenter()
}

dependencies {
}

確認のため、プロジェクトルートで「gradle build」と打ってあげると、build/libsに「gradle-upload-s3repo.jar 」が生成されます。ここまではjavaプラグインのデフォルト機能です。
確認後、「gradle clean」してビルド結果を削除してあげましょう。

groupId、artifactId、version を決める

Mavenでは、groupIdとartifactIdとversionの組み合わせでライブラリを一意に定義します。

慣習にならい、

キー
groupId jp.co.goalist
artifactId library
version 1.0.0

にしましょう。

build.gradleに以下の設定を追加します。

group = "jp.co.goalist"
version = "1.0.0" 

settings.gradleを以下のように設定します。

settings.gradle

rootProject.name = 'library'

S3上にリポジトリ用のバケットを作成する

手順は省略しますが、リポジトリとして使用するバケットを作成します。

今回は「s3://repository.hoge/maven/」を作成します。

開発環境の設定

~/.gradle/gradle.propertiesにリポジトリのURLとIAMユーザーのアクセスキーIDとシークレットアクセスキーを設定します。
これをプロジェクト側が参照することで、プロジェクトに含めないですむのでセキュリティ的に安全になります。(普通のこと言ってます) あと個々のプロジェクトでアクセスキーIDとか設定したりとかしないですみます。

gradle.properties

goalistRepoUrl=s3://repository.hoge/maven/
awsAccessKeyId = AKIAJWORQEXXXXXXXXXX
awsSecretAccessKey = waTa0aakgK2e5hXXXXXXXXXXXXXXXXXXXXXXXXXX

mavenプラグインのuploadArchives設定

MavenリポジトリへのアップロードにはmavenプラグインのuploadArchivesを使います。
先程設定したリポジトリのURL、IAMユーザーのアクセスキーID、シークレットアクセスキーを参照するように設定します。

build.gradle

apply plugin: 'maven'
uploadArchives {
    repositories {
        mavenDeployer {
            configuration = configurations.deployerJars
            repository(url: goalistRepoUrl) {
              authentication(userName: awsAccessKeyId, password: awsSecretAccessKey)
            }
        }
    }
}

S3へのアクセスには org.springframework.build:aws-maven を使いますので、dependenciesに追加します。
今回は最新版の5.0.0.RELEASEを使います。

The Central Repository Search Engine

build.gradle

configurations {
    deployerJars
}

dependencies {
    deployerJars 'org.springframework.build:aws-maven:5.0.0.RELEASE'//追加
}

これで設定は完了。最終的には以下のようになります。

build.gradle

apply plugin: 'java'
apply plugin: 'maven'

group = "jp.co.goalist"
version = "1.0.0" 

repositories {
    jcenter()
}

configurations {
    deployerJars
}

uploadArchives {
    repositories {
        mavenDeployer {
            configuration = configurations.deployerJars
            repository(url: goalistRepoUrl) {
              authentication(userName: awsAccessKeyId, password: awsSecretAccessKey)
            }
        }
    }
}

dependencies {
    deployerJars 'org.springframework.build:aws-maven:5.0.0.RELEASE'
}

settings.gradle

rootProject.name = 'library'

uploadArchivesタスクを実行

以下のコマンドを実行し、BUILD SUCCESSFULL したら成功です。

gradle uploadArchives

S3を確認すると

s3://repository.hoge/maven/以下にライブラリがアップロードされていると思います。

Mavenリポジトリからダウンロード

今回アップロードしたライブラリに依存するGradleプロジェクトを作成します。

mkdir gradle-upload-s3repo-child
cd gradle-upload-s3repo-child/
gradle init --type=java-library

build.gradleを変更し、S3のリポジトリを参照するための設定と、依存関係の設定をします。

build.gradle

apply plugin: 'java'

repositories {
    jcenter()
    maven {
        url goalistRepoUrl
        credentials(AwsCredentials) {
            accessKey awsAccessKeyId
            secretKey awsSecretAccessKey
        }
    }
}

dependencies {
    compile 'jp.co.goalist:library:1.0.0'
}

以下のコマンドを実行し、BUILD SUCCESSFULなことを確認できたら完了です。

gradle build

さいごに

実運用ではビルドサーバーからしかアップロードできないようにして、開発者は参照のみ出来るようにすればいい感じに運用できると思います。 モジュールを再利用していきましょう。