Open16

Gradle徹底入門

ピン留めされたアイテム
Taiki UejoTaiki Uejo

ゴール

以下を理解したい。

  • gradleプロジェクトを作成した時に作られる各ファイルの役割
  • ビルドツールにおけるGradleの位置付け
  • gradleホームの役割
  • タスクやプラグインなどの基礎
  • Junitの全テストが実行されているか把握するには?
  • FAT JARの作成方法
  • warファイルの作成方法
  • プロキシがある場合のgradleラッパーの活用方法
  • 独自jarの読み込み方法
  • build.gradleの一部タスクの共通化
  • 各プロジェクトへjarファイルを配布する方法
  • 既存プロジェクトにgradleを導入する方法
  • buildコマンドとtaskコマンドの違いとは
  • プロパティファイルのパスの通し方
Taiki UejoTaiki Uejo

ビルドツールについて

ビルドとビルドツール

基本的なビルドの定義とは、コンパイル、外部ライブラリのリンク、静的解析、テスト、パッケージングなどを通じて、実行可能なファイルを生成すること。

文脈次第でビルドに含める作業は変わってくる。デプロイまで含めていることもあり、広義の意味としてこのような定型作業全般をビルドと呼んだりする人もいる。ビルドツールはこのような定型的作業を自動化するためのソフトウェアである。

ビルドツールがないと具体的にどう困るのか

  • 無限ライブラリ地獄
    • これ体験したことがある。分かりみがすごい。
  • 手順書の陳腐化
    • 環境構築方法とか、あの手のExcelの手順書って更新されないよね。
  • 環境依存によるエラー
    • windowsとlinuxの違いとか本番環境と検証環境の違いとか手作業によるミス。あるある
  • デプロイが疲弊作業に
    • DBのパスが合ってるかなどのチェック作業、認知負荷がめっちゃ高いから疲弊する。

ビルド手順書が紙切れではなくプログラムに!

現在の業務では、ビルド作業は必ず自分が行っているのだが、属人性をなくすために、ビルド手順書を作った。(この本ではそのような作業をする人はビルド職人と言われていた)

ただ、その手順書があっても別の人にビルド作業を依頼するのは少々怖い。

Gradleを使えば、そのような人がやる作業はプログラム化される。結果的にそのような不安を完全に取り除くことができる。

Taiki UejoTaiki Uejo

ビルドツールの進化におけるGradleの位置付け

ビルドツールはMake→Ant→Maven→Gradleという進化を経てきた。

  1. Make:ビルドというコンセプトの確立。スクリプト言語を採用。UNIX系OSのみ使えた。
  2. Ant:クロスプラットフォーム対応。汎用性を高めることに成功。XMLを採用。
  3. Maven:規約ベース。記述の効率化に成功。XMLを採用。
  4. Gradle:規約ベース。スクリプト言語への回帰によりMavenよりも柔軟性を持たせることに成功。

規約ベースとは?

規約に従ったプロジェクト構造を使う限りにおいてはビルドスクリプトを大幅に省略可能である仕組み。ただ、Gradleは規約から外れても柔軟に対応可能。

Taiki UejoTaiki Uejo

個別インストール不要!

Gradleラッパーという機能があり、Gradleを個別インストールせずとも、自動的にインストールしてくれる。

プロキシの関係でインターネットからインストールできなくても、社内のファイルサーバーなどにGradleのバイナリを配置しておけば、それをインストールして使ってもらうことができる。

gradlewコマンドを実行すればいいと。これについては後で詳しく見ていきたい。

Taiki UejoTaiki Uejo

Gradleの互換性への配慮

  • 破壊的なバージョンアップは行わない
  • 機能廃止は段階的に行う。廃止されることをwarningなどで明示してくれる
  • 新機能は十分なフィードバックを受けてから安定したものを取り込む

ライフサイクル

機能は以下のようなライフサイクルを経る。

  • 非公開
  • 実験的
  • 公開
    • デフォルトのステータス。除去対象になっても廃止ステータスを必ず経る。この機能が変更されても後方互換性を維持するよう努める。
  • 廃止
    • 廃止ステータスに移行した機能は次のメジャーバージョンアップで除去
Taiki UejoTaiki Uejo

Gradleのインストール

You can install Gradle Build Tool on Linux, macOS, or Windows. The installation can be done manually or using a package manager like SDKMAN! or Homebrew.
You can find all Gradle releases and their checksums on the releases page.

