Skip to main content

現在、GitHub AE は限定的リリースです。

MavenでのJavaのビルドとテスト

GitHub Actions中で継続的インテグレーション(CI)ワークフローを作成し、MavenでJavaのプロジェクトのビルドとテストを行うことができます。

はじめに

このガイドは、ソフトウェアプロジェクト管理ツールのMavenを使ってJavaのプロジェクトのための継続的インテグレーション(CI)を実行するワークフローを作成する方法を紹介します。 作成するワークフローによって、プルリクエストに対するコミットがデフォルトブランチに対してビルドあるいはテストの失敗を引き起こしたことを見ることができるようになります。このアプローチは、コードが常に健全であることを保証するための役に立ちます。 CI ワークフローを拡張して、ワークフロー実行による成果物をアップロードできます。

必要なソフトウェアをセルフホステッド ランナーにインストールする必要があります。 セルフホステッド ランナーの詳細については、「自分のランナーをホストする」を参照してください。

前提条件

YAMLとGitHub Actionsの構文に馴染んでいる必要があります。 詳細については、次を参照してください。

Java及びMavenフレームワークの基本的な理解をしておくことをおすすめします。 詳細については、Maven ドキュメントの Maven 使用開始ガイドに関するページを参照してください。

Maven スターター ワークフローの使用

GitHub には、ほとんどの Maven ベースの Java プロジェクトで動作する Maven スターター ワークフローが用意されています。 詳細については、「Maven スターター ワークフロー」を参照してください。

素早く始めるには、新しいワークフローを作成するときに事前構成済みの Maven スターター ワークフローを選択できます。 詳しくは、「GitHub Actions のクイックスタート」をご覧ください。

リポジトリの .github/workflows ディレクトリに新しいファイルを作成することにより、手作業でこのワークフローを追加することもできます。

YAML
name: Java CI

ワークフローの名前です。 GitHub では、ワークフローの名前がリポジトリの [アクション] タブに表示されます。name を省略すると、GitHub は、リポジトリのルートに対して相対的なワークフロー ファイル パスを表示します。

on: [push]
jobs:
  build:
    runs-on: ubuntu-latest

このワークフローは、別のオペレーティング システムを使用して実行できます。

スターター ワークフローは、GitHub ホスト ubuntu-latest ランナーを使って Linux 上で実行するジョブを設定します。 runs-on キーを変更すると、別のオペレーティング システムでジョブを実行するようにできます。

たとえば、runs-on: windows-latest を指定すると、GitHub がホストする Windows ランナーを使うことができます。 あるいは、runs-on: macos-latest を使用すると、GitHub がホストする macOS ランナーで実行させることもできます。

Dockerコンテナ上でジョブを実行させたり、独自のインフラストラクチャ上で動作するセルフホストランナーを提供したりすることもできます。 詳しくは、「GitHub Actions のワークフロー構文」を参照してください。

    steps:
      - uses: actions/checkout@v4

このステップでは、actions/checkout アクションで、ランナーにリポジトリのコピーをダウンロードします。

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'

このステップでは、actions/setup-java アクションで、Eclipse Adoptium による Eclipse Temurin (Java) 17 JDK を構成します。

      - name: Build with Maven
        run: mvn --batch-mode --update-snapshots package

The "Build with Maven" step runs the Maven package target in non-interactive mode to ensure that your code builds, tests pass, and a package can be created.

# ワークフローの名前です。 GitHub では、ワークフローの名前がリポジトリの [アクション] タブに表示されます。`name` を省略すると、GitHub は、リポジトリのルートに対して相対的なワークフロー ファイル パスを表示します。
name: Java CI

#
on: [push]
#
jobs:
  build:

    # <!-- This is a YAML comment for use in annotated code examples. -->
    # このワークフローは、別のオペレーティング システムを使用して実行できます。
    #
    # スターター ワークフローは、GitHub ホスト `ubuntu-latest` ランナーを使って Linux 上で実行するジョブを設定します。 `runs-on` キーを変更すると、別のオペレーティング システムでジョブを実行するようにできます。
    #
    # たとえば、`runs-on: windows-latest` を指定すると、GitHub がホストする Windows ランナーを使うことができます。 あるいは、`runs-on: macos-latest` を使用すると、GitHub がホストする macOS ランナーで実行させることもできます。
    #
    # Dockerコンテナ上でジョブを実行させたり、独自のインフラストラクチャ上で動作するセルフホストランナーを提供したりすることもできます。 詳しくは、「[AUTOTITLE](/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idruns-on)」を参照してください。
    runs-on: ubuntu-latest
#
    steps:
      # このステップでは、`actions/checkout` アクションで、ランナーにリポジトリのコピーをダウンロードします。
      - uses: actions/checkout@v4
      # このステップでは、`actions/setup-java` アクションで、Eclipse Adoptium による Eclipse Temurin (Java) 17 JDK を構成します。
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
      # The "Build with Maven" step runs the Maven `package` target in non-interactive mode to ensure that your code builds, tests pass, and a package can be created.
      - name: Build with Maven
        run: mvn --batch-mode --update-snapshots package

既定のスターター ワークフローは、ビルドとテストのワークフローを構築するときに適した出発点であり、プロジェクトの要求に合わせてこのスターター ワークフローをカスタマイズできます。

JVMのバージョンとアーキテクチャの指定

スターター ワークフローで x64 プラットフォーム用の OpenJDK 8 を含むように PATH を設定します。 異なるバージョンの Java を使用する場合、あるいは異なるアーキテクチャ (x64 または x86) をターゲットとする場合、setup-java アクションを使って異なる Java ランタイム環境を選択できます。

たとえば、x64 プラットフォームに対して Adoptium によって提供される JDK のバージョン 11 を使用するには、setup-java アクションを使用して、java-versiondistributionarchitecture パラメーターを '11''temurin'x64 に設定します。

YAML
steps:
  - uses: actions/checkout@v4
  - name: Set up JDK 11 for x64
    uses: actions/setup-java@v3
    with:
      java-version: '11'
      distribution: 'temurin'
      architecture: x64

詳細については、「setup-java アクション」を参照してください。

コードのビルドとテスト

ローカルで使うのと同じコマンドを、コードのビルドとテストに使えます。

スターター ワークフローでは、既定で package ターゲットが実行されます。 デフォルトのMavenの設定では、このコマンドは依存関係をダウンロードし、クラスをビルドし、テストを実行し、たとえばJARファイルのような配布可能なフォーマットにクラスをパッケージします。

プロジェクトのビルドに異なるコマンドを使ったり、異なるターゲットを使いたいのであれば、それらを指定できます。 たとえば、pom-ci.xml ファイルで構成されている verify ターゲットを実行できます。

YAML
steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-java@v3
    with:
      java-version: '17'
      distribution: 'temurin'
  - name: Run the Maven verify phase
    run: mvn --batch-mode --update-snapshots verify

成果物としてのワークフローのデータのパッケージ化

ビルドが成功し、テストがパスした後には、結果のJavaのパッケージをビルドの成果物としてアップロードすることになるかもしれません。 そうすれば、ビルドされたパッケージをワークフローの実行の一部として保存することになり、それらをダウンロードできるようになります。 成果物によって、Pull Requestをマージする前にローカルの環境でテスト及びデバッグしやすくなります。 詳しくは、「ワークフロー データを成果物として保存する」を参照してください。

Maven では、通常、JAR、EAR、WAR のような出力ファイルが target ディレクトリに作成されます。 それらを成果物としてアップロードするために、アップロードする成果物を含む新しいディレクトリにそれらをコピーできます。 たとえば、staging というディレクトリを作成できます。 その後、upload-artifact アクションを使用して、そのディレクトリの内容をアップロードできます。

YAML
steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-java@v3
    with:
      java-version: '17'
      distribution: 'temurin'
  - run: mvn --batch-mode --update-snapshots verify
  - run: mkdir staging && cp target/*.jar staging
  - uses: actions/upload-artifact@v3
    with:
      name: Package
      path: staging