株式会社ヘンリー エンジニアブログ

株式会社ヘンリーのエンジニアが技術情報を発信します

Cloud ProfilerのJVM用agentをjibのコンテナに入れる

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.gziptarTree を組み合わせてこれを実現できます。ビルドスクリプトは以下のようになります。

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からファイルを解凍してコンテナに組み込むことができました。どなたかの参考になれば幸いです。