Java のベスト プラクティス

アプリケーションを最新の状態に保つことは、重要かつ困難になっています。このドキュメントでは、Java デベロッパーが DevOps の使用を開始するときの基本的な手順について説明します。完全なリストではありません。これらのアイデアのほとんどは、DORA DevOps の調査と評価研究から得られたもので、ベスト プラクティスの詳細が紹介されています。その他のソースには、Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology OrganizationsNicole Forsgren PhD、Jez Humble、Gene Kim)、Google のソフトウェア エンジニアリングTitus Winds、Tom Manshreck、Hyrum Wright がキュレーショ担当)があります。

このページをお読みいただく前に、Java 開発環境の設定をご覧ください。

どの開発組織もニーズは異なりますが、基本的なシステムは次のいずれかの技術スタックを使用して構築できます。

技術スタックのサンプル 1 技術スタックの例 2
  • ソースコードに Cloud Source Repositories、GitHub、Bitbucket。
  • アーティファクトとライブラリを最新の状態に保つ Whitesource RenovateBot。
  • 単体テスト / 送信前テスト用の Cloud Build
  • 統合テスト用の Cloud Build
  • デプロイ用の Cloud Build
  • ソースコードに GitHub。
  • アーティファクトとライブラリを最新の状態に保つ GitHub Dependabot。
  • 送信前テスト用の GitHub アクション
  • 統合テスト用の GitHub Actions
  • GitHub アクションのデプロイ

これらのコンポーネントで構成されている単純なシステムにより、品質とサイクル時間を改善できます。また、最新のバグ修正やセキュリティの更新を使用して、コードを常に最新の状態に保つこともできます。

バージョン管理

調査(17 ページ14 ページ31 ページ60 ページ)では、ソースコードのバージョン管理と自動化およびテストを組み合わせることで、品質の向上など多くのメリットが得られることが判明しています。

GitHubGitlabBitbucket もソースコードに適しています。

自動テスト

成功には、これらの手法のほとんどを使用した継続的なテストが不可欠な場合があります。テストのベスト プラクティスについては、SRE Book の信頼性テストの章Google Testing ブログをご覧ください。

Java デベロッパーが特に重視するのは、自動化された単体テストと統合テストです。JUnitTesting with SpringApache Maven SurefireGradle Java テストは、Java デベロッパーに有用なリソースです。

継続的インテグレーション / デプロイの自動化

継続的インテグレーションデプロイの自動化により、最新の DevOps ジョブを実行できます。ビルド、テスト、デプロイ

  • Cloud Build の [クイックスタート]、[Java Specific]、[デブロイ]、[トリガー] では、無料(1 日あたり 120 ビルド分)または低コストで簡単に使用できるビルドシステムが提供され、ほとんどのジョブで簡単にカスタマイズできます。す。
  • Tekton はオープンソース プロジェクトで、Cloud Build のアイデアをシステムに簡単に適応させることができます。
  • Spinnaker は、複数のクラウド プロバイダに対応するオープンソースの継続的デリバリー プラットフォームです。ソフトウェアの変更を超高速かつ高い信頼性でリリースできます。複雑なソフトウェア システムをリリースしてロールバックするプロセスの管理に役立ちます。
  • GitHub の Actions は、テストのセットアップと GitHub でのテストを簡単に実行できるサードパーティのソリューションです。
  • GitlabCircle CITravis CI など、この他にも多くのソリューションがあります。

Cloud クライアント ライブラリ

Google サービスはさまざまな方法で使用できますが、Cloud クライアント ライブラリのページに記載されている方法を使用することをおすすめします。Java の場合、Libraries-BOM を使用すると、アーティファクトごとに互換性のあるバージョンを使用できます。

クライアント ライブラリの独自のバージョンを選択すると、互換性のないアーティファクトが選択される可能性があります。これは、ダイヤモンド依存関係の問題として知られています。個別のライブラリを選択する必要がある場合は、ライブラリを一度に 1 つずつ更新して、更新でエラーが発生したかどうかを確認します。最新バージョンは、このページに記載されています。また、Maven-Central で検索することもできます。

依存関係を最新の状態に保つ

悪意のある人物から保護するには、依存関係を最新の状態に保つことが重要です。そのために役立つサードパーティのツールが数多くあります。

これらのツールを正しく構成することで、依存関係を最新の状態に維持できます。自動テスト継続的インテグレーション / 継続的デプロイを組み合わせると、フローは次のようになります。

  • 依存関係の自動化によって、ソース管理の変更を提案します。
  • 継続的なビルドシステムにより、変更がビルドおよびテストされます。
  • 人間が提案を確認し承認することで、変更が承認されます(場合により他の変更と一緒に承認されます)。
  • 変更が承認されると、継続的デリバリー システムに提案が行われ、コードが本番環境にリリースされます。(またはカスタム プロセスに従います)。

サポートされている Java Runtime Environment(JRE)を使用する

Java 開発キットのサブセットである JRE は、オペレーティング システムの上位にあり、Java アプリケーションの実行に必要なソフトウェアとリソースを提供します。ほとんどのユーザーは、本番環境で最新の LTS バージョンを使用して、アップデート、セキュリティ、バグの修正を利用できるようにしています。通常、コードを以前の JDK に対してコンパイルした場合でも、新しい JRE にアップデートできます。

複数の JDK バージョンを使用する場合、SDKMAN! を使用すると、異なる JDK バージョンを使用、管理できます。

コンテナの使用(Google Kubernetes Engine、Cloud Run、Anthos クラスタ)

RenovateBot または DependaBot で Docker コンテナを使用している場合、bot は JRE と JDK の更新を定期的に提案します。JDK と JRE を同じバージョンのままにすることをおすすめします。

通常は、Jib を使用して Java アプリケーションをコンテナ化することをおすすめします。

Dockerfile を手動で更新する場合は、JRE を latest に変更して再構築するだけです。

Compute Engine を使用する

この場合はアプリケーション固有のものが多くなります。起動スクリプトを使用することをおすすめします。アップグレードするには、スクリプトを更新する必要があります。

App Engine フレキシブル環境

Java 8 のみサポート

App Engine スタンダード

Java 8 から Java 11 への App Engine アプリの移行

Java 開発キットの LTS バージョンを使用する

JDK は、Java アプリケーションを開発するための一連のツールです。新しい言語機能が特定の JDK に関連付けられています。長期サポート(LTS)中の JDK に使用を固定し、アプリケーションに適していると判断される場合は次の LTS バージョンにアップグレードすることをおすすめします。固定されたメジャー LTS リリースの最新のマイナー リリースを使用することをおすすめします。

ほとんどのユーザーは JDK と JRE の同期を維持する必要があります。時には同期できずに(たとえば、JDK のサポート期限切れなど)、新しい JDK でコンパイルしたアプリケーションを前の JRE で実行しなければならない場合も発生します。

Maven でこれを行うには:

コードを記述する言語レベルとターゲット JRE を設定します。pom.xml ファイルを次のように更新します(Java 8 の場合)。xml <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target>

Java 11 に更新するには、次のように変更します。

    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>

Gradle を使用している場合は、Java 8 の build.gradle ファイルを次のコマンドで更新します。

compileJava {
  sourceCompatibility = 1.8
  targetCompatibility = 1.8
}

Java 11 の場合:

compileJava {
  sourceCompatibility = 11
  targetCompatibility = 11
}

Java 8 以前のバージョンには 1. 接頭辞(Java 7 では 1.7、Java 8 では 1.8)が付いていましたが、Java 8 の後からは削除されましたのでご注意ください。