QuarkusとJenkinsで実現する最強のCI/CDパイプライン構築ガイド
生徒
「最近よく聞くQuarkusでWebアプリを作ってみたのですが、手動でビルドしてデプロイするのが大変になってきました。自動化する方法はありますか?」
先生
「それは素晴らしいステップアップですね!Quarkusはコンテナネイティブなフレームワークなので、Jenkinsを使ってCI/CDパイプラインを構築すると、開発効率が劇的に向上しますよ。」
生徒
「Jenkinsは聞いたことがありますが、Quarkus向けの設定って難しいんでしょうか?」
先生
「基本を押さえれば大丈夫です。テストの実行から、Quarkus特有のネイティブイメージ作成、 Dockerコンテナ化までの流れを自動化してみましょう。それでは、具体的な手順を解説していきますね!」
1. QuarkusにおけるCI/CDの重要性とJenkinsの役割
モダンなJava開発において、Quarkusはその圧倒的な起動速度とメモリ消費の少なさから、マイクロサービス開発のスタンダードになりつつあります。しかし、その性能を最大限に引き出すためには、ソースコードを修正するたびに自動的にテストを行い、実行可能なファイルを作成する「継続的インテグレーション(CI)」と、それを環境に配備する「継続的デリバリー(CD)」の仕組みが不可欠です。
Jenkinsは、世界中で最も利用されているオープンソースの自動化サーバーです。豊富なプラグインを利用することで、Gitリポジトリからのソースコード取得、MavenやGradleによるビルド、そしてDockerイメージの作成やKubernetesへのデプロイまでを一本の「パイプライン」として定義できます。QuarkusとJenkinsを組み合わせることで、開発者はコードを書くことだけに集中できるようになり、デプロイ作業に伴うヒューマンエラーを排除することが可能になります。
2. 事前準備と必要なツールのセットアップ
まずは、Jenkins上でQuarkusをビルドするための環境を整えましょう。最低限、以下のツールがJenkinsサーバーまたはビルドエージェントにインストールされている必要があります。これらが準備されていないと、パイプラインの実行中にエラーが発生してしまいます。
- JDK 17以上(Quarkusのバージョンに合わせる)
- Apache Maven または Gradle(ビルドツール)
- Docker(コンテナイメージ作成用)
- GraalVM(ネイティブイメージを作成する場合のみ)
Jenkinsの管理画面から「Global Tool Configuration」を開き、Mavenの設定を行っておきましょう。ここではMavenのインストールパスを指定し、パイプライン内で mvn コマンドが自由に使えるようにしておきます。また、Gitプラグインが有効になっていることも確認してください。これにより、GitHubやGitLabなどのリポジトリから最新のソースコードを自動的にプルできるようになります。
3. 最初のパイプラインコードを書いてみよう
Jenkinsでは「Jenkinsfile」というファイルに、ビルドの手順をコードとして記述します。これを「Pipeline as Code」と呼びます。まずは、ソースコードを取得してユニットテストを実行するだけのシンプルなパイプラインを作成してみましょう。これにより、コードに不備がないかを常にチェックする体制が整います。
// Jenkinsfile の基本構造(Declarative Pipeline)
pipeline {
agent any
stages {
stage('ソースコード取得') {
steps {
// Gitからコードをチェックアウト
checkout scm
}
}
stage('ユニットテスト実行') {
steps {
// Quarkusのテストを実行
sh './mvnw test'
}
}
}
}
このスクリプトをリポジトリのルートに配置し、Jenkinsで「Pipeline」ジョブを作成してこのファイルを読み込むように設定します。テストが失敗した場合には、Jenkinsがすぐに通知をくれるため、バグの早期発見につながります。Quarkusの ./mvnw test コマンドは、非常に高速に動作するため、開発のリズムを崩さずに検証を行うことができます。
4. ビルドとアーティファクトの生成手順
テストが通過したら、次は実際に実行可能なファイルをビルドするフェーズに進みます。Quarkusには「JVMモード」と「ネイティブモード」の2種類がありますが、まずは標準的なJVMモードでのビルド設定を見てみましょう。このステップでは、quarkus-app フォルダに必要なライブラリがまとめられます。
// ビルドステージを追加した例
stage('パッケージング') {
steps {
// jarファイルの生成(テストは既に終わっているのでスキップ)
sh './mvnw package -DskipTests'
}
}
実行結果として、以下のようなログがJenkinsのコンソールに出力されれば成功です。
[INFO] --- quarkus-maven-plugin:3.x.x:build (default) @ quarkus-demo ---
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1500ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
このように、Mavenの package コマンドを叩くだけで、Quarkusは最適化された実行ファイルを生成してくれます。生成されたファイルは、次のデプロイステージや、Dockerイメージ作成ステージで利用することになります。
5. Dockerイメージの自動作成とレジストリ登録
Quarkusの真価はコンテナ環境で発揮されます。Jenkinsパイプラインの中でDockerイメージを作成し、Docker Hubや社内のプライベートレジストリにプッシュする工程を追加しましょう。Quarkusには標準で src/main/docker/Dockerfile.jvm というファイルが用意されているので、これを活用します。
stage('Dockerイメージ作成') {
steps {
script {
// Dockerイメージのビルドとタグ付け
sh 'docker build -f src/main/docker/Dockerfile.jvm -t my-quarkus-app:${BUILD_NUMBER} .'
// 本来はここで docker push などのコマンドを実行
echo 'Dockerイメージのビルドが完了しました'
}
}
}
このステージを追加することで、ビルドが成功するたびに新しいバージョンのコンテナイメージが自動的に生成されます。${BUILD_NUMBER} というJenkinsの変数を使うことで、イメージにユニークなタグを付けることができ、問題が発生した際の切り戻し(ロールバック)も容易になります。Docker環境を準備する際は、JenkinsユーザーにDocker実行権限があることを確認しておきましょう。
6. ネイティブイメージビルドに挑戦する
Quarkusの最大の特徴である「ネイティブイメージ」のビルドを自動化する方法についても触れておきましょう。ネイティブイメージは起動が非常に速い反面、ビルドに多くのCPUとメモリ、そして時間を要します。Jenkinsサーバーのスペックに余裕がある場合に設定することをお勧めします。
stage('ネイティブビルド(高度な設定)') {
steps {
// コンテナを使用してネイティブビルドを実行(ローカルにGraalVMがなくても可能)
sh './mvnw package -Pnative -Dquarkus.native.container-build=true'
}
}
このコマンドを実行すると、Quarkusはビルド用のDockerコンテナを立ち上げ、その中でネイティブコンパイルを行います。これにより、ビルド環境に依存せずにネイティブバイナリを作成できます。作成されたバイナリは src/main/docker/Dockerfile.native を使って最小サイズのDockerイメージにパッケージングできます。これはクラウドネイティブな環境において、非常に強力な武器となります。
7. パイプラインをより堅牢にするエラーハンドリング
最後に、実際の運用で欠かせないエラーハンドリングについて説明します。ビルドが失敗したときに、単に止まるだけでなく、開発者に通知を送ったり、一時ファイルをクリーンアップしたりする処理が必要です。Jenkinsfileには post セクションを使って、実行結果に応じた処理を記述できます。
pipeline {
agent any
stages {
// 各ステージの定義...
}
post {
always {
// 成功・失敗に関わらず実行
echo '全ての工程が終了しました'
}
failure {
// 失敗時のみ実行
echo 'ビルドに失敗しました。ログを確認してください!'
// ここで Slack などの通知を送る設定を入れると便利
}
}
}
このように、エラー時の挙動をあらかじめ定義しておくことで、トラブルの解決スピードが向上します。また、ビルドの履歴を整理するために、定期的なワークスペースの削除を行うプラグインなどと組み合わせるのも良いでしょう。Quarkusの開発体験は、こうしたCI/CDの整備によって、さらに洗練されたものへと進化します。自動化の恩恵を最大限に受けて、高品質なJavaアプリケーションをスピーディに届けましょう。
8. Jenkinsfileの全体構成イメージ
ここまで紹介した要素を一つのファイルにまとめると、以下のような構成になります。実際のプロジェクトに合わせて、環境変数やデプロイ先を調整して活用してください。
<!-- Jenkinsfileを管理するリポジトリのイメージ -->
<div class="container">
<header>Quarkus CI/CD Pipeline Configuration</header>
<ul>
<li>Checkout Stage</li>
<li>Test Stage</li>
<li>Build Stage</li>
<li>Docker Package Stage</li>
</ul>
</div>
このHTML構造のように、パイプラインは各ステップが層状に重なって構成されています。初心者のうちは、一度に全てをやろうとせず、まずはテストの自動化から始め、徐々にDockerビルド、ネイティブイメージ化とステップアップしていくのが成功の秘訣です。Quarkusは最新の技術が詰まっていますが、Jenkinsとの親和性も非常に高いため、ぜひ挑戦してみてください。