QuarkusのCI/CD入門!GitHub Actionsで自動デプロイを実現する方法
生徒
「Quarkusで作ったアプリを、GitHubにプッシュするだけで自動的にデプロイまで終わらせる方法ってありますか?」
先生
「それならGitHub Actionsを使うのが一番ですね。CI/CDパイプラインを構築すれば、ビルドからテスト、デプロイまでを完全に自動化できますよ。」
生徒
「難しそうに聞こえますが、初心者でも設定できるでしょうか?」
先生
「大丈夫です。設定ファイルの書き方さえ覚えれば、驚くほど簡単に自動化の恩恵を受けられます。具体的な手順を見ていきましょう!」
1. QuarkusとGitHub Actionsの基本知識
Quarkus(クオーカス)は、Javaのフレームワークの中でも特にクラウドネイティブ、そしてコンテナ環境に最適化されています。起動が非常に速く、メモリ消費量が少ないのが特徴です。一方、GitHub Actionsは、GitHub上で利用できる自動化ツールで、コードを更新したタイミングで特定の処理を実行させることができます。
これらを組み合わせることで、「CI/CD(継続的インテグレーション/継続的デリバリー)」という仕組みを実現します。開発者がソースコードを修正してGitHubへプッシュすると、自動でプログラムがコンパイルされ、エラーがないかテストが走り、最終的に本番環境へ配置されるという流れです。これにより、手作業でのミスを減らし、常に最新の状態を維持することが可能になります。
2. プロジェクトの準備と必要なファイル構造
まずはQuarkusのプロジェクトをGitHubのリポジトリにアップロードしておきましょう。標準的なQuarkusプロジェクトであれば、pom.xml(Mavenの場合)が含まれているはずです。GitHub Actionsを設定するには、プロジェクトのルートディレクトリに特定のフォルダ構造を作成する必要があります。
具体的には、.github/workflows/というディレクトリを作成し、その中にYAML形式のファイル(例:deploy.yml)を作成します。このファイルが自動化の「設計図」となります。ここに「いつ」「何をするか」を詳しく記述していきます。初心者が最初につまずくのは、このフォルダ名のスペルミスやドットの付け忘れですので、注意深く作業を進めましょう。
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ラッパーを使用したビルドのポイント
Quarkusプロジェクトを作成すると、mvnw(Maven Wrapper)というファイルが同梱されます。これを使用することで、実行環境にMavenがインストールされていなくても、プロジェクト指定のバージョンでビルドが可能になります。GitHub Actionsのステップ内で./mvnwコマンドを実行するのはそのためです。
また、Quarkusは「Native Build(ネイティブビルド)」もサポートしていますが、これには高い計算リソースと時間が必要です。最初のうちは、標準的なJARファイル形式でのビルドから始めるのがスムーズです。GitHub Actions上で動作を確認できたら、徐々に複雑な設定に挑戦していくのが上達の近道です。
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. シークレット変数を利用した安全なデプロイ
デプロイ作業には、サーバーのパスワードやAPIキーなどの機密情報が必要になります。これらをYAMLファイルに直接書くのは非常に危険です。GitHubの「Secrets」という機能を使って、安全に管理しましょう。設定した値は、ワークフロー内で変数として呼び出すことができます。
- name: Deploy to Server
env:
SERVER_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
echo "デプロイコマンドをここに実行"
# 例: curlでウェブフックを叩く、SSHでコマンドを送るなど
この仕組みにより、ソースコードが公開されていても、重要なパスワードが流出することを防げます。セキュアなパイプライン構築は、プロフェッショナルな開発現場では必須のスキルとなります。
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. デプロイ結果の通知を受け取る
CI/CDパイプラインが成功したか失敗したかを、毎回GitHubの画面で確認するのは大変です。SlackやDiscordに通知を送る設定を追加すると便利です。GitHub Marketplaceには多くの公式・非公式アクションが公開されており、それらを組み合わせるだけで通知機能を実装できます。エラーが発生した時にすぐに気づける環境を作ることで、開発のサイクルは劇的に改善されます。
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
このように、部品を組み合わせて自分だけのパイプラインを作り上げていく過程は、パズルを解くような楽しさがあります。まずは最小構成から始め、自分のプロジェクトに必要な機能を一つずつ追加していきましょう。自動化が進むほど、あなたはコードを書くという本来のクリエイティブな仕事に集中できるようになります。