Gradleで業務システム(Java)の設定値を切り替えながらビルド自動化
業務で工場向けシステム(Java)の開発・導入展開を担当しています。
このシステム、紆余曲折あった結果として以下の問題が発生しています。
- 複数のサーバーで同バージョンが設定値違いで動いている
- 1回の改修につき10回(サーバー× 環境)ほどリリース作業が発生する
- 対象環境ごとに設定ファイルを書き換えて手動でリリースしている
- 今後もサーバーは増えるが、抜本的な見直しは行われない
- 作業がめんどくさ過ぎて細かい改修が後回しになる
改修頻度が低いのでなんとかなっていますが、問題を抱えていることは明らか。
今後も拠点は増える予定なので、負債を少しでも軽減すべくビルド自動化を試みました。
やったこと
- デモ用アプリを用意
- Gradleインストール
- 既存プロジェクトにGradle導入
- Gradleでビルド
- Gradleで設定値を切り替えれるよう変更
※作業環境:Windows10 64bit
1.デモ用アプリを用意
Gradleでビルド自動化するためのJavaアプリが手元なかったのでこちらを拝借。
Practice/JSPChat/
をEclipseの"既存プロジェクト"としてインポート。
プロジェクト設定からJavaとTomcatのバージョンを合わせる。
オンプレ至上主義である業務システムに準じてライブラリは全てWEB-INF/lib
に用意する。
サーバー起動して動作確認をしておく。
2.1 Gradleをインストール
公式(Gradle | Installation)からzip落として解凍。適当な場所に配置。
解凍フォルダ以下gradle-5.2.1/bin
を環境変数Pathに追加。
gradle -v
コマンドで動作確認。以下のように表示されたらOK。
Welcome to Gradle 5.2.1! ------------------------------------------------------------ Gradle 5.2.1 ------------------------------------------------------------ Build time: 2019-02-08 19:00:10 UTC Revision: f02764e074c32ee8851a4e1877dd1fea8ffb7183 Kotlin DSL: 1.1.3 Kotlin: 1.3.20 Groovy: 2.5.4 Ant: Apache Ant(TM) version 1.9.13 compiled on July 10 2018 JVM: 1.8.0_172 (Oracle Corporation 25.172-b11) OS: Windows 10 10.0 amd64
2.2 Eclipse
Eclipse>ヘルプ>マーケットプレイスからBuildship Gradle Integrationをインストール。
詰まったところ
Eclipse上でGradleタスクを実行した際"JAVA_HOME"が設定されていません的なエラーが出た。
Windowsの環境変数とは別にEclipse内のGradleの設定からJAVA_HOMEを指定する必要がある。
3.既存プロジェクトにGradle導入
Gradleプロジェクトに変換(?)
Eclipse上でプロジェクトを右クリック>構成>Gradleプロジェクト。gradle.build記述
まずはシンプルにWARを作成できるようにする。
その際ライブラリは全てWEB-INF/lib
に格納しておく。
apply plugin: 'java' apply plugin: 'war' // Web 公開用のディレクトリを指定 webAppDirName = 'WebContent' dependencies { // lib フォルダ直下の jar を全て指定 compile fileTree(dir: 'WebContent/WEB-INF/lib', include: '*.jar') } war { archiveName 'web.war' enabled = true }
4. Gradleでビルド
Eclipse上で実行する場合
Gradleタスクビューからwarタスクを実行。コマンドから実行する場合
プロジェクト直下でコマンドプロンプトからgradle build
を実行。
以下のように表示されたらOK。
BUILD SUCCESSFUL in 2s 1 actionable task: 1 executed E:\JSP_Servlet_Practice-master\Practice\JSPChat>
Eclipse、コマンドともに成功するとPJフォルダ/build/libs
にWARが作成される。
TomcatにWARを配置して画面が表示されることを確認。
5. Gradleで設定値を切り替えれるよう変更
引数に応じてファイルをコピー、リネームするrenameタスクをbuild.gradleに追加。
task rename(type: Copy) { // 引数modeに応じてコピー元のファイルを選択 def mode = project.hasProperty("mode") ? project.property("mode"):"" if (mode=="hoge"){ from 'environments/index_hoge.jsp' } else { from 'environments/index_fuga.jsp' } // コピー後にファイル名を変更 into 'WebContent/' rename 'index(.+).jsp', 'index.jsp' }
簡易的に、index.jsp自体を作り分けて引数に応じて移動とリネームをするようにした。
コマンドプロンプトから
gradle rename -Pmode="hoge"
として実行。
EclipseでGradleタスクの実行構成を組んでもできそうだが手間ばかりで利点を感じなかったので割愛。
gradle war
でWAR生成してTomcatに配置、画面を確認する。
引数で指定したindex_hoge.jspが反映されていることを確認。
実用には流石にもう少し作りこみがいるが、ひとまず当初の目的は達成。
あとはbatファイルで簡単なビルドツールっぽくすればOK。
まとめ
今後は環境が増えたタイミングで設定ファイルとビルドツールを更新すれば、以降のビルド自体はほぼ自動。 最低限の自動化ですが、ひとまずファイル書き換えなど手作業はほぼなくすことができそうです。
依存管理やテスト実行など全くやっていないのでGradleのメリットの極一部しか享受していませんが、それでも今後の運用はだいぶ楽になるはず!
プロジェクト一式はこちら
GitHub - y-megane/Gradle-sample: Gradle-sample
今後
ビルドまでは自動化できましたがリリース作業も色々とアレな感じ。
次は各サーバーへのリリース作業の自動化を試みたいと思います。
・・・そもそも許可外のツール利用なので部長承認とか技術以外のハードルが残っているわけですが・・・