カテゴリ: Quarkus 更新日: 2026/03/28

QuarkusアプリのCI/CD入門ガイド!コンテナ時代の爆速開発パイプライン構築法

QuarkusアプリのCI/CD基礎
QuarkusアプリのCI/CD基礎

先生と生徒の会話形式で理解しよう

生徒

「最近よく聞くQuarkusでアプリを作ってみたんですけど、本番環境へのデプロイを自動化するCI/CDってどう進めればいいんですか?」

先生

「Quarkusは『Supersonic Subatomic Java』と呼ばれる通り、軽量で起動が早いためCI/CDとの相性が抜群です。コンテナビルドやネイティブイメージ作成を組み込むのが一般的ですね。」

生徒

「ネイティブイメージとか、GitHub Actionsとか、具体的に何を準備すればいいのか知りたいです!」

先生

「まずは基本となるビルドの自動化から、クラウド環境へのデプロイまでの流れを順番に見ていきましょう!」

1. QuarkusにおけるCI/CDの重要性

1. QuarkusにおけるCI/CDの重要性
1. QuarkusにおけるCI/CDの重要性

モダンなJava開発において、Quarkus(クオーカス)を採用する最大の理由は、その圧倒的な実行速度とリソース消費の少なさにあります。しかし、どれだけアプリケーションが軽量でも、手動でのビルドやデプロイを繰り返していては、開発のスピード感(アジリティ)を活かしきれません。そこで重要になるのが、CI/CD(継続的インテグレーション/継続的デリバリー)の導入です。

CI/CDパイプラインを構築することで、ソースコードをGitHubやGitLabにプッシュするだけで、自動的にユニットテストが実行され、コンテナイメージが作成され、さらにはステージング環境や本番環境へとアプリが配備されます。Quarkusは特に「コンテナネイティブ」な設計がなされているため、DockerやKubernetesとの親和性が高く、従来のJavaフレームワークよりもパイプラインの実行時間を大幅に短縮できるという大きなメリットがあります。

2. 継続的インテグレーションの第一歩とビルド設定

2. 継続的インテグレーションの第一歩とビルド設定
2. 継続的インテグレーションの第一歩とビルド設定

CI(継続的インテグレーション)の基本は、コードが共有リポジトリに統合されるたびに自動でビルドとテストを行うことです。Quarkusプロジェクトでは、MavenやGradleといったビルドツールを使用します。まず、プロジェクトのルートにあるpom.xmlやbuild.gradleが正しく構成されているか確認しましょう。

特にCI環境では、メモリ制限がある場合が多いため、Quarkusのビルドプロセスが効率的に動くように設定する必要があります。以下のコードは、Mavenを使用して基本的なテストとパッケージングを行うためのコマンド例です。これをCIツール(GitHub Actionsなど)のステップに記述します。


// これはJavaコードの形式を借りたビルドコマンドの解説です
public class BuildCommand {
    public static void main(String[] args) {
        // Mavenを使用してテストを実行し、高速にJARファイルを作成する
        // ./mvnw clean package
        System.out.println("ビルドとテストを開始します...");
    }
}

実行結果のイメージは以下のようになります。Quarkusの拡張機能がスキャンされ、テストがパスすることで、デプロイ可能な成果物が生成されます。


[INFO] Scanning for projects...
[INFO] --- quarkus:3.15.0:build (default) ---
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 1500ms
[INFO] BUILD SUCCESS

3. GitHub Actionsを利用したパイプラインの定義

3. GitHub Actionsを利用したパイプラインの定義
3. GitHub Actionsを利用したパイプラインの定義

現在、最も普及しているCI/CDツールの一つがGitHub Actionsです。Quarkusアプリを自動ビルドするためのワークフローファイル(YAML形式)をリポジトリの .github/workflows ディレクトリに配置します。この設定ファイルにより、どのタイミングで処理を動かすかを制御できます。

初心者の方が最初につまずきやすいのは、Javaのバージョン指定やキャッシュの設定です。QuarkusはJava 17以降を推奨していることが多いため、ランタイムの一致に注意しましょう。また、Mavenの依存関係をキャッシュすることで、2回目以降のビルド時間を劇的に短縮できます。以下に基本的なGitHub Actionsの定義例を示します。


<!-- .github/workflows/ci.yml のイメージ -->
<section>
  <name>Quarkus Build</name>
  <on>push</on>
  <jobs>
    <build>
      <runs-on>ubuntu-latest</runs-on>
      <steps>
        <uses>actions/checkout@v4</uses>
        <uses>actions/setup-java@v4</uses>
        <with>
          <java-version>17</java-version>
          <distribution>'temurin'</distribution>
        </with>
        <run>./mvnw package</run>
      </steps>
    </build>
  </jobs>
</section>

4. ネイティブイメージ作成による最適化

4. ネイティブイメージ作成による最適化
4. ネイティブイメージ作成による最適化

Quarkusの真骨頂は、GraalVMを利用したネイティブバイナリの生成です。これにより、Java VMを介さずにOS上で直接実行可能な形式になり、メモリ消費量を数分の一に、起動時間をミリ秒単位にまで抑えることができます。しかし、ネイティブイメージのビルドには非常に多くのCPUパワーとメモリ(最低でも8GB以上推奨)が必要であり、実行時間も数分から数十分かかります。

