kaakaa Blog

この世は極楽 空にはとんぼ

Gradleがビルド結果解析サービス Gradle.com を開始していた

Gradle.comって何?

追記:名前が変わってGradle Cloud Servicesになってました。


Gradle Inc.が提供しているSaaSです(2016/6/14現在ベータ版)。

私が初めてGradle.comの言葉を知ったのは、下記のニュース記事だったかと思います。
Gradle Grabs $4.2 Million To Expand Commercial Company Around Open Source Build System

その頃は、まだ実体もなかったため「GradleがCIサービス始めるのか〜TravisとかCircleCIとかあるし大変だろうな〜」と思ってましたが、どうやら違うようです。

Gradle.comはビルドログを解析し、可視化するサービスのようです。
Gradle.comで見れる情報はは Build Receipt と呼ばれる下記のような情報のことです。

  • いつビルドが行われたか
  • エラー情報
  • 各ビルドタスクの所要時間
  • ビルドが実行された環境の情報

現在は、ベータ版としてサービスを利用可能であり、かつサンプルも公開されているため、実際に見てみると分かるかと思います。

Build Receipt | Gradle.com

なんのために?

公式アナウンスは下記のとおりとなっています。

Welcome to Gradle.com

Gradle.com makes it possible to see what’s going on in your project, how it changes over time, and shows you how to make your software better, faster, and more reliable.

For the initial release, you can upload your builds to Gradle.com, and see what we call a Build Receipt: a set of useful metadata about your build that enables you to:

* Look under the hood at build tasks to optimize performance
* Debug a failed build with a stack trace
* Get help with ability to share your build output
* See information about the build environment

簡単に言うと、ビルドログの解析を肩代わりし、ビルド結果の共有をしやすくしてくれるサービスのようです。

どうやって?

Gradleプラグインcom.gradle.build-receiptを追加し、実行時コマンドにオプション -Dreceipt を追加してビルドを実行すれば良いようです。

Apply the plugin

plugins {
    id 'com.gradle.build-receipt' version '1.2'
}
buildReceiptLicense {
    agreementUrl = 'https://gradle.com/terms-of-service'
    agree = 'yes'
}

Agreementをビルドスクリプト内に書かせてるのが独特ですね。
Agreementを記述しないで実行すると、下記エラーが発生しました。

The Gradle.com Build Receipt license agreement has not been agreed to.
A Build Receipt cannot be submitted to Gradle.com without agreement to the license.

To agree to the license, include the following in your root project's configuration:
buildReceiptLicense { agreementUrl = 'https://gradle.com/terms-of-service'; agree = 'yes' }

For more information, please see https://gradle.com/help/plugin-license.

Alternatively, if you are using Gradle Enterprise, specify the server location.
For more information, please see https://gradle.com/help/plugin-enterprise-config.

実行コマンドは下記。

Run your Build

gradle build -Dreceipt

Run your Build内の「What will happen when I do this?」のリンクにあるように、ビルドに関する情報をgradle.comに送信しています。
ただ、ソースコードの内容や認証情報などはcaptureしないと明記されています。

ビルドが成功すると、ログの最後にBuild ReceiptのURLが出力されます。

kaakaa@kabu:~/build/pants$ ./gradlew build -Dreceipt
:compileJava
Download https://repo1.maven.org/maven2/org/slf4j/slf4j-parent/1.7.21/slf4j-parent-1.7.21.pom
Download https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.21/slf4j-api-1.7.21.jar
:processResources UP-TO-DATE
:classes
:jar
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 6.188 secs

Publishing build information...
https://gradle.com/r/xxxxxxxxxxxxx

出力されたリンクをブラウザで開くと、認証画面が出てきました。

f:id:kaakaa_hoe:20160614233657p:plain

メールアドレスを入力すると、入力したメールアドレスにリンクが書かれたメールが飛び、そのリンクから自分のBuild Receiptを確認することができます。
グローバルIPまで見えちゃうんだなぁ・・・)

感想

Build Receiptで見れる情報は、基本的にビルドログから分かる情報なので過度に期待するものではないと思います。

ただ、チームで開発している場合、ビルド実行時の環境情報も取得できるので、ビルドエラーが発生したときの解析に役立ちそうだと思いました。

「何もいじってないのにビルド通らなくなった・・・」 -> 「ビルドレシート見せてみ?」

手を加えるのも、プラグインとAgreementを記述するだけなので負担も少ないです。

おわりに

Gradle Inc.のようなビルドスクリプトを提供する組織にとって、実際にどのようなビルドが行われているかは今後のプロダクトの方向性を決定するためにも重要な情報になるはずです。

ただ、ビルド結果を解析するためにCIサービスを提供するとなると、ビルドを実行するためのマシンリソースを潤沢に用意しておかねばならなくなり、相当大きな負担が生じるはずです。 そこで、ビルドログを解析するだけのサービスであれば、基本的にはテキストデータのみなので用意すべきマシンリソースは少なく済むはずです。

「ビルド」というものに注目すべきプロジェクトとしては、目の付け所がさすがだという印象を受けました。