Use S3 as Maven Repo.

use s3 as maven repo.

プライベートのリポジトリを S3 に立てて利用する。 これが丁寧なので真似すれば解決する。流れは、

  • リポジトリ用バケット作成
  • IAMユーザー作成
  • 作成済みユーザーにポリシーを設定
  • maven-s3-wagon 拡張を導入
  • プロジェクトの pom.xmldistributionManagement を設定
  • settings.xmlを設定する
  • バージョンに変更を加える
  • deploy サブコマンドを実行

私の場合 maven でデプロイして gradle を使う側が利用しているのでそのように書くけど。 デプロイする側 として書いた maven の設定を使って依存解決もできるし、書き込み権限があれば 解決する側 として書いた gradle の設定を使ってデプロイできるはず。

デプロイする側(maven)

リンク先が閉じてしまったとき用にコピーしておくと pom.xml にリポジトリの定義を記載する この具体例では repo.teamed.io という名前を与えている。 urls3 の形式になってる。 事前に利用するバケットとIAMアカウントを作っておき、IAMアカウントには適切なポリシーを与える。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<project>
  <distributionManagement>
    <snapshotRepository>
      <id>repo.project.com</id>
      <url>s3://repo.project.com/snapshot</url>
    </snapshotRepository>
    <repository>
      <id>repo.project.com</id>
      <url>s3://repo.project.com/release</url>
    </repository>
  </distributionManagement>
  <repositories>
    <repository>
      <id>repo.project.com</id>
      <url>s3://repo.project.com/release</url>
    </repository>
  </repositories>
  [...]
</project>

IAMアカウントに与えるポリシーは下のようになっている。バケット配下への全権限を付けている。 たぶん acl とかは外せるはず。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "s3:*",
      "Resource": [
        "arn:aws:s3:::repo.project.com",
        "arn:aws:s3:::repo.project.com/*"
      ]
    }
  ]
}

Maven の環境依存設定はリポジトリで管理したくないので ~/.m2/settings.xml に書く。 (3系でも .m2 を使う) 下のように pom.xml で定義したリポジトリ名に対して username,password を定義している。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<settings>
  <servers>
    <server>
      <id>repo.project.com</id>
      <username>AKIAXXXXXXXXXXXXX</username>
      <password>abcdefghijklmnopqrstuvwxyz</password>
    </server>
    [...]
  </servers>
  [...]
</settings>

解決する側(gradle)

私の場合、呼び出し側のプロジェクトは gradle を使っているので下のように書くことで独自版を読み込んで動かしている。バージョンがセントラルリポジトリにないのでプライベートリポジトリから読み込まれる。環境変数からクレデンシャルを渡しているのは CircleCI を通すため。 環境変数経由でローカルの開発が少し不便だけど direnvIntelliJ の設定で解決している。

1
2
3
4
5
6
7
maven {
  url "s3://repo.project.com/"
  credentials(AwsCredentials) {
    accessKey System.getenv()["AWS_ACCESS_KEY"]
    secretKey System.getenv()["AWS_SECRET_KEY"]
  }
}

Gradle: ローカルなファイルパスに直接依存させる

ちなみに最初に緊急でビルドした時は、よくわからなかったのでビルドした jarlib 配下に配置して利用した。ファイルパス上の jar ファイルに依存させるにはfilesを使う。

1
2
3
4
dependencies {
    runtime files('libs/a.jar', 'libs/b.jar')
    runtime fileTree(dir: 'libs', include: '*.jar')
}

ref. Groovy/Gradle/ローカルのjarファイルを参照させるには - Glamenv-Septzen.netj

comments powered by Disqus