GitHub ActionsでJavaプロジェクトのCI/CDを回す

# Java開発環境向け CI/CD構築（実践編）

この記事は、[GitHub ActionsでHello Worldを動かしてみよう！初心者向け入門ガイド](https://qiita.com/yochan__/items/65c1b572cb9d4878bd49) の続編です。

前回の記事では、GitHub Actionsを利用してシンプルなHello Worldのワークフローを構築する方法を解説しました。

今回は、Javaプロジェクトを対象にした実践的なCI/CD（継続的インテグレーションとデプロイ）の設定手順を紹介します。

## 概要

Java開発プロジェクトでは、以下を自動化することが求められます。
GitHub Actionsを活用して処理を実現する方法を段階的に説明します。

- ソースコードのビルド
- テストの実行
- 成果物の生成及びアーティファクト管理
- データベース（MySQL）のセットアップ

## 準備

- Javaプロジェクトのリポジトリ（Gradleをビルドツールとして使用する）
- Docker及びDocker Composeがセットアップされている環境


## GitHub Actionsのワークフロー構築手順

### ワークフロー定義ファイルの作成
.guthub/workflowsディレクトリにci.ymlファイルを作成し、以下を記述する。

```
name: Java CI with Gradle

on:
  pull_request:
  push:
    branches:
      - main

# アクション実行時にリポジトリのコンテンツに対する権限
permissions:
  contents: read

# ワークフロー内のジョブ
jobs:

  # 実行環境と手順を定義
  build:
    name: Create Archive
    runs-on: ubuntu-latest

    # 実行手順
    steps:
      - uses: actions/checkout@v3
      - name: Set up JDK 17 and Gradle 8.1.1
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'adopt'
      - name: Set up Gradle 8.1.1
        run: gradle wrapper --gradle-version 8.1.1

      # MySQLサーバーをdocker composeで起動
      - name: Start MySQL Server
        run: docker-compose up -d

      - name: Build with Gradle
        run: ./gradlew test

      # ユニットテスト結果をGitHubにアップロードする
      # if: always()失敗した時も常に実行する
      - name: Archive unit test results
        uses: actions/upload-artifact@v3
        if: always()
        with:
          name: unit-test-report
          path: build/reports/tests/test
```

## ymlファイルのワークフロー構文

- name:(省略可能)ワークフロー名。GitリポジトリのActionタブに表示される
- on:アクションのトリガー
  - pushやpull_requestでトリガーのタイミングを指定可能
  - branches:トリガー対象のブランチを指定可能
- permissions:アクション実行時のリポジトリコンテンツに対する権限
- jobs:ワークフローファイルで実行されるすべてのジョブをグループ化している
  - build:ジョブの名前。実行環境と手順を定義
  - runs-on:ジョブを実行するマシンの種類を設定(ubuntu-latest：最新のUbuntu環境) 
  - steps:具体的なタスク(手順) 
    - uses:ジョブで指定するリポジトリ
    - run:具体的なシェルで | を使えばパイプライン処理も可能
    - run-name:pushやpull_requestイベントによってトリガーされるワークフローの場合、コミットメッセージとして設定される
    - if:always():失敗した時も毎回実行する


### 解説
ジョブ定義
- buildジョブでCI/CDの主要処理を定義

重要なステップ
- actions/checkout@v3：リポジトリ内容を取得
- actions/setuo-java@v3：指定したバージョンのJDKをセットアップ
- docker-compose up -d：MySQLサーバをコンテナで起動
- ./gradleew build test：Gradleタスクでビルドとテストを実行
- actions/upload-artifact@v3：テスト結果をGitHubに保存

## 成果物確認方法
1. Actionタブを開く
2. 左の一覧よりActionsの左サイドバーから街頭のワークフローを選択
3. workflow runsから実行の名前を選択

![Untitled-2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920283/c3587862-5eb8-9eea-8480-760b4a12ea62.jpeg)


Artifactsの成果物を確認する
1. Actiohsタブを開く
1. 対象のワークフロー実行を選択
1. 右上に表示されるArtifactsセクションをクリックする
![動確.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920283/5eb99f43-c133-f0f2-581d-a38ffe87e44b.jpeg)

### プルリクエストにテスト結果が反映される
- 緑のチェックマーク：全てのテストやジョブが成功した場合、プルリクエスト画面のステータス部分に緑のチェックマークが表示される
- 赤いバツ：テストやジョブのいずれかが失敗した場合、赤いバツが表示される

![66B37578-4EBB-44E4-9260-30B83BE996E4_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920283/8e7daaa4-00c5-11db-4fa3-328c9aa3d40f.jpeg)

プルリクエスト一覧にも表示される
![F929F381-E2C4-4789-8AA4-37DBDDF9CCBE_1_201_a.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920283/e07d1192-cf97-c332-57d7-50ec141ed98d.jpeg)

### 詳細情報へのリンク
![2024-12-21 19.41の画像.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920283/50db6ca6-f065-7303-506e-034ec89653ca.jpeg)

### ダウンロード方法
1. プルリクエストやコミットページからActionsタブを開く
2. 実行されたワークフローを選択
3. 右上のArtifactsセクションでアップロードされたファイル名をクリック
4. ZIPファイルがダウンロードされる

- 保存期間：GitHub Actionsでアップロードされたアーティファクトは、デフォルトで90日間保持される
- テストが失敗した場合でもダウンロード可能：ワークフローの if: always() 条件を使うことで、失敗時でも結果をアップロードできる