ビルドツールとしてGradleを使ってアプリケーション開発をしていて、最終的にRPMパッケージとして成果物をビルドするケースについてやり方をまとめてみます!
準備
まずはRPMパッケージを作成するプラグインを導入します。
といってもplugins
ブロックに1行追加するだけです!
plugins {
...
// RPMパッケージ作成に必要なプラグイン
id 'nebula.ospackage' version '9.1.1'
}
このプラグインを導入するとbuildRpm
というタスクが追加され、RPMパッケージを作成できるようになります。
ただ、導入しただけでbuildRpmを実行しても中身のないRPMパッケージが作成されてしまいます。
$ ./gradlew buildRpm
$ rpm -lpq build/distributions/rpm-0.noarch.rpm
(ファイルが含まれていません)
設定
buildRpmで生成されるRPMパッケージのファイル名や中身を設定します。
bootJar {
// 生成されるjar名を指定
archivesBaseName = 'sample-app'
}
// RPMパッケージの中身の設定
buildRpm {
// RPMパッケージのメタデータを設定(主にファイル名に反映される)
packageName = 'sample-api'
version = '1.0.0'
release = "1"
os = LINUX
arch = "x86_64"
// RPMパッケージ配布時のbaseディレクトリを指定します
into "/opt/sample"
// RPMパッケージに含めるファイルを指定します
from("build/libs") {
// baseディレクトリ以下どのディレクトリに配置するか指定します
into "app/"
// サーバに展開する時のuser/group/権限を設定
user = "root"
permissionGroup = "root"
fileMode = 0444
}
}
// RPMパッケージを作成する「buildRpm」タスク実行前に必ずbuildを実行する(jarファイルがあることを担保)
buildRpm.dependsOn build
この設定でbuildRpmを実行すると、以下のようにちゃんと中身のあるRPMパッケージが作成されます!
$ rpm -lpq build/distributions/sample-api-1.0.0-1.x86_64.rpm
/opt/sample
/opt/sample/app
/opt/sample/app/sample-app.jar
オススメ設定
これでRPMパッケージを作ることができるようになりましたが、実際に運用する上でもう少し便利に使えるようにオススメの設定をご紹介します。
jarをshのように実行可能に
通常、jarファイルは
$ java -jar <jarファイル名>
のように実行しますが、
bootJar {
archivesBaseName = 'sample-app'
// 「launchScript」を追加
launchScript()
}
このように追加の設定をすることでshと同じように起動することができます!
./build/libs/sample-app.jar
これの便利なところはshのように実行できるだけではなく、拡張子を conf
に変えた名前の設定ファイルに環境変数を定義しておけば勝手に読み込んでくれたりもします!
export SERVER_PORT=8081
上記のファイルをjarファイルを同ディレクトリに配置しておけば8081 portでアプリケーションが起動してくれます!
ServiceファイルをRPMに含める
RPMパッケージを使う場合は、自分の現場だとsystemctlでサービスを起動することが多いです。
systemctlを利用している場合、serviceファイルもRPMパッケージに内包して置けると利便性が高いです!
[Unit]
Description=rpm sample app
[Service]
User=root
Group=root
# 前提: launchScriptを利用
ExecStart=/opt/sample/app/sample-app.jar
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
buildRpm {
// 以下を追加
from("rpm/systemctl") {
into "/etc/systemd/system"
user = "root"
permissionGroup = "root"
fileMode = 0755
}
}
この設定で buildRpm
を実行するとserviceファイルもRPMパッケージに含まれていることを確認できます!
$ rpm -lpq build/distributions/sample-api-1.0.0-1.x86_64.rpm
/etc/systemd
/etc/systemd/system
/etc/systemd/system/sample-app.service
/opt/sample
/opt/sample/app
/opt/sample/app/sample-app.jar