SREの戸田(id:eller)です。先日出した合同誌でもJavaagentをGradleでダウンロードしてコンテナに入れる方法を紹介しましたが、さらに固定URLからダウンロードした tar.gz を解凍する必要のあるケースがあったので紹介します。
固定URLから依存をダウンロードする
Maven Centralではない場所から依存をダウンロードする場面は、Java開発をやっているとわりとよく遭遇します。たとえば以前はOracle社のJDBCドライバがMaven Centralに存在しなかったため、自分で管理したMavenリポジトリに入れて管理するなどの手法をとっていました。
今回はCloud Profilerのエージェントが固定URLで配布されていました。GradleであればMavenリポジトリを作らなくても、配布URLをIvyリポジトリに見立てることでダウンロードを自動化できます。ビルドスクリプトは以下のようになります。
repositories {
ivy {
name = "cloud-profiler"
url = uri("https://storage.googleapis.com/cloud-profiler/java/")
// メタデータファイルをダウンロードしないように設定
metadataSources { artifact() }
patternLayout {
// "latest/profiler_java_agent.tar.gz" などのパスになる
artifact("[revision]/[module].tar.gz")
}
content {
includeGroup("com.googleapis.storage")
}
}
}
val cloudprofileragent: Configuration by configurations.creating {
description = "Cloud Profiler 向けの javaagent"
}
dependencies {
cloudprofileragent("com.googleapis.storage:profiler_java_agent:latest")
}
tarballからファイルを取り出す
しかし今ダウンロードしたのは .tar.gz ファイルであり、今回利用したい .so ファイルをここから解凍しなければなりません。resources.gzip と tarTree を組み合わせてこれを実現できます。ビルドスクリプトは以下のようになります。
val destDir = layout.buildDirectory.dir("container") val downloadCloudProfilerAgent by tasks.registering(Copy::class) { description = "コンテナに埋め込むCloud Profiler agentをダウンロードする" doFirst { mkdir(destDir) } // tar.gz からファイルを取り出す from(tarTree(resources.gzip(cloudprofileragent.singleFile))) { include("**/*.so") } into(destDir) } tasks.jib { dependsOn(tasks.downloadCloudProfilerAgent) }
以上の2つを組み合わせることで、固定URLで配布されているtarballからファイルを解凍してコンテナに組み込むことができました。どなたかの参考になれば幸いです。