当前位置:Java -> 将CI/CD应用于使用Spring Boot的Java应用程序

将CI/CD应用于使用Spring Boot的Java应用程序

持续集成/持续交付(CI/CD)是现代软件开发的关键方面,它为开发生命周期带来了效率、可靠性和速度。CI/CD使开发人员能够自动化软件的构建、测试和部署,确保变更平稳一致地集成。在基于Spring Boot的Java应用程序的背景下,CI/CD变得更加关键。Spring Boot提倡约定优于配置的范式,使得创建独立的、生产级别的基于Spring的应用程序变得轻而易举。通过整合CI/CD实践,与Spring Boot合作的开发人员可以优化部署流水线,在开发过程的早期发现错误,并以更快的发布周期交付高质量、可靠的软件。

本教程将引导读者在Spring Boot的背景下实现CI/CD,使他们能够优化开发工作流程,以更高效地交付坚固的Java应用程序。

我非常兴奋地分享我在Spring Boot的Java应用程序中构建持续集成/持续交付(CI/CD)的经验。首先,让我们确立这个教程中将学到的一切:

  1. 使用Spring Initializr创建一个Spring Boot Java应用程序。
  2. 创建一个GitHub存储库。
  3. 使用Travis CIDocker实现CI/CD。
  4. 添加Codecov来提供代码覆盖率。
  5. 使用SonarCloud编写最佳代码。
  6. 使用GitHub site-maven-plugin构建项目站点。
  7. 使用Herokuheroku-maven-plugin部署应用程序。
  8. 管理话题。

逐步地,我们将在README.md文件中添加徽章,以便我们可以实时通知关于Travis CIDockerCodecovSonarCloud状态。另外,我们还将添加许可证徽章。

你准备好了吗?如果没有,花些时间更好地理解或准备好自己,然后稍后继续阅读。代码可以在这里找到。所以只需进行分支,它就全是你的了!

如何将持续集成/持续交付(CI/CD)应用到Spring Boot的Java应用程序中

第1步:使用Spring Initializr创建Spring Boot Java应用程序

在这个项目中,我使用了Spring Tool Suite 4(STS 4)集成开发环境;你可以自由地选择适合这个项目的任何工具。STS 4内置了Spring Initializr,所以我选择了这个项目。

这是STS 4深色主题的样子:

STS 4 - Home


点击File -> New -> Spring Starter Project。

你将看到:

STS 4 - Form


请填写以下表单:

  • 名称:cicd-applied-to-spring-boot-java-app
  • 组:com.cicd
  • artifact:cicd-applied-to-spring-boot-java-app
  • 描述:在Spring Boot Java应用程序上实现CI/CD
  • 包:com.cicd.cicd-applied-to-spring-boot-java-app

默认情况下:

  • 类型:Maven
  • 打包:jar
  • Java版本:8
  • 语言:Java

然后,你将看到:

STS 4 - Form completed


接下来,点击Next。

点击Spring Web

STS 4 - Spring Web


点击Finish。新项目将出现:

STS 4 - New project finally created


接下来,请打开CicdAppliedToSpringBootJavaAppApplication.java文件。

我们可以添加一个基本的端点:

STS 4 - CicdAppliedToSpringBootJavaAppApplication edited


右键单击 -> Run As -> Maven build:

STS 4 - Maven build


然后您将收到:

STS 4 - Edit configuration


Goals -> spring-boot:run:

STS 4 - Goals


点击 Run:

STS 4 - Run


STS 4 - Final result


步骤2:创建GitHub仓库

GitHub - Home


New" 或点击此处。然后您将被引导至此处:

GitHub - New repository


  • Repository name: cicd-applied-to-spring-boot-java-app(我选择与第一步的artifact字段设置相同的名称)
  • Description: 在Spring Boot Java应用上实现持续集成/持续交付 
  • 点击Public。
  • 点击 Initialize this repository with a README
  • 选择 MIT 许可证。
如何选择开源许可证 和开源许可证的工作原理及如何将其添加到您的项目中.gitignore 文件。 Create repository:

GitHub - Repository form completed


GitHub - New repository


RESEARCHES.md 的文件。为什么呢?在项目开发过程中,您可能会遇到困难,需要寻求帮助。旨在在解决问题或修复错误时节省时间。 Create new file. 然后,将名称字段填写为 RESEARCHES.md 并编辑文件如下。CI/CD 是研究的一个例子,链接代表结果。"##"使文本加粗。

GitHub - RESEARCHES.md


Commit new file" :

