Java 最佳做法

使应用保持最新状态变得困难重重。本文档介绍了 Java 开发者开始使用 DevOps 做法的一些基本步骤。但并不仅限于此。其中大多数思路均来自 DORA DevOps 研究和评估研究,旨在更全面地介绍最佳做法。其他来源包括 Accelerate: The Science of Lean Software and DevOps: Building and Scaling High Performing Technology Organizations,作者 Nicole Forsgren PhD、Jez HumbleGene Kim;以及 Google 的软件工程,由 Titus Winters、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 一书的可靠性测试Google 测试博客

Java 开发者主要关注自动化单元测试和集成测试。JUnit使用 Spring 进行测试Apache Maven Surefire 以及 Gradle Java 测试 是 Java 开发者的有用资源。

持续集成 / 部署自动化

持续集成部署自动化为现代 DevOps 作业提供支持。构建、测试和部署。

  • Cloud Build [快速入门] [Java 专用] [部署] [触发因素] 提供免费(120 个构建分钟/天)或低成本、易于使用的构建系统,可轻松自定义大多数作业。
  • Tekton 是一个开源项目,可让您轻松地根据系统调整 Cloud Build 理念。
  • Spinnaker 是一种开源、多云端持续交付平台,可帮助您快速、可靠地发布软件变更。它可以帮助您管理发布和回滚复杂软件系统的过程。
  • GitHub 的操作是一个第三方解决方案,可让您轻松地设置并在 GitHub 上运行它们。
  • 此外,还有许多其他解决方案,例如 GitlabCircle CITravis CI

Cloud 客户端库

您可以通过多种方式使用 Google 服务,但首选方法是按照 Cloud 客户端库页面上的说明执行操作。在 Java 中,Libraries-BOM 有助于确保您使用每个工件的兼容版本。

如果您选择使用自己的版本,则系统可能会选择不兼容的工件。这就是所谓的 mond 形依赖项问题。如果您仍然必须选择个别库,请一次更新一个库,并测试更新是否引入了错误。此页面上始终会列出最新版本,也可以通过搜索 Maven-Central 找到最新版本。

使依赖项保持最新

为了防止恶意操作者,请务必及时更新您的依赖项。有许多第三方工具可以帮助您:

这些工具(如果配置正确)可帮助您确保依赖项保持最新。当您结合使用自动测试持续集成/持续部署时,流程会变为:

  • 依赖项自动化功能建议您更改源代码控制系统。
  • 持续构建系统构建和测试更改。
  • 人工审核该提案,并在可接受的情况下接受该更改,以及其他更改。
  • 系统接受更改后,系统便会向“持续交付”系统提出一项建议,以将该代码发布为正式版。(或按照自定义流程操作)。

使用受支持的 Java 运行时环境 (JRE)

JRE 是 Java 开发套件的子集,位于操作系统之上,并提供运行 Java 应用所需的软件和资源。大多数用户更倾向于在生产环境中使用最新的 LTS 版本,以便他们可以访问更新、安全性和问题修复。即使您的代码是针对旧版 JDK 编译的,通常也可以更新到更高版本的 JRE。

如果您使用多个 JDK 版本,SDKMAN! 可以帮助您使用和管理不同的 JDK 版本。

使用容器(Google Kubernetes Engine、Cloud Run、Anthos 集群)

如果您将 Docker 容器与 ReovateBot 或 DependaBot 搭配使用,则该聊天机器人会定期提议您的 JRE 和 JDK 的更新 - 您需要保持 JDK 和 JRE 的版本相同。

在大多数情况下,我们建议您使用 Jib 将 Java 应用容器化。

如果您手动更新 Dockerfile,只需将 JRE 更改为最新版本并重新构建即可。

使用 Compute Engine

这往往非常特定于应用。我们建议使用启动脚本。如需升级,您应更新脚本。

App Engine 柔性环境

支持 Java 8

App Engine 标准

请参阅将 App Engine 应用从 Java 8 迁移到 Java 11

使用 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 之后被丢弃。