【Gradle x SpringBoot】RPMパッケージの作り方

ビルドツールとして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

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です