GitHub - Commit new file


GitHub - RESEARCHES.md is created


现在,请安装 Git Git 安装 可在此处找到)和 GitHub Desktop GitHub Desktop 安装 可在此处找到)。

安装这两个工具后,现在是时候克隆我们在第一步中开始的项目了。

打开 GitHub Desktop 并选择我们之前创建的存储库如下:

点击 File -> 克隆存储库...

GitHub - Desktop克隆存储库


您将收到此弹出窗口:

GitHub - Desktop弹出窗口


只需在搜索栏中填写 " cicd ;" 您将在结果中找到存储库: " cicd-applied-to-spring-boot-java-app ":

GitHub - Desktop搜索栏


选择存储库并点击 克隆

GitHub - repository selected


GitHub Desktop正在克隆存储库:

GitHub - Cloning repository


存储库已经被克隆:

GitHub - Repository already cloned


此时,打开存储库文件夹。这是我的路径。

我的存储库文件夹包含三个文件: LICENSE README.md RESEARCHES.md 如下所示:

GitHub - 存储库文件夹


是时候打开保存代码的文件夹了:

GitHub - STS 4项目文件夹


从代码文件夹中复制内容并粘贴到存储库文件夹中。存储库文件夹如下所示:

Github - 存储库文件夹更改1


忽略文件和文件夹是很重要的。在项目中,我们不会直接修改这些文件。为此,我们将对存储库文件夹中的 .gitignore 文件进行一些更改。我使用了 Sublime Text 来编辑该文件。

在进行任何更改之前,它应该如下所示:

GitHub - .gitignore before


进行更改后,它应该如下所示。

首先,添加: .gitignore 。它应该看起来像:

GitHub - .gitignore after


现在,这是 GitHub Desktop 上存储库文件夹的样子:

GitHub - 5个更改后的文件


在总结字段中填写 " 首次上传 " 并点击 " 提交到主分支 ":

GitHub - 首次上传


下一步呢?点击 推送原点

GitHub - 在推送到 origin 之前


仓库现在在 GitHub 上是最新的:

GitHub - 最新


第三步:使用 Travis CI 和 Docker 实现 CI/CD

注意:如果你对这两个工具不熟悉,可以查看这个Travis CI 教程Docker 入门教程来帮助你入门。

使用 GitHub 注册或登录,并确保 Travis CI 可以访问你的仓库。然后,创建一个名为 .travis.yml 的文件,其中包含 Travis CI 将要遵循的指令:

首先,我得到了这个:

Travis - 创建 .travis.yml 1


然后,点击 .travis.yml 文件:

Travis - 创建 .travis.yml 2


这是 Travis CI 上的仓库:

Travis - 首次构建通过


现在,我们将添加一个 Travis CI 徽章,以便收到有关更改等的通知。

要编辑 README.md 文件,请点击铅笔图标:

Travis - 点击铅笔图标


我们会得到这个页面:

Travis - 打开 README.md


添加以下文本,但用你的 Travis CI 用户名 替换 "FanJups":

Travis - 添加 Travis 构建状态


然后,添加提交描述 "添加 Travis CI 徽章" 并点击 提交更改 按钮:

Travis - 添加徽章提交描述


然后,我们得到:

Travis - 徽章已添加


重要的是要知道,每次您进行更改,Travis CI 都会触发构建并发送电子邮件。这是一个持续的过程:

Travis - 与添加徽章相关的构建


我们成功添加了 Travis CI 及其徽章。接下来,我们将专注于 Docker。

首先,在 Docker Hub 上注册或登录:

Docker - Docker Hub 主页


点击 创建仓库 按钮:

Docker - 创建仓库页面


按照以下方式填写表单:

  • Name: cicd-applied-to-spring-boot-java-app (GitHub仓库名称)
  • Description: 在Spring Boot Java应用上实现持续集成/持续交付 (GitHub仓库描述)
  • Visibility: 选择 Public
  • Build Settings: 选择 GitHub

点击 Create 按钮后:

Docker - Repository already created


现在是时候将我们的Docker仓库与GitHub仓库链接起来。点击 Builds

Docker - Builds


然后,点击 Link to GitHub

Docker - Link source providers


选择你的GitHub仓库:

Docker - Selecting GitHub Repository


现在GitHub仓库已经被选中,我们需要进行一些更改:

  • Autotest: 选择 Internal and External Pull Requests
  • Repository links: 选择 Enable for Base Image

Docker - Configuring builds 1


Docker - Configuring builds 2