そのため、CI/CDパイプラインでは「プルリクエスト(PR)時は高速なJVMモードでビルドし、本番リリースのタイミングだけネイティブイメージを作成する」といった使い分けが推奨されます。ネイティブビルドを有効にするには、プロファイル指定をコマンドに追加するだけです。以下のプログラムは、環境変数によって挙動を変えるシンプルなQuarkusのリソースクラスの例です。


package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import org.eclipse.microprofile.config.inject.ConfigProperty;

@Path("/hello")
public class GreetingResource {

    @ConfigProperty(name = "greeting.message", defaultValue = "Hello")
    String message;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        // CI/CDで設定した環境変数がここに反映されます
        return message + " from Quarkus!";
    }
}

5. コンテナイメージの自動プッシュ

5. コンテナイメージの自動プッシュ
5. コンテナイメージの自動プッシュ

ビルドされたアプリは、Dockerイメージとしてパッケージングされ、コンテナレジストリ(Docker Hub, Amazon ECR, Google Artifact Registryなど)に保存されます。Quarkusには quarkus-container-image-dockerquarkus-container-image-jib といった便利な拡張機能があり、Dockerfileを自分で書かなくてもイメージを生成できます。

Jibを使用すると、Dockerデーモンが動いていないCI環境でもイメージをビルドできるため、パイプラインの構築が非常に楽になります。CIプロセスの中で、レジストリへのログイン情報をシークレットとして保持し、ビルド完了と同時にプッシュする設定を組み込みましょう。これにより、常に最新の「動く状態」のイメージがレジストリに保管されるようになります。


[INFO] [io.quarkus.container.image.jib.deployment.JibProcessor] 
[INFO] Pushing image my-quarkus-app:latest to registry.hub.docker.com
[INFO] Published image registry.hub.docker.com/my-repo/my-quarkus-app:latest

6. テスト自動化と継続的デリバリー

6. テスト自動化と継続的デリバリー
6. テスト自動化と継続的デリバリー

CI/CDの「CD」部分、つまり継続的デリバリーでは、テストを通過した成果物を実際のサーバー環境にデプロイします。Quarkusでは、@QuarkusTest アノテーションを使用することで、非常に高速な統合テストが可能です。パイプラインの中でこれらのテストが失敗した場合、デプロイ処理は即座に中断され、壊れたコードが本番に反映されるのを防ぎます。

デプロイ先がKubernetesの場合、Quarkusの拡張機能を使えばマニフェストファイル(YAML)の自動生成も可能です。パイプラインの最終ステップで kubectl applyhelm upgrade を実行するように設定します。初心者のうちは、まずは特定のサーバーにSSHでログインして docker-compose up を実行するようなシンプルな仕組みから始めて、徐々に高度なオーケストレーションへ移行していくのが良いでしょう。


package org.acme;

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.is;

@QuarkusTest
public class GreetingResourceTest {

    @Test
    public void testHelloEndpoint() {
        // パイプライン内で実行される自動テスト
        given()
          .when().get("/hello")
          .then()
             .statusCode(200)
             .body(is("Hello from Quarkus!"));
    }
}

7. パイプライン運用の注意点とトラブルシューティング

7. パイプライン運用の注意点とトラブルシューティング
7. パイプライン運用の注意点とトラブルシューティング

CI/CDパイプラインは一度作って終わりではありません。運用の過程で、ビルドが不安定になったり、外部APIとの通信エラーでテストが失敗したりすることがあります。Quarkusの開発モードは非常に便利ですが、CI環境では本番と同じ設定で動かすことが重要です。また、シークレット(パスワードやAPIキー)の管理には十分に注意し、決してソースコードに直接書き込まないようにしてください。

ビルドが失敗した際は、CIツールのログを詳細に確認する癖をつけましょう。Quarkusはエラーメッセージが非常に親切なことでも知られています。例えば、依存ライブラリの競合や、ネイティブビルド時のメモリ不足など、原因の多くはログの中に明示されています。パイプラインを安定させることは、チーム全体の開発効率を上げ、安心してリリースできる文化を作るための第一歩となります。

カテゴリの一覧へ
新着記事
New1
Micronaut
Micronautのイベント発行とリスナーの使い方!アプリ内通信の基本をやさしく解説
New2
Quarkus
QuarkusのREST APIでJSONレスポンスを返す方法を完全解説!初心者向けJackson・JSON-B入門
New3
Quarkus
Quarkus拡張開発入門!GraalVMネイティブイメージ統合の仕組みを徹底解説
New4
Micronaut
Micronautの@Requiresとは?条件付きBeanの読み込み方法をやさしく解説【DIとアノテーション入門】
人気記事
No.1
Java&Spring記事人気No1
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.2
Java&Spring記事人気No2
Quarkus
Quarkus拡張開発を徹底解説!仕組みから自作エクステンションの作り方まで
No.3
Java&Spring記事人気No3
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.4
Java&Spring記事人気No4
Java
JavaのString検索方法を完全ガイド!contains・indexOf・startsWith・endsWithを徹底解説
No.5
Java&Spring記事人気No5
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?
No.6
Java&Spring記事人気No6
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.7
Java&Spring記事人気No7
Quarkus
Quarkus拡張開発入門!自作Extensionを作る基本ステップと仕組みを徹底解説
No.8
Java&Spring記事人気No8
Micronaut
Micronautのリクエスト制限(Rate Limiting)を徹底解説!サーバーを守る流量制御