言語ガイド: Java (Maven を使用)
このガイドでは、CircleCI で Maven を使用して Java アプリケーションをビルドする方法について説明します。
概要
下記サンプルアプリケーションを使って CircleCI 2.1 で Java アプリを実行する方法を説明します。 このアプリケーションでは、 Spring PetClinic のサンプルプロジェクトを使用します。 このドキュメントには、ワークスペース、依存関係のキャッシュ、並列実行などの CircleCI のさまざまな機能を示すサンプル設定ファイルの一部が含まれています。
サンプル設定ファイル: バージョン2.1
Orb を使った基本的なビルド
version: 2.1
orbs:
maven: circleci/maven@0.0.12
workflows:
maven_test:
jobs:
- maven/test # checkout, build, test, and upload test results
この設定ファイルでは、言語固有の Orb を使って利用可能な Executor、ビルドツール、コマンドを置き換えています。 ここでは Maven を使った Java プロジェクトのビルドとテストを簡易化する Maven Orb を使用しています。 maven/test コマンドにより、コード、ビルド、テスト、テスト結果のアップロードのチェックアウトを行います。 このコマンドのパラメーターはカスタマイズ可能です。 詳細は、Maven Orb ドキュメントをご覧ください。
バージョン 2.0 の設定 (CircleCI Server v2.x ユーザーにのみ推奨)
version: 2.0
jobs:
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw package
ワークフローを含まない バージョン 2.0 の設定ファイルは build
という名前のジョブを探します。 ジョブは、クリーンな実行環境で実行される一連のコマンドです。 ジョブには Executor とステップという 2 つの主要部分があります。 このサンプルでは Docker Executor を使い、CircleCI イメージでパスしています。
ワークフローを使ったビルドとテスト
ワークフローとは、ジョブの依存関係を示すグラフです。 このベーシックなワークフローではビルドジョブの後にテストジョブを実行します。 テストジョブはビルドジョブが成功して終了しない限り実行されません。
version: 2.0
jobs:
test:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw test
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw -Dmaven.test.skip=true package
workflows:
version: 2
build-then-test:
jobs:
- build
- test:
requires:
- build
依存関係のキャッシュ
下記のコードサンプルでキャッシュの使用に関する詳細をご確認ください。
version: 2.0
jobs:
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "pom.xml" }} # appends cache key with a hash of pom.xml file
- v1-dependencies- # fallback in case previous cache key is not found
- run: ./mvnw -Dmaven.test.skip=true package
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "pom.xml" }}
このビルドは最初は依存関係のキャッシュは行わずに実行され、2 分 14 秒かかりました。 依存関係が復元されると、ビルド時間は 39 秒になりました。
この restore_cache
ステップでは、最初にマッチしたキャッシュを復元します。 復元キーをフォールバックとして追加できます。 この場合、 pom.xml
が変更されても、以前のキャッシュを復元することができます。 つまり、ジョブは新しい pom.xml
と以前のキャッシュの間で変更された依存関係のみをフェッチすれば良いのです。
ワークスーペースへのビルドアーティファクトの維持
下記サンプル設定ファイルで、ワークスペースにビルドアーティファクトを維持する方法の詳細をご確認ください。
version: 2.0
jobs:
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw -Dmaven.test.skip=true package
- persist_to_workspace:
root: ./
paths:
- target/
test:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- attach_workspace:
at: ./target
- run: ./mvnw test
workflows:
version: 2
build-then-test:
jobs:
- build
- test:
requires:
- build
この persist_to_workspace
ステップにより、ワークフローのダウンストリームジョブで使用するファイルやディレクトリを維持することができます。 この場合、ビルドステップによって生成されたターゲットディレクトリは、テストステップで使用するために維持されます。
並列コンテナ間でテストを分割する
version: 2.0
jobs:
test:
parallelism: 2 # parallel containers to split the tests among
docker:
- image: cimg/openjdk:17.0
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: |
./mvnw \
-Dtest=$(for file in $(circleci tests glob "src/test/**/**.java" \
| circleci tests split --split-by=timings); \
do basename $file \
| sed -e "s/.java/,/"; \
done | tr -d '\r\n') \
-e test
- store_test_results: # We use this timing data to optimize the future runs
path: target/surefire-reports
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw -Dmaven.test.skip=true package
workflows:
version: 2
build-then-test:
jobs:
- build
- test:
requires:
- build
タイミングに基づいたテスト分割は、時間のかかるテストを複数の並列コンテナに分ける優れた方法です。 タイミングに基づいたテスト分割には以下の4 つが必要です。
- 分割するテストのリスト
- コマンド:
circleci tests split --split-by=timings
- テストを実行するコンテナ
- テストの分割方法をインテリジェントに決定するための履歴データ
分割するテストのリストの収集には、 circleci tests glob "src/test/**/**.java"
コマンドを使ってすべての Java テストを抽出します。 次に、sed
と tr
を使って、この新しい行で区切られたテストファイルのリストを、テストクラスのカンマ区切りリストに変換します。
store_test_results
を追加すると、CircleCI はこれらのテストの過去の実行におけるタイミングデータ履歴にアクセスできるようになり、全体の実行時間が最速になるようにテストを分割する方法を把握することができます。
コードカバレッジアーティファクトの保存
version: 2.0
jobs:
test:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- run: ./mvnw test verify
- store_artifacts:
path: target/site/jacoco/index.html
workflows:
version: 2
test-with-store-artifacts:
jobs:
- test
JaCoCo プラグインを使った Maven テストランナーでは、ビルドの間にコードカバレッジレポートを生成します。 このレポートをビルドアーティファクトとして保存するには、store_artifacts
ステップを使用します。
設定ファイル
下記のコードサンプルは、上記の機能を組み合わせた全体の設定ファイルです。
version: 2.0
jobs:
test:
parallelism: 2
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "pom.xml" }}
- v1-dependencies-
- attach_workspace:
at: ./target
- run: |
./mvnw \
-Dtest=$(for file in $(circleci tests glob "src/test/**/**.java" \
| circleci tests split --split-by=timings); \
do basename $file \
| sed -e "s/.java/,/"; \
done | tr -d '\r\n') \
-e test verify
- store_test_results:
path: target/surefire-reports
- store_artifacts:
path: target/site/jacoco/index.html
build:
docker:
- image: cimg/openjdk:17.0.1
auth:
username: mydockerhub-user
password: $DOCKERHUB_PASSWORD # context / project UI env-var reference
steps:
- checkout
- restore_cache:
keys:
- v1-dependencies-{{ checksum "pom.xml" }}
- v1-dependencies-
- run: ./mvnw -Dmaven.test.skip=true package
- save_cache:
paths:
- ~/.m2
key: v1-dependencies-{{ checksum "pom.xml" }}
- persist_to_workspace:
root: ./
paths:
- target/
workflows:
version: 2
build-then-test:
jobs:
- build
- test:
requires:
- build
このデモ アプリケーションには、リポジトリの maven
ブランチである https://github.com/CircleCI-Public/circleci-demo-java-spring/tree/maven からアクセスできます。 ご自身でコード全体を確認する場合は、GitHub でプロジェクトをフォークし、ローカル マシンにダウンロードします。 CircleCI の [ Add Projects (プロジェクトの追加)] ページにアクセスし、プロジェクトの横にある [Build Project (プロジェクトのビルド)] ボタンをクリックします。 最後に .circleci/config.yml
の内容をすべて削除します。 完了です。 これで、Maven と Spring を使用する Java アプリケーション用に CircleCI を設定できました。
設定ファイルの詳細
- デプロイの概要に、さまざまなターゲットの設定例へのリンクを掲載しています。
- Java のメモリに関する問題への対処について、詳しくは Java OOM のデバッグ を参照して下さい。
ドキュメントの改善にご協力ください
このガイドは、CircleCI の他のドキュメントと同様にオープンソースであり、 GitHub でご利用いただけます。 ご協力いただき、ありがとうございます。
- このページの編集をご提案ください (最初に「コントリビューションガイド」をご覧ください)。
- ドキュメントの問題点を報告する、またはフィードバックやコメントを送信するには、GitHub で issue を作成してください。
- CircleCI は、ユーザーの皆様の弊社プラットフォームにおけるエクスペリエンスを向上させる方法を常に模索しています。 フィードバックをお寄せいただける場合は、リサーチコミュニティにご参加ください。
サポートが必要ですか
CircleCI のサポートエンジニアによる、サービスに関する問題、請求およびアカウントについての質問への対応、設定の構築に関する問題解決のサポートを行っています。 サポートチケットを送信して、CircleCI のサポートエンジニアにお問い合わせください。日本語でお問い合わせいただけます。
または、 サポートサイト から、サポート記事やコミュニティフォーラム、トレーニングリソースをご覧いただけます。
CircleCI Documentation by CircleCI is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.