点击 Save

Docker - Github is now linked to Docker


我们成功地将GitHub仓库链接到Docker仓库。如果您需要有关Docker构建的帮助,这个链接 很有用。

接下来是什么?首先,我们将安装Docker。然后我们将对代码和Travis CI进行一些更改。

要安装Docker,请前往Docker的入门页面,选择 Docker for Developers,然后点击 Download Desktop and Take a Tutorial

Docker - Download Desktop


为了确保您已安装Docker并验证它正常运行,请打开您的命令行并输入“docker”。然后验证:

Docker - Command Line


现在,回到您的IDE或文本编辑器;我们将对代码进行一些更改。

创建一个名为“Dockerfile”的文件。总结到目前为止,当创建Docker镜像时,Dockerfile非常有用。为了更好地理解这个文件的目的,这个Dockerfile参考 将对您有所帮助。

为了使事情简单,我使用了这个Callicoder Dockerfile示例 并进行了一些小更改。这是Dockerfile的样子:

接下来,这是使用STS 4创建进程的Dockerfile。

选择项目,然后点击 New -> File.

在文件名字段中填写“Dockerfile”,然后点击Finish按钮:

Docker - Dockerfile 2


复制并粘贴之前呈现的Dockerfile内容:

Docker - Dockerfile is ready


在对pom.xml进行一些更改之前,让我们看看实际内容。

我们添加Spotify的dockerfile-maven-plugin 来将项目推送到Docker Hub。

此外,我们按照之前的一篇文章《使用Spring Boot和Docker入门》的说明,添加了maven-dependency-plugin,其中提到:

"... 为了确保在创建Docker镜像之前解压jar包,我们为依赖项插件添加了一些配置。" 

接下来,我们将在GitHub存储库中将Travis CI链接到Docker。

你还记得你的Docker用户名和密码吗?好吧,你必须记住这些信息才能继续。我们将在Travis CI中创建两个环境变量。

