はじめに
-
記事の目的
「CI/CDってよく聞くけど、何から始めればいいの?」という方に向けて、最小構成でGitHub Actionsを使ったCI/CDを体験することを目的とします。
複雑な設定や外部サービス連携は一切なし。Java + Mavenプロジェクトをビルドして成果物を取得するところまでをゴールにします。 -
対象読者
- GitHub Actionsを触ったことがない方
- JavaプロジェクトでCI/CDを試してみたい方
- 「まずは動くものを作りたい」エンジニアの方
-
使用技術
- Java 21
- Maven
- GitHub Actions
-
サンプルリポジトリ
本記事で使用するサンプルコードは以下のGitHubリポジトリに公開しています:
GitHubリポジトリはこちら
CI/CDとは?
-
CI (継続的インテグレーション)
ビルドとテストを自動化して、リポジトリをきれいな状態に保とう!という手法。 -
CD (継続的デリバリー)
CIでビルドした成果物を、さらに自動でデプロイしよう!という手法。 -
補足
本記事では「デプロイ」という言葉を使っていますが、正確にはデプロイの前段階である「成果物の取得」までを扱います。
実際にデプロイするには、デプロイ先の環境(サーバーなど)の準備が必要となり本記事の趣旨から外れてしまうため、スコープ外とします。
ただし、Artifactsをダウンロードしてローカルで実行できる状態になることは、デプロイの概念を簡易的に体験することに近いと考えています。
GitHub Actionsとは?
「GitHubが提供する、CI/CDを簡単に実行するためのサービス」です。
すでにGitHubリポジトリを使って開発している人は、.github/workflowsにワークフロー(=CI/CDを実行するプロセスのこと)を定義するymlファイルを置くだけで簡単に導入できます。今回、初めて触ったのですが、導入のハードルが低くて驚きました。
サンプルアプリケーションの概要
-
GreetingServiceについて
- サンプルはシンプルなJavaコンソールアプリです。入力した名前に対して「Hello, 名前!」を返すだけの機能を持っています。
- 構成はシンプルですが、ユニットテストはしっかり用意しています!
。テストクラスを用意し、CIでテスト結果を確認できるところもみられるようにしています。 - また、起動バッチ
scripts/GreetingService.batも用意しました。この方が、「mainにpushするだけで、勝手にアプリが出来上がった!」という喜びを体験できるかなと思い用意しました。
-
ディレクトリ構成
greeting-service/
├── .github/workflows/ci_cd_starter.yml
├── src/
│ ├── main/java/com/example/
│ │ ├ GreetingService.java
│ │ └ GreetingServiceMain.java
│ │
│ └── test/java/com/example/
│ └ GreetingServiceTest.java
│
├── scripts/GreetingService.bat
└── pom.xml
最小構成のCI/CD設計
-
CIの目的と内容
- コードをビルドできるか確認
- 単体テストを実行
→ コード変更によって既存の機能が壊れていないことを確認できる状態を作る
→ これにより、開発者は「テストが通っている=品質が担保されている」と判断し、安心してコードをpushできる
-
CDの目的と内容
- ビルド成果物(JARファイル)をGitHub Actionsからダウンロード可能にする
→ デプロイやローカル実行に使える
- ビルド成果物(JARファイル)をGitHub Actionsからダウンロード可能にする
ワークフロー定義(ci_cd_starter.yml)
それではいよいよ、実際のymlファイルを見ながら、何を実施するのかを見てみましょう。
name: CI/CD Starter for GreetingService
on:
push:
branches: [ "main", "release" ]
pull_request:
branches: [ "main" ]
workflow_dispatch:
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up JDK 21
uses: actions/setup-java@v4
with:
distribution: 'temurin'
java-version: '21'
- name: Build and test with Maven
run: mvn clean install
working-directory: greeting-service
- name: Upload JAR and BAT as artifact
uses: actions/upload-artifact@v4
with:
name: greeting-service-artifacts
path: |
greeting-service/target/greeting-service.jar
greeting-service/scripts/GreetingService.bat
ポイント解説
トリガー設定
- push: mainやreleaseブランチへのpushで実行
- pull_request: PR作成や更新時に実行
- workflow_dispatch: Actionsタブ(後述の「実行手順」参照)から手動実行可能(「Run workflow」ボタン)
実行環境
- runs-on: ubuntu-latest
- GitHubが提供するUbuntu環境で実行
主要ステップ
- Checkout
- actions/checkout@v4でリポジトリのコードを取得
- Javaセットアップ
- actions/setup-java@v4でJDK 21をインストール(最新LTS)
- → mvnコマンドの実行に使用
- Mavenビルド&テスト
- mvn clean installでビルド+単体テストを実行
- ※working-directoryで作業ディレクトリを指定
- Artifactsアップロード
- 下記の2つのファイルを
greeting-service-artifacts.zipに圧縮してアップロードgreeting-service/target/greeting-service.jargreeting-service/scripts/GreetingService.bat
- 実行結果ページからダウンロード可能(手順は後述)
- 下記の2つのファイルを
実行手順
実際にワークフローを実行し、アプリを動作してみましょう。
ワークフローを実行するには、サンプルリポジトリをForkし、Actionsを有効化してください。有効化の手順については、リポジトリのREADMEも参照してください。
ワークフローの実行
-
リポジトリの「Actions」タブを開く
-
「CI/CD Starter for GreetingService」ワークフローを選択
-
「Run workflow」プルダウンから、実行したいブランチを選択
-
「Run workflow」ボタン押下
-
緑のチェックが付いたら成功
ローカルでの実行方法
まとめと今後の展望
GitHubリポジトリにymlファイルを追加するだけで、ビルドとテスト、そして成果物の取得までを自動化できることがわかってもらえたでしょうか。
(繰り返しになりますが、本記事の「デプロイ」は、正確にはデプロイの前段階である「Artifactsへのアップロード」までを扱っています。)
この程度の規模のプロジェクトであれば、ymlファイルもシンプルで読みやすく、導入のハードルもそこまで高くないはずです。
応用編として、以下のようなこともしたくなってきますが、それはまたの機会に…
- Jobの並列化によるテスト高速化
- Secretsを用いた機密情報の暗号化
- 外部ツールを使った、テストカバレッジや静的解析の追加


