Java アプリケーションのビルド、テスト、コンテナ化

このページでは、Cloud Build を使用して Java ベースのアプリケーションのビルド、テスト、コンテナ化を行い、コンテナ イメージを Artifact Registry にアップロードして、ビルドの来歴情報を生成する方法について説明します。

始める前に

  • Java ベースのアプリケーションの作成に精通している必要があります。
  • Dockerfile を含む Java プロジェクトを準備します。
  • Artifact Registry に Docker リポジトリがあるか、新しいリポジトリを作成します。
  • Cloud Build 構成ファイルの作成方法に精通している必要があります。
  • このページで gcloud コマンドを実行するには、Google Cloud CLI をインストールします。

maven または gradle イメージを使用する

Java アプリケーションをビルドするように Cloud Build を構成するには、Docker Hub から取得した maven イメージまたは gradle イメージを使用します。

maven

maven イメージでタスクを実行するには、次のフィールドを使用してビルド構成にステップを追加します。

  • name: このフィールドの値を maven または maven:<tag> に設定します。タグはバージョンを表します。イメージタグを指定しない場合、Cloud Build はデフォルトで latest イメージを使用します。
  • entrypoint: このフィールドを設定すると、name で参照されるイメージのデフォルトのエントリポイントがオーバーライドされます。このフィールドの値を mvn に設定して、ビルドステップのエントリポイントとして mvn を呼び出し、mvn コマンドを実行します。
  • args: ビルドステップの args フィールドは引数のリストを受け取り、name フィールドによって参照されるイメージに渡します。

次のビルドステップでは、3.3-jdk-8 としてタグ付けされた maven イメージの entrypoint を指定し、ビルドツール バージョンを出力します。

steps:
- name: maven:3.3-jdk-8
  entrypoint: mvn
  args: ['--version']

gradle

gradle イメージでタスクを実行するには、次のフィールドを使用してビルド構成にステップを追加します。

  • name: このフィールドの値を gradle または gradle:<tag> に設定します。タグはバージョンを表します。イメージタグを指定しない場合、Cloud Build はデフォルトで latest イメージを使用します。
  • entrypoint: このフィールドを設定すると、name で参照されるイメージのデフォルトのエントリポイントがオーバーライドされます。このフィールドの値を gradle に設定して、ビルドステップのエントリポイントとして gradle を呼び出し、gradle コマンドを実行します。
  • args: ビルドステップの args フィールドは引数のリストを受け取り、name フィールドによって参照されるイメージに渡します。

次のビルドステップでは、5.6.2-jdk8 としてタグ付けされた gradle イメージの entrypoint を指定し、ビルドツール バージョンを出力します。

steps:
- name: gradle:5.6.2-jdk8
  entrypoint: gradle
  args: ['--version']

Java ビルドを構成する

  1. プロジェクトのルート ディレクトリに、cloudbuild.yaml という名前でビルド構成ファイルを作成します。

  2. テストを実行する: mavengradlemaven testgradle test を提供します。これにより、依存関係をダウンロードしてアプリケーションをビルドし、ソースコードで指定されたテストを実行します。ビルドステップの args フィールドは引数のリストを受け取り、name フィールドによって参照されるイメージに渡します。

    ビルド構成ファイルで、args フィールドに test を追加します。これにより、mavengradle 内で test を呼び出します。

    maven

    steps:
    - name: maven:3.3-jdk-8
      entrypoint: mvn
      args: ['test']
    

    gradle

    steps:
    - name: gradle:5.6.2-jdk8
      entrypoint: gradle
      args: ['test']
    
  3. アプリケーションをパッケージ化する: maven イメージでアプリケーションを JAR ファイルにパッケージ化するには、args フィールドに package コマンドを指定します。package コマンドにより、/workspace/target/ に JAR ファイルがビルドされます。

    gradle イメージでアプリケーションを JAR ファイルにパッケージ化するには、args フィールドに assemble コマンドを指定します。assemble コマンドにより、workspace/build/libs に JAR ファイルがビルドされます。

    次のビルドステップでは、Java アプリケーションをパッケージ化します。

    maven

    steps:
    - name: maven:3.3-jdk-8
      entrypoint: mvn
      args: ['package','-Dmaven.test.skip=true']
    

    gradle

    steps:
    - name: gradle:5.6.2-jdk8
      entrypoint: gradle
      args: ['assemble']
    
  4. アプリケーションをコンテナ化する: Cloud Build には、Java アプリケーションのコンテナ化に使用できるビルド済みの Docker イメージがあります。ビルド構成ファイルで Java アプリケーションをコンテナ化するには:

    • name フィールドを追加し、ビルド済み Docker イメージを gcr.io/cloud-builders/docker で指定します。
    • args フィールドを追加して、build 引数(ビルドするコンテナ イメージの名前、ビルド アーティファクトのパスなど)を指定します。
    • images フィールドを追加して、ビルドされたコンテナ イメージを Artifact Registry に push します。
    • 省略可: ビルド構成ファイルの options フィールドに requestedVerifyOption: VERIFIED を追加して、ソフトウェア アーティファクトのためのサプライ チェーン レベル(SLSA)の来歴生成を有効にします。

    次のビルドステップでは、アプリケーションをコンテナ化し、コンテナ イメージを Artifact Registry に push して、ビルドの来歴情報を生成します。

    maven

    steps:
    - name: gcr.io/cloud-builders/docker
      args: ['build', '-t', 'location-docker.pkg.dev/project-id/repository/image', '--build-arg=JAR_FILE=target/build-artifact', '.']
    images: ['location-docker.pkg.dev/project-id/repository/image']
    

    gradle

    steps:
    - name: gcr.io/cloud-builders/docker
      args: ['build', '-t', 'location-docker.pkg.dev/project-id/repository/image', '--build-arg=JAR_FILE=build/libs/build-artifact', '.']
    images: ['location-docker.pkg.dev/project-id/repository/image']
    

    ここで

    • location: リポジトリのリージョンまたはマルチリージョンのロケーション。
    • project-id: Google Cloud プロジェクトの ID。
    • repository: リポジトリ Artifact Registry の名前。
    • image: コンテナ イメージの名前。
    • build-artifact: ビルドステップで作成された JAR ファイルの名前。
  5. ビルドを開始する: ビルド構成ファイルを準備したら、ターミナルで次のコマンドを入力してビルドを開始します。

    gcloud builds submit --region=REGION --config config-file-path source-directory
    

    ここで

    • config-file-path: ビルド構成ファイルへのパス。この例では、ビルド構成ファイルの名前は cloudbuild.yaml です。
    • source-directory: ソースコードのパスまたは URL。
    • REGION: サポートされているビルド リージョンの 1 つ。

    gcloud builds submit コマンドに config-file-pathsource-directory を指定しないと、Cloud Build は、構成ファイルとソースコードが現在の作業ディレクトリにあることを前提とします。

    ビルドが完了すると、Artifact Registry でリポジトリの詳細を表示できます。

    ビルドの来歴メタデータを表示したり、来歴を検証したりすることもできます。

コードの例

以下では、Java アプリのビルドに使用できるサンプル リポジトリを紹介します。各リポジトリには、サンプル アプリケーションと、このアプリケーションのビルドとテストに使用するビルド構成ファイルが含まれています。

  • maven-example: Java アプリと、mvn でアプリのビルドとテストを行うためのサンプルのビルド構成ファイル。
  • gradle-example: Java アプリと、gradle でアプリのビルドとテストを行うためのサンプルのビルド構成ファイル。

次のステップ