要到达这里,只需将此链接(https://travis-ci.com/GITHUBUSERNAME/cicd-applied-to-spring-boot-java-app)复制并粘贴到你的浏览器中。但是请用你正确的用户名替换GITHUBUSERNAME,或者点击README.md中的Travis CI徽章:

Travis CI-Docker - Travis CI Badge


Travis CI-Docker - Travis CI repository


点击More options -> Settings:

Travis CI-Docker - Travis CI Settings


Travis CI-Docker - Travis CI Environment variables


填写表单如下:

  • Name: DOCKER_PASSWORD
  • Value: yourdockerpassword
  • 点击 Add 按钮
  • Name: DOCKER_USERNAME
  • Value: yourdockerusername

点击 Add 按钮:

Travis CI-Docker - Docker environment variables added


"mvn deploy" ,Spotify中有详细说明。Apache Maven项目解释了Apache Maven Deploy Plugin的作用,即作为一个用于"将构件添加到远程存储库"的插件。DZone此前曾介绍过如何使用管道或Maven任务发布Maven构件当我们调用部署阶段时,我们必须在POM中包含一个有效的<distributionManagement/>部分。但这不是这里的用途。因此,我们将在pom.xml中添加这个属性: 
<maven.deploy.skip>true</maven.deploy.skip>


[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy) on project cicd-applied-to-spring-boot-java-app: Deployment failed: repository element was not specified in the POM inside distributionManagement element or in -DaltDeploymentRepository=id::layout::url parameter -> [Help 1]


.travis.yml并将其推送到GitHub:

Travis CI-Docker - Updating .travis.yml


提交描述:“Linking Travis CI to Docker”。

Travis CI-Docker - red cross


Travis CI-Docker - Red Travis CI badge faiilure


"mvn deploy"命令退出,状态为1。

Travis CI-Docker - mvn deploy failed


Shields.io。

在搜索栏中,输入"docker.",然后,我们将获取以下结果:

Travis CI-Docker - Shields.io 1


点击Docker Cloud Build Status

Travis CI-Docker - Shields.io 2


如果我告诉你我们这里也会出现错误会怎么样?

算了 - 只需填写以下表格:

Travis CI-Docker - Docker Build inaccessible


点击复制徽章URL

现在,回到GitHub仓库并编辑README.md。我们将添加以下Docker徽章:

Travis CI-Docker - Adding Docker badge


提交描述:“添加Docker徽章”:

Travis CI-Docker - Adding Docker badge commit description


我们都是赢家。所以让我们把它做对!

之前,我们在pom.xml上进行了更改并创建了一个Dockerfile。

所有这些错误都是由于Maven不知道如何处理Docker上的部署以及缺少Dockerfile,因此无法推送镜像。

是时候将这些更改(Dockerfilepom.xml)通过GitHub Desktop推送到GitHub了:

Travis CI-Docker -让我们做对


现在,我们有两个丑陋的绿色徽章代表成功!开玩笑!那太美妙了。

Travis CI - Docker - 成功


为了确保,检查您的电子邮件。您应该收到两封电子邮件:一封来自Travis CI,另一封来自Docker。

在继续到第三步之前,我们将仅运行应用程序而不使用Docker。只需记住用您自己的Docker Hub用户名替换"fanjups":

Travis CI - Docker - 运行Docker Image


我得到了以下错误:“无效或损坏的jar文件/app.jar。”问题出在编码,所以我将在pom.xml中添加这两个属性。 

现在是时候在GitHub上提交了。如果您对编写有用的提交消息感到困惑,DZone已经在过去涵盖过了这个主题。

在再次运行应用程序之前,重要的是使用docker ps列出所有容器。

然后检查“CONTAINER ID”,停止(docker stop“CONTAINER ID”),并删除它(docker rm“CONTAINER ID”),因为它是持续存在的,正如这篇关于Spring Boot with Docker的帖子所解释的那样。

然后,我们将再次运行应用程序以确保一切都正常:

Travis CI - Docker - 成功运行Docker Image 1


Travis CI - Docker - 成功运行Docker Image 2


解决了这个问题时,我感到非常高兴!

核心步骤现在已经结束。我们已成功实现了CI/CD。现在,让我们添加一些有用的工具! 

第4步:添加Codecov进行代码覆盖

首先,请确保您已经在计算机上更新了项目:

Codecov - 拉取源 2


点击 拉取源

Codecov - 拉取源 3


从我们的GitHub文件夹中复制将在IDE中使用的修改文件,然后粘贴到我们的工作区。在这种情况下,我们只复制并粘贴 pom.xml

不要忘记在STS 4上刷新项目并采取一切必要的步骤来包含更改。

为了更好地使用这个工具,我们通过添加单元测试进行了一些更改。

首先,创建一个新的包 — com.cicd.cicdappliedtospringbootjavaapp.controller。

其次,创建一个新的类 HelloController.java 并将 CicdAppliedToSpringBootJavaAppApplication.java 更改如下:

文件夹看起来像这样:

Codecov - 文件夹


在您的计算机上运行应用程序之前,您可以跳过整个dockerfile插件,因为部署将在由Travis CI管理的GitHub存储库上进行。

为此,只需在Maven命令中添加这个选项(-Ddockerfile.skip), 如 Spotify dockerfile-maven-plugin的用法 所述。最后,我们得到 mvn spring-boot:run -Ddockerfile.skip.

现在,使用GitHub登录或注册到Codecov。

点击 账户 -> 存储库 -> 添加新存储库。

只需选择您的GitHub存储库,或者点击这个链接 (https://codecov.io/gh/GITHUB_USERNAME/GITHUB_REPOSITORY) 。但请记住用您自己的 GITHUB_REPOSITORY 替换 cicd-applied-to-spring-boot-java-appGITHUB_USERNAME

Codecov -  cicd-applied-to-spring-boot-java-app


上次,我们向Docker添加了两个环境变量。现在,我们还添加了Codecov环境变量:CODECOV_TOKEN。复制您的令牌并将其添加到您的Travis CI存储库中。

我们通过添加 jacoco-maven-pluginpom.xml 进行了一些更改。

回到GitHub存储库,我们将编辑 .travis.yml 

现在是什么时间?Codecov 徽章时间! 

前往您的Codecov存储库,点击 设置 -> 徽章 -> 复制(来自Markdown)

然后,转到您的GitHub存储库,并将其粘贴到 README.md 中。

最后,将您的更改从计算机推送到GitHub。

代码覆盖率 60%:

Codecov - 徽章 60%


也许,您想禁用覆盖率,稍后再启用。如果是这样,那就继续并创建一个名为 codecov.yml. 的文件。现在,知道覆盖率是有用的,所以我将在每一行上加上“#”进行评论。

如果您想了解更多,点击这里 阅读文档。       

现在,进入第五步!

第五步:使用SonarCloud编写优秀的代码

首先,使用GitHub登录或注册。

点击 +(分析新项目或创建新组织) -> 分析新项目 -> 导入另一个组织 -> 从GitHub中选择一个组织。

SonarCloud - 主页


接下来,请确保SonarCloud可以访问您的GitHub存储库。

现在我们回到SonarCloud,选择一个Key。我建议使用 "cicd-applied-to-spring-boot-java-app" 作为Key。

然后,点击 继续 -> 选择免费计划 -> 创建组织 -> 分析新项目 -> 选择您的GitHub存储库 -> 设置 -> 使用Travis CI -> 提供并加密您的令牌 -> 复制。

返回Travis CI,并创建一个名为 SONAR_TOKEN 的SonarCloud环境变量。作为值,粘贴刚刚复制的令牌。

现在,回到SonarCloud,点击 继续 -> 编辑您的 .travis.yml 文件 -> 选择Maven作为构建技术 -> 配置您的平台 ->  配置扫描器 -> 复制。        

我选择将SonarCloud脚本写在after_success中,而不是script,因为我在这里专注于部署。您可以将其放在任何您想要的位置。

另外,创建一个名为sonar-project.properties的文件,编辑如下内容:sonar.projectKey=GITHUBUSERNAME_cicd-applied-to-spring-boot-java-app

返回SonarCloud,点击完成

最后,在README.md中添加一个SonarCloud徽章。

要获取另一个项目的徽章,请使用groupId:artifactId。

下面是已经添加的SonarCloud徽章:

SonarCloud - 徽章


步骤6:使用GitHub site-maven-plugin构建项目网站

首先,打开您电脑上的pom.xml文件。我们添加:

  1. OAuth令牌和GitHub服务器作为属性
  2. org.apache.maven.plugins:maven-site-plugin
  3. com.github.github:site-maven-plugin
  4. org.apache.maven.plugins:maven-project-info-reports-plugin
  5. 开发人员部分
  6. 组织部分
  7. 问题管理部分
  8. 软件配置管理(SCM)部分

Michael Lanyon的博客所解释,“重要的配置是允许OAuth令牌从环境变量中读取(摘自pom.xml)。要创建令牌,请按照这些说明。”

复制令牌,然后创建一个名为GITHUB_OAUTH_TOKEN的新环境变量。

pom.xml推送到GitHub,并在after_success下添加"- mvn site".travis.yml中。

gh-pages分支和项目站点将被创建。每次推送时,站点将根据需要进行更新。

GitHub站点 - gh-pages分支


环境 -> 查看部署(在已部署到github-pages下)。 GitHub存储库的链接。

GitHub站点 - 主页


步骤7:使用heroku-maven-plugin在Heroku上部署应用

Heroku - 主页


新建 -> 创建新应用。继续,输入一个应用名称(cicd-spring-boot-java-app)。cicd-applied-to-spring-boot-java-app作为应用名称太长。选择一个地区,然后点击创建应用连接到GitHub。 连接。 部署前等待CI通过。 启用自动部署。 帐户设置。

Heroku - 帐户设置


HEROKU_API_KEY的新Travis CI环境变量。这是与此项目关联的最后一个环境变量。

Heroku - HEROKU_API_KEY


  1. full-artifact-name作为属性
  2. com.heroku.sdk:heroku-maven-plugin
.travis.yml。
  1. 要在Docker Hub上部署,我们使用mvn deploy
  2. 要在Heroku上部署,我们将使用mvn heroku:deploy
  3. 为了在Docker和Heroku上部署,我们将部署阶段重复两次,并可能超出时间限制。
  4. 为了避免这种情况,我们将仅使用mvn heroku:deploy。

Heroku  - 部署成功


现在,是时候进行最后一步了。

第八步:管理主题

处于最后阶段意味着什么?当快速查看项目时,主题会很有帮助。

返回GitHub仓库,点击管理主题,添加任何你想要的主题。

顺便说一句,我们在README.md中添加了MIT许可徽标,并在pom.xml的许可部分也进行了添加!

最终的GitHub仓库 1


最终的GitHub仓库 2


结论

恭喜!你已经完成了所有的步骤。总的来说,你学会了如何使用MavenGitHubTravis CIDockerCodecovSonarCloudHeroku 在Spring Boot的Java应用上实现CI/CD。这是一个你可以自由使用的模板。

如果你感到困惑,请在评论中提问。我还建议多次阅读文档,直到弄清楚为止。

代码可以在这里找到。所以,只要fork;全都属于你!

进一步阅读

推荐阅读: 65.ThreadPoolExecutor的饱和策略(拒绝策略)

本文链接: 将CI/CD应用于使用Spring Boot的Java应用程序