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

QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法

GitHub ActionsでQuarkusを自動デプロイ
GitHub ActionsでQuarkusを自動デプロイ

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

生徒

「Quarkusで作ったアプリを、GitHubにプッシュするだけで自動的にデプロイまで終わらせる方法ってありますか?」

先生

「それならGitHub Actionsを使うのが一番ですね。CI/CDパイプラインを構築すれば、ビルドからテスト、デプロイまでを完全に自動化できますよ。」

生徒

「難しそうに聞こえますが、初心者でも設定できるでしょうか?」

先生

「大丈夫です。設定ファイルの書き方さえ覚えれば、驚くほど簡単に自動化の恩恵を受けられます。具体的な手順を見ていきましょう!」

1. QuarkusとGitHub Actionsの基本知識

1. QuarkusとGitHub Actionsの基本知識
1. QuarkusとGitHub Actionsの基本知識

Quarkus(クオーカス)は、Javaのフレームワークの中でも特にクラウドネイティブ、そしてコンテナ環境に最適化されています。起動が非常に速く、メモリ消費量が少ないのが特徴です。一方、GitHub Actionsは、GitHub上で利用できる自動化ツールで、コードを更新したタイミングで特定の処理を実行させることができます。

これらを組み合わせることで、「CI/CD(継続的インテグレーション/継続的デリバリー)」という仕組みを実現します。開発者がソースコードを修正してGitHubへプッシュすると、自動でプログラムがコンパイルされ、エラーがないかテストが走り、最終的に本番環境へ配置されるという流れです。これにより、手作業でのミスを減らし、常に最新の状態を維持することが可能になります。

2. プロジェクトの準備と必要なファイル構造

2. プロジェクトの準備と必要なファイル構造
2. プロジェクトの準備と必要なファイル構造

まずはQuarkusのプロジェクトをGitHubのリポジトリにアップロードしておきましょう。標準的なQuarkusプロジェクトであれば、pom.xml(Mavenの場合)が含まれているはずです。GitHub Actionsを設定するには、プロジェクトのルートディレクトリに特定のフォルダ構造を作成する必要があります。

具体的には、.github/workflows/というディレクトリを作成し、その中にYAML形式のファイル(例:deploy.yml)を作成します。このファイルが自動化の「設計図」となります。ここに「いつ」「何をするか」を詳しく記述していきます。初心者が最初につまずくのは、このフォルダ名のスペルミスやドットの付け忘れですので、注意深く作業を進めましょう。

3. GitHub Actionsのワークフローを作成する

3. GitHub Actionsのワークフローを作成する
3. GitHub Actionsのワークフローを作成する

それでは、実際のワークフローファイルの内容を見ていきましょう。ここでは、JavaのビルドツールであるMavenを使用して、Quarkusアプリをビルドする基本的な構成を紹介します。このコードは、mainブランチにプッシュされた時に動作する設定になっています。


name: Quarkus CI with Maven

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'
        cache: maven
    - name: Build with Maven
      run: ./mvnw package

このYAMLファイルでは、まず実行環境としてubuntu-latestを指定しています。最新のUbuntu上でJava 17をセットアップし、Mavenを使ってパッケージ化(ビルド)を行うという手順です。キャッシュ機能を使っているため、二回目以降の実行が高速化される工夫も含まれています。

4. Mavenラッパーを使用したビルドのポイント

4. Mavenラッパーを使用したビルドのポイント
4. Mavenラッパーを使用したビルドのポイント

Quarkusプロジェクトを作成すると、mvnw(Maven Wrapper)というファイルが同梱されます。これを使用することで、実行環境にMavenがインストールされていなくても、プロジェクト指定のバージョンでビルドが可能になります。GitHub Actionsのステップ内で./mvnwコマンドを実行するのはそのためです。

また、Quarkusは「Native Build(ネイティブビルド)」もサポートしていますが、これには高い計算リソースと時間が必要です。最初のうちは、標準的なJARファイル形式でのビルドから始めるのがスムーズです。GitHub Actions上で動作を確認できたら、徐々に複雑な設定に挑戦していくのが上達の近道です。

5. コンテナイメージの作成とDocker連携

5. コンテナイメージの作成とDocker連携
5. コンテナイメージの作成とDocker連携

Quarkusアプリをクラウドにデプロイする場合、Dockerイメージとしてパッケージ化することが一般的です。GitHub Actions内でDockerイメージをビルドし、Docker HubやGitHub Packagesといったコンテナレジストリに保存する工程を追加してみましょう。


    - name: Build Docker Image
      run: |
        ./mvnw package -Dquarkus.container-image.build=true \
          -Dquarkus.container-image.group=my-org \
          -Dquarkus.container-image.name=my-quarkus-app

このようにQuarkusの拡張機能を利用すると、Dockerfileを意識せずにビルドと同時にコンテナ化を行うことができます。これはQuarkusならではの強力な機能です。初心者の方は、まず手動でコンテナが作れるかを確認してから、この自動化ステップを取り入れると理解が深まります。

6. シークレット変数を利用した安全なデプロイ

6. シークレット変数を利用した安全なデプロイ
6. シークレット変数を利用した安全なデプロイ

デプロイ作業には、サーバーのパスワードやAPIキーなどの機密情報が必要になります。これらをYAMLファイルに直接書くのは非常に危険です。GitHubの「Secrets」という機能を使って、安全に管理しましょう。設定した値は、ワークフロー内で変数として呼び出すことができます。


    - name: Deploy to Server
      env:
        SERVER_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
      run: |
        echo "デプロイコマンドをここに実行"
        # 例: curlでウェブフックを叩く、SSHでコマンドを送るなど

この仕組みにより、ソースコードが公開されていても、重要なパスワードが流出することを防げます。セキュアなパイプライン構築は、プロフェッショナルな開発現場では必須のスキルとなります。

7. ユニットテストの自動実行で品質を守る

7. ユニットテストの自動実行で品質を守る
7. ユニットテストの自動実行で品質を守る

デプロイの前に必ず行いたいのがテストです。Quarkusには強力なテスト用アノテーションが用意されています。GitHub Actionsの中でテストを自動実行するように設定すれば、バグが含まれたまま本番環境に反映されるのを防ぐことができます。以下のコードは、テストを実行してその結果を確認するシンプルな例です。


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 RESTEasy Reactive"));
    }
}

このテストコードが含まれている状態で./mvnw testを実行すると、Quarkusが自動的に起動し、指定したエンドポイントが正しく動作するかを検証してくれます。CI環境でこれが通らなければデプロイを中断させる、という制御が重要になります。

8. デプロイ結果の通知を受け取る

8. デプロイ結果の通知を受け取る
8. デプロイ結果の通知を受け取る

CI/CDパイプラインが成功したか失敗したかを、毎回GitHubの画面で確認するのは大変です。SlackやDiscordに通知を送る設定を追加すると便利です。GitHub Marketplaceには多くの公式・非公式アクションが公開されており、それらを組み合わせるだけで通知機能を実装できます。エラーが発生した時にすぐに気づける環境を作ることで、開発のサイクルは劇的に改善されます。

9. 実践的なデプロイ先:AzureやAWSへの展開

9. 実践的なデプロイ先:AzureやAWSへの展開
9. 実践的なデプロイ先:AzureやAWSへの展開

最後に、実際のクラウド環境へのデプロイを想定してみましょう。QuarkusはAzure FunctionsやAWS Lambda、Google Cloud Runなど、多くのプラットフォームに対応しています。それぞれ専用のアクションが用意されているため、自分の利用するクラウドに合わせてステップを追加します。例えば、Azure Container Appsにデプロイする場合は、Azureにログインしてコンテナをプッシュする数行のステップを追加するだけで完了します。


    - name: Azure Login
      uses: azure/login@v1
      with:
        creds: ${{ secrets.AZURE_CREDENTIALS }}

    - name: Deploy to Azure Container Apps
      uses: azure/container-apps-deploy-action@v1
      with:
        imageToDeploy: myregistry.azurecr.io/quarkus-app:latest

このように、部品を組み合わせて自分だけのパイプラインを作り上げていく過程は、パズルを解くような楽しさがあります。まずは最小構成から始め、自分のプロジェクトに必要な機能を一つずつ追加していきましょう。自動化が進むほど、あなたはコードを書くという本来のクリエイティブな仕事に集中できるようになります。

カテゴリの一覧へ
新着記事
New1
Java
JavaのStringBufferクラスを徹底解説!スレッド安全な文字列操作の仕組みと使い分け
New2
Micronaut
Micronautで非同期HTTP処理を行う方法!リアクティブ対応の基礎知識
New3
Micronaut
Micronautの@Prototypeとは?新しいインスタンスを生成するスコープの基本
New4
Quarkus
QuarkusのCDIスコープを完全理解!@ApplicationScopedと@RequestScopedを初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
Quarkus
Quarkus入門!GitHub ActionsでCI/CDパイプラインを構築して自動ビルドを実現する方法
No.2
Java&Spring記事人気No2
Java
Javaのコンパイルと実行の流れを解説!JVM・JDK・JREの違いも初心者向けに整理
No.3
Java&Spring記事人気No3
Micronaut
Micronautのルーティング設定ガイド!プレフィックス付与とAPIバージョニングの基本
No.4
Java&Spring記事人気No4
Java
Java Optional ifPresentの使い方を徹底解説!nullチェックをスマートに省略する方法
No.5
Java&Spring記事人気No5
Quarkus
QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
No.6
Java&Spring記事人気No6
Micronaut
Micronautのフィルタ徹底解説!HTTPリクエスト共通処理をスマートに追加する方法
No.7
Java&Spring記事人気No7
Java
Java Functionインタフェースの使い方を完全ガイド!map変換と処理チェーンを理解する
No.8
Java&Spring記事人気No8
Java
JavaのString比較を徹底解説!equalsと==の違い、初心者が陥る罠とは?