自己紹介

よしだ

好きな言語: Groovy Logo

好きなIDE: IntelliJ IDEA

お仕事

  • 所属: とある人材紹介会社のマーケティング部門
  • 役割: データ分析チームのデータエンジニア

お仕事

社内BIツールの開発、設計、運用

Agenda

  • Gradleとは?
  • 今日話す内容と「Gradle 徹底入門」
  • タスクランナーとしてのGradle
  • Gradleを使った自動化例
  • Pluginの紹介

Gradleとは?

  • 全く知らない?
  • 聞いたことがある?
  • 触ったことがある?
  • 使っている?
  • Plugin書いてる?
  • 俺がGradleだ!
  • 次世代ビルドツール
  • version: 2.13
  • 主にJava、Groovyで実装
  • Java8対応, Java9も対応開始
  • Groovy: 2.4
  • sdkmanを使うとインストールが簡単

Gradle Wrapperのアップデート

./gradlew wrapper --gradle-version=2.13

NEW!!

build.gradleがKotlinで書けるように

apply plugin: 'application'

mainClassName = 'samples.HelloWorld'

repositories {
    jcenter()
}

dependencies {
    testCompile "junit:junit:4.12"
}

gradle/gradle-script-kotlin

import org.gradle.api.plugins.*
import org.gradle.script.lang.kotlin.*

apply<ApplicationPlugin>()

configure<ApplicationPluginConvention> {
    mainClassName = "samples.HelloWorld"
}

repositories {
    jcenter()
}

dependencies {
    "testCompile"("junit:junit:4.12")
}

その他、Gradleについては Gradleで始めるGroovy expand でも紹介しているので、参考にしてください。

Gradle徹底入門

Gradle徹底入門

  • 第2部 基礎編 6章 スクリプトファイルの記述
  • 第4部 発展編 13章 エキスパートへの道

build.gradle

ざっくりと言うと以下の内容

  • 利用しているプラグイン
  • ライブラリの依存関係
  • プラグインの設定

その他に

  • タスクの定義
  • ソースファイルの位置
  • メソッド、クラス

つまり、

すっきりしているbuild.gradleほど

よりGradle Pluginに依存している

タスクランナーとしてのGradle

Gradleはタスクを組み合わせて、DAG(有向非循環グラフ)を作る

  1. 実行したいことをタスクに落とし込む
  2. タスクを繋げる
  3. ワンクリックで実行できるようにする

タスクの依存関係

後に実行したいタスク名.dependsOn 先に実行するタスク名

  • 先に実行するタスクは、配列またはクロージャで渡すことが出来る。
  • タスクが循環参照する場合は、例外が発生する。

タスクの順位付け

後に実行したいタスク名.mustRunAfter 先に実行するタスク名

後に実行したいタスク名.shouldRunAfter 先に実行するタスク名

  • 依存関係よりも緩やかな制約を付ける場合に利用する。
  • mustを通常使うとよい。
  • shouldは例外ケースに該当したら無視されるので、それでも問題ない時のみがよい。

タスクの後始末

後始末が必要なタスク名.finalizedBy 後始末を行うタスク名

  • 一連のタスクで生成した中間ファイルや、起動したプロセスの停止をしたい場合に利用する。
  • 前のタスクで例外やエラーになっても実行される。

タスクの条件実行

条件によって実行したいタスク名.onlyIf { 条件式 }

  • 条件式の戻り値をbool値にする。
  • コマンドの引数や環境変数によって変えたりしたい場合等。

UP-TO-DATEでタスクをスキップ

タスクのinputs, outputsプロパティのfileやdirへ、ファイルパスやディレクトリパスを指定すると、更新に応じてタスクをスキップする事が出来る。

outputs.upToDateWhen{ true }とすると常に最新として扱われるので、inputsに更新があった場合のみ、タスクが実行されるようになる。

参考:

  • Gradle徹底入門
    • 6.2.2 Taskオブジェクト
    • 6.3.2 依存関係の定義方法
    • 6.3.4 タスクの制御
    • 6.3.7 タスクの順位付け
    • 6.3.8 ファイナライザータスク

build.gradleの分割

タスクが多くなってbuild.gradleが見づらくなってきた。

-> build.gradleを分割してみましょう。

build.gradleを以下のように記載。

apply from: 'gradle/front.gradle'
// URLも利用可能
apply from: 'http://example.com/extra.gradle'

// releaseのみ含めたい場合
if (ext.env == 'release') {
  apply from: 'gradle/release.gradle'
}

注意!!

Gradle Pluginを使ったタスクや

Pluginのクラスを利用する場合は、

classpathが読み込まれるか確認しておく

Gradleを使った自動化のタスク例

  • Apache POIを使ってxlsxからcsvへ
  • H2を使ってcsvからSQLへ
  • windowsからLinuxのサーバへファイルを条件に応じて転送する
  • リモートに置いてあるファイルとの差分をチェックする
  • ブラウザから指定のリンクが活きてるかをチェックする
  • ローカルからJenkinsのjobをRESTで実行する
  • etc.

自動化するタスク例

低頻度で発生する作業だけど、毎回手でやるには面倒くさい。

でも、システム化するには工数がかかる。

既にExcelで運用管理しているが、改善の優先順位が低い。

そういったタスクをいかに楽して自動化するか?

  • PowerShell?
  • ShellScript(cygwin)?
  • JScript ?
  • .bat or .cmd ?

もしかしてVBですかーッ?

またまた、ご冗談を(AA略

なぜGradleを使うのか

  • Pluginがあれば、タスクの組み合わせで出来る。
  • Pluginが無ければ、一旦タスクにしてみる。
  • buildscriptブロックにライブラリを書けば、タスクで利用できる。
  • Gradle TestKitでを使うことで、テストがSpockで書ける。
  • Gradleに依存する部分としない部分を切り分けておけば、再利用しやすい。

なぜGradleを使うのか

  • ファイルの移動、コピー、削除程度ならCopySpecの基本をおさえておけば十分活用できる。
  • ライブラリを呼ばなくてもJSON, JDBCラッパー等、Gradleが用意しているGroovyの標準機能で十分まかなえる。
  • 大きくなったら、クラスにして別のプロジェクトとして切り出すことも可能。

オレオレTaskクラスは、Groovyだけでなく、もちろんJavaや他のJVM言語でも書けます!

タスクをクラスにして別のプロジェクトとして切り出す

-> Gradle Plugin

Gradle Pluginの紹介

Gradle Pluginを知るポイント

  • READMEを読む

Gradle Pluginを知るポイント

  • src/main/resources/META-INF/gradle-plugins/のpropertiesファイルにあるPluginのクラスを見つける
  • Pluginクラスのapplyメソッドを探す
    • タスクの定義やExtensionの設定をしている為
  • Extensionクラスを探す
    • Pluginが利用する設定の名前や型を知る為

Groovyに関するPlugin

REPL(groovysh)を使いたい

groovy scriptをgradleから実行したい

  • com.mrhaki.groovyrun
    • SimpleHttpServerが付いているので、簡易HTTPサーバが必要なときもこれで。

Download Task Plugin

外部リソースをダウンロードしたい

SSH Plugin

org.hidetake.ssh

  • ファイルを転送する
  • リモートのTomcat, Apacheの再起動等
  • SSHクライアントの代替

フロントエンドとの連携に関するPlugin

CoffeeScriptやLESSなどのビルドをまとめて実行したい

フロントエンドのNode.jsのタスクを実行したい

Git Plugin

build時にGitのハッシュを取得する

Git Plugin

build時にGitのハッシュを取得する

Dockerに関するPlugin

Dockerfileやdocker-compose.ymlを生成したり、dockerのコマンドをdocker-javaで実行する

JRuby Gradle Plugin

GradleからJRubyを実行したい

Asciidoctorを使いたい場合も

その他のPlugin

DBのマイグレーション

AWSに関する操作

その他のPlugin

Nebula Plugin

まとめ

  • Gradleは怖くない。
  • 小さいタスクを作る。
  • タスクを繋げる。
  • 大きくなったら分割する。
  • 困ったらPluginを探してみる。

Let's enjoy Gradle!