7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

  • 記事の目的
    「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からダウンロード可能にする
      → デプロイやローカル実行に使える

ワークフロー定義(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.jar
      • greeting-service/scripts/GreetingService.bat
    • 実行結果ページからダウンロード可能(手順は後述)

実行手順

実際にワークフローを実行し、アプリを動作してみましょう。
ワークフローを実行するには、サンプルリポジトリをForkし、Actionsを有効化してください。有効化の手順については、リポジトリのREADMEも参照してください。

ワークフローの実行

  1. リポジトリの「Actions」タブを開く

  2. 「CI/CD Starter for GreetingService」ワークフローを選択

  3. 「Run workflow」プルダウンから、実行したいブランチを選択

  4. 「Run workflow」ボタン押下

  5. 緑のチェックが付いたら成功

    RunWorkflow.png

ローカルでの実行方法

  1. 実行結果ページからgreeting-service-artifactsをダウンロード
    DownloadArtifact.png

  2. zipを解凍し、scripts/GreetingService.batを実行
    ExecSample.png


まとめと今後の展望

GitHubリポジトリにymlファイルを追加するだけで、ビルドとテスト、そして成果物の取得までを自動化できることがわかってもらえたでしょうか。
(繰り返しになりますが、本記事の「デプロイ」は、正確にはデプロイの前段階である「Artifactsへのアップロード」までを扱っています。)

この程度の規模のプロジェクトであれば、ymlファイルもシンプルで読みやすく、導入のハードルもそこまで高くないはずです。
応用編として、以下のようなこともしたくなってきますが、それはまたの機会に…

  • Jobの並列化によるテスト高速化
  • Secretsを用いた機密情報の暗号化
  • 外部ツールを使った、テストカバレッジや静的解析の追加
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?