https://docs.gradle.org/current/userguide/installation.html#installing_with_a_package_manager

SDKMAN!は旧GVMらしい。パッケージマネージャ的役割。今回はhomebrewでインストールした。

Taiki UejoTaiki Uejo

gradleのタスクの実行

build.gradleを定義して以下のタスクを設定した。クロージャーを使っているらしい?

build.gradle
task hello {
  doLast {
    println 'Hello world!'
  }
}

デフォルトではカレントディレクトリのbuild.gradleを読み込んでタスクを実行できる。
gradle helloで実行できる。

ログ

gradle -i helloなどとするとログ出力できる。

  • -i(info)
    • ログレベルがINFOに設定。ビルドスクリプトのファイル名などが表示。
  • -s(stacktrace)
    • 例外発生時にユーザー例外のみ出力。これが一番使えそうだ。
  • -S(full stacktrace)
    • 全てのスタットレースを出力する。
Taiki UejoTaiki Uejo

Gradle wrapperの意義

現在進行中のプロジェクトにGradleを導入したいとなってもハードルは高い。自分一人ならいいが、各開発者にGradleの良さを説明し、インストールしてもらって、セットアップして、、、。はい、挫折。

Gradle wrapperがあればインストールとセットアップをコマンドで実行してくれる。導入への障壁を下げられる。

  • バージョンの強制ができる
  • JenkinsなどのCIサーバーにGradleをインストールしなくても良い

というメリットもある。

実行

この方法でインストールした場合は、gradlewコマンドを使う必要がある。グローバルにインストールしているわけではないからgradleでは実行できない。

Taiki UejoTaiki Uejo

各初期ファイルの役割

  • gradle/wrapper/gradle-wrapper.jar:Gradleラッパーのブートストラップ
  • gradle/wrapper/gradle-wrapper.properities:Gradleラッパー設定ファイル
  • gradlew:Gradleラッパ起動用シェルスクリプト
  • gradlew.bat:Gradleラッパ起動用バッチファイル(windows用)
Taiki UejoTaiki Uejo

標準機能でJavaのビルドはできない

Gradleのコア機能ではJavaのビルドはできない。プラグインとして追加する必要がある。

GradleはJavaのビルドツールというより、プラグインで拡張可能な自動化ツールという解釈が正しい。

これは実際、公式サイトでは以下のように謳っている。

モバイルアプリからマイクロサービスまで、小さなスタートアップから大企業まで、Gradleはチームがより良いソフトウェアをより速く構築、自動化し、提供できるようにします。

また、Build Anythingとして様々な言語で使うことができる。

Java、Kotlin、C++など、お好きな言語で書いてください。どのプラットフォームにもデプロイできるようにパッケージ化する。モノレポでもマルチレポでも。そして、Gradleの比類ない多機能性に頼って、すべてをビルドしてください。

Taiki UejoTaiki Uejo

JavaCompile型のタスクへの一括指定

compileJavaタスクやcompileTestJavaタスクなどはJavaCompile型のタスクである。UTF-8でコンパイルを行うようにするには、以下のように設定する。

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}
Taiki UejoTaiki Uejo

Javaプラグインが提供するタスク

  • compileJava
  • processResources
  • classes
  • compileTestJava
  • processTestResources
Taiki UejoTaiki Uejo

独自のjarを読み込む方法

Gradle8.6でプロジェクト内に配置したjarファイルを読み込むには、dependenciesに以下のように記述する。(ルート直下のlibsディレクトリに配置する場合)

implementaition fileTree(dir: 'libs', include: '*.jar')
Taiki UejoTaiki Uejo

認証なしプロキシでGradleを動かすには

プロキシ環境下では、Gradle wrapperを使ったインストールができない。GradleはJVMで動く。そのJVMに証明書がインストールする必要がある。認証なしだったので、properitiesなどに設定せずにkeytoolコマンドを使って対象にインストールするだけで良い。

eclipseを起動するJVMに証明書をインストールすると楽

eclipseでGradleプロジェクトを作成したり、インポートする場合、手っ取り早いのはeclipseが利用するJVMに証明書をインストールすること。

pleadesでインストールした場合内包されているJavaのランタイムを利用していることがわかった。eclipse.iniに書かれている。

このJVMに対して証明書をインストールする。するとeclipseでgradleプロジェクトを扱う時はJAVA_HOMEにこいつが設定されるので、後々楽だという話。