将 CI/CD 构建到基于 Spring Boot 的 Java 应用程序中
浏览此深入教程,了解有关将持续集成/持续交付 (CI/CD) 构建到基于 Spring-Boot 的 Java 应用程序的更多信息。
什么是CI/CD
CI/CD
属于 DevOps
,代表持续集成、持续交付/部署。CI/CD 自动化了传统上将新代码从提交到生产(例如构建、测试和部署)以及基础设施配置所需的大部分或全部手动人工干预。借助 CI/CD ,开发人员可以对代码进行更改,然后自动测试并推出以进行交付和部署。以实现停机时间最小化,代码发布速度更快。
持续集成(CI)
持续集成是在提交或合并代码时,自动测试每个更改,并自动启动构建。可以大大减少开发和运维人员的重复工作,可以在软件开发生命周期的更早阶段更轻松的发现并修复错误和安全问题。
持续交付(CD)
持续交付是一种软件开发实践,一般与持续集成结合使用,以自动化基础设置供应和应用程序发布过程。
一旦代码作为 CI 流程的一部分进行了测试和构建,持续交付将在最后阶段接管,以确保可以随时部署并将部署所需要的环境打包在一起。
通过持续交付,可以随时将构建的软件部署到生产环境。可以手动触发部署,也可以进行自动化部署。
持续集成/持续交付 (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) 的经验。首先,让我们建立将在本教程中学习的所有内容:
- 使用 Spring Initializr 创建 Spring Boot Java 应用程序。
- 创建 GitHub 存储库。
- 使用 Travis CI 和 Docker 实现 CI/CD。
- 添加 Codecov 以提供代码覆盖率。
- 使用 SonarCloud 编写出色的代码。
- 使用 GitHub site-maven-plugin 构建项目站点。
- 使用 heroku-maven-plugin 在 Heroku 上部署应用程序。
- 管理主题。
渐渐地,我们会将徽章添加到 README.md 文件中,以便我们可以实时收到有关 Travis CI、Docker、Codecov 和 SonarCloud 状态的通知。此外,我们还将添加许可证徽章。
准备好了吗?如果没有,请花时间更好地理解或做好准备,稍后继续阅读本文。代码可在此处获得。跟着操作一遍,它都是你的!
如何将 CI/CD 构建到基于 Spring Boot 的 Java 应用程序中
步骤 1:使用 Spring Initializr 创建 Spring Boot Java 应用程序
在这个项目中,我使用了Spring Tool Suite 4(STS 4)IDE;您可以自由使用您认为适合此项目的任何工具。STS 4 内置了 Spring Initializr,所以这就是我为这个项目选择它的原因。
这是 STS 4 深色主题的样子:
单击 File -> New -> Spring Starter Project。
您将获得:
请填写以下表格:
- 名称:cicd-applied-to-spring-boot-java-app
- 组: com.cicd
- 工件: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
您将获得:
然后,单击**“下一步”。**
点击Spring Web:
单击 Finish。 新项目将显示:
接下来,请打开CicdAppliedToSpringBootJavaAppApplication.java文件。
然后,我们可以添加一个基本端点:
右键单击 -> Run As -> Maven build:
然后,您将收到:
若要运行该应用,请添加以下内容:
目标 -> spring-boot:run:
单击**“运行**”:
最终结果可以在这里找到:http://localhost:8080/。
现在,进入下一步!
步骤 2:创建 GitHub 存储库
首先,您需要登录或注册。我已经是 GitHub 用户,所以我刚刚登录。您将被引导至主页:
要创建新的存储库,请单击绿色按钮“**新建”**或单击此处。然后,您将被引导到这里:
请填写以下表格:
- 存储库名称:cicd-applied-to-spring-boot-java-app(我选择设置与第一步中的工件字段相同的名称)
- 描述:在Spring Boot Java App上实现持续集成/持续交付
- 单击**“Public”(公共)。**
- 单击 Initialize this repository with a README。
- 选择 MIT 许可证。
为什么?这很简单。以下链接有助于更好地了解为什么需要 MIT 许可证。以下是如何选择开源许可证、开源许可证的工作原理以及如何将它们添加到您的项目中。
稍后,我们将添加 .gitignore 文件。
然后,单击**“创建存储库**”:
这是新的存储库:
我建议您添加一个名为 RESEARCHES.md 的文件。为什么?在从事项目时,您可能会遇到困难并需要寻求帮助。目标是在解决问题或修复错误时节省时间。
要创建它,请单击**“创建新文件”。** 然后,用 RESEARCHES.md 填充名称字段并按如下方式编辑文件。CI/CD 是研究的一个例子,链接代表结果。“##”使文本加粗。
此外,单击页面底部的绿色按钮“提交新文件”:
这就是我们得到的:
现在,请安装 Git(Git 安装可以在这里找到)和 GitHub Desktop(GitHub Desktop 安装可以在这里找到)。
安装完这两个工具后,就可以克隆我们在第一步中开始的项目了。
打开 GitHub Desktop 并选择我们之前创建的仓库,如下所示:
单击 File -> Clone repository…:
您将看到以下弹出窗口:
只需在搜索栏中填写“cicd;”,您就会在结果中找到存储库:“cicd-applied-to-spring-boot-java-app”:
选择存储库,然后单击克隆:
GitHub Desktop 正在克隆仓库:
存储库已克隆:
在此阶段,打开存储库文件夹。这是我的路。
我的存储库文件夹包含三个文件:**LICENSE、**README.md 和 RESEARCHES.md,如下所示:
是时候打开保存代码的文件夹了:
从代码文件夹复制内容并将其粘贴到存储库文件夹中。存储库文件夹如下所示:
忽略文件和文件夹很重要。在处理项目时,我们不会直接修改这些文件。为此,我们将对存储库文件夹中的 .gitignore 文件进行一些更改。我使用Sublime Text来编辑该文件。
以下是在进行任何更改之前它应该是什么样子:
这是进行更改后的样子。
首先,添加:.gitignore。它应如下所示:
现在,这是文件夹存储库在 GitHub Desktop 上的样子:
在摘要字段中填写“首次上传”,然后单击“提交到主控版”:
那么下一步是什么?点击 Push origin:
存储库现已在 GitHub 上更新:
步骤 3:使用 Travis CI 和 Docker 实现 CI/CD
**注意:**如果您不熟悉这些工具中的任何一个,请查看此 Travis CI 教程和 Docker 入门教程,以帮助您入门。
使用 GitHub 注册或登录,并确保 Travis CI 有权访问您的存储库。然后,创建一个名为 .travis.yml 的文件,其中包含 Travis CI 将遵循的说明:
起初,这是我得到的:
然后,单击**.travis.yml**文件:
这是 Travis CI 上的存储库:
现在,我们将添加一个 Travis CI 徽章,以便我们收到有关更改等的通知。
要编辑 README.md 文件,请单击铅笔图标:
我们将得到这个页面:
添加此文本,但将“FanJups”替换为您的 Travis CI 用户名:
然后,添加提交描述“添加 Travis CI 徽章”,然后单击**“提交更改**”按钮:
然后,我们得到:
重要的是要知道,对于您所做的每一项更改,Travis CI 都会触发构建并发送电子邮件。这是一个持续的过程:
我们成功添加了 Travis CI 及其徽章。接下来,我们将重点介绍 Docker。
首先,登录或在 Docker Hub 上注册:
单击**“创建存储库**”按钮:
按如下方式填写表格:
- 名称:cicd-applied-to-spring-boot-java-app(GitHub 存储库名称)
- 描述:在 Spring Boot Java 应用程序上实现持续集成/持续交付(GitHub 存储库说明)
- 可见性:选择"Public"
- 生成设置:选择“GitHub”
单击**“创建**”按钮后:
是时候将我们的 Docker 存储库链接到我们的 GitHub 存储库了。单击 Builds:
然后,单击**“链接到 GitHub**”:
选择 GitHub 存储库:
现在选择了 GitHub 存储库,我们需要进行一些更改:
- 自动测试:选择 “Internal and External Pull Requests”
- 存储库链接:选择 “Enable for Base Image”
点击保存:
我们成功地将 GitHub 存储库链接到 Docker 存储库。如果您需要有关 Docker 构建的帮助,此链接很有帮助。
下一步是什么?首先,我们将安装 Docker。然后,我们将对代码和 Travis CI 进行一些更改。
若要安装 Docker,请转到 Docker 的“入门”页,选择“**Docker for Developers”,**然后单击“下载桌面并学习教程”:
若要确保已安装 Docker 并验证其是否正常运行,请打开命令行并编写“docker”。然后验证:
现在,返回 IDE 或文本编辑器;我们将对代码进行一些更改。
创建名为“Dockerfile”的文件。总结一下我们目前所做的工作,Dockerile 在创建 Docker 镜像时很有用。为了更好地理解此文件的用途,此 Dockerfile 参考将为您提供帮助。
为了简单起见,我使用这个 Callicoder Dockerfile 示例并做了一些小的更改。Dockerfile 如下所示:
接下来,这是使用 STS 4 创建进程的 Dockerfile。
选择项目,然后单击**“新建 -> 文件”。**
用“Dockerfile”填充文件名字段,然后单击**“完成**”按钮:
复制并粘贴前面介绍的 Dockerfile 的内容:
在对pom.xml进行一些更改之前,让我们先看看实际内容。
我们添加了 Spotify 的 dockerfile-maven-plugin 来将项目推送到 Docker Hub 上。
此外,我们添加了 maven-dependency-plugin,如上一篇文章“Spring Boot 和 Docker 入门”中所述,其中指出:
"…为了确保在创建 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 徽章:
单击“更多选项”-“>设置”:
填写表格如下:
- **名字:**DOCKER_PASSWORD
- **值:**yourdockerpassword
- 单击**“添加**”按钮
- **名字:**DOCKER_USERNAME
- **值:**yourdockerusername
单击**“添加**”按钮:
要在 Docker 上部署,我们将使用 Spotify 解释的**“mvn deploy”。** Apache Maven 项目解释了 Apache Maven Deploy 插件作为用于*“将工件添加到远程存储库”*的插件的作用。DZone 之前介绍了如何使用管道或 Maven 作业发布 Maven 工件。
但是我们不想将工件添加到远程存储库:我们只想将其部署在 Docker 上。因此,当我们调用部署阶段时,我们必须包含有效的 部分 POM。然而,这不是这里的目的。因此,我们将在 pom.xml 中添加此属性:
1
<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]
在这个阶段,是时候使用这两个 Docker 环境变量了。只需复制并粘贴此新**.travis.yml**并将其推送到 GitHub 上:
提交说明:“将 Travis CI 链接到 Docker”。
我们收到了一个漂亮的红十字和 Travis CI 徽章,这意味着一个美丽的错误!但现在忽略它:我们稍后会纠正它!
女士们,先生们,我很高兴向你们介绍:我们美丽的错误!只需转到 Travis CI 存储库并查看漂亮的构建日志:
命令“mvn deploy”以 1 退出。
我们已经添加了 Travis CI 徽章。现在,是时候对 Docker 做同样的事情了。转到 Shields.io。
在搜索栏上,输入“docker”。然后,我们将得到以下结果:
单击 Docker Cloud Build Status:
如果我告诉你我们也会在这里得到一个错误怎么办?
没关系 - 只需填写以下表格:
单击复制徽章 URL。
现在,返回 GitHub 存储库并编辑 README.md。我们将添加以下 Docker 徽章:
提交说明:“添加 Docker 徽章”:
我们都是这里的赢家。所以让我们把它做好!
之前,我们对pom.xml进行了更改并创建了一个 Dockerfile。
所有这些错误都是由于 Maven 不知道如何处理 Docker 上的部署,并且缺少 Dockerfile,因此无法推送映像。
现在是时候使用 GitHub Desktop 在 GitHub 上推送这些更改(Dockefile 和 pom.xml):
现在,我们有两个丑陋的绿色徽章,意味着成功!开玩笑!那真是太美了。
可以肯定的是,请检查您的电子邮件。您应该已经收到两封电子邮件:一封来自 Travis CI,另一封来自 Docker。
在继续执行第三步之前,我们将在不仅使用 Docker 的情况下运行应用。只需记住将“fanjups”替换为您自己的 Docker Hub 用户名:
我收到以下错误:Invalid or corrupt jarfile /app.jar.。这都是关于编码的,所以我会将这两个属性添加到pom.xml中。
现在,是时候在 GitHub 上提交了。如果你对编写有用的提交消息感到困惑,DZone过去曾介绍过这个话题。
在再次运行应用之前,请务必使用 docker ps 列出所有容器。
然后检查“CONTAINER ID”,停止(docker stop “CONTAINER ID”),并将其删除(docker rm “CONTAINER ID”),因为它是持久的,正如这篇关于使用 Docker 的 Spring Boot 的文章所解释的那样。
然后,我们将再次运行该应用,以确保一切正常:
当我解决这个问题时,我很高兴!
核心步骤现已结束。我们已经成功实施了 CI/CD。现在,让我们添加一些有用的工具!
步骤 4:添加 Codecov 以覆盖代码
首先,请确保已在计算机上更新项目:
单击 Pull Origin:
从 GitHub 文件夹中复制我们将在 IDE 中使用的修改后的文件,然后将它们粘贴到工作区中。在这种情况下,我们只会复制并粘贴pom.xml。
不要忘记在 STS 4 上刷新项目,并尽一切努力包含更改。
为了更好地使用此工具,我们通过添加单元测试进行了一些更改。
首先,创建一个新包 — com.cicd.cicdappliedtospringbootjavaapp.controller。
其次,创建一个新的类HelloController.java并更改CicdAppliedToSpringBootJavaAppApplication.java,如下所示:
该文件夹如下所示:
在计算机上运行应用之前,可以跳过整个 dockerfile 插件,因为部署将在 Travis CI 管理的 GitHub 存储库上进行。
为此,只需将此选项 (-Ddockerfile.skip) 添加到您的 Maven 命令中,如 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-app,并将GITHUB_USERNAME替换为您的:
上次,我们向 Docker 添加了两个环境变量。现在,我们还添加了 Codecov 环境变量:CODECOV_TOKEN。复制令牌并将其添加到 Travis CI 存储库。
我们通过添加 jacoco-maven-plugin 对pom.xml进行了一些更改。
返回到 GitHub 存储库,我们将编辑.travis.yml。
现在 几点钟?Codecov 徽章时间!
转到您的 Codecov 存储库,然后单击 Settings -> Badge -> Copy(来自 Markdown)。
然后,转到 GitHub 存储库并将其粘贴到 README.md 中。
最后,将更改从计算机推送到 GitHub。
代码覆盖率 60%:
也许,您想停用覆盖范围并稍后激活它。如果是这样,请继续创建一个名为 codecov.yml 的文件。 现在,了解覆盖范围很有用,所以我将用“#”对每一行进行注释。
如果您想了解更多信息,请单击此处阅读文档。
现在,进入第 5 步!
第 5 步:使用 SonarCloud 编写出色的代码
首先,请登录或注册 GitHub。
单击 +(分析新项目或创建新组织) -> 分析新项目 -> 导入其他组织 -> 在 GitHub 上选择一个组织。( (Analyze new project or create new organization) -> Analyze new project -> Import another organization -> Choose an organization on GitHub.)
接下来,确保 SonarCloud 有权访问您的 GitHub 存储库。
现在我们回到 SonarCloud,选择一个密钥。我建议使用**“cicd-applied-to-spring-boot-java-app”**作为键。
然后,单击**“继续”->选择“免费计划”->“创建组织”->“分析新项目”->选择“GitHub存储库”->“设置->与Travis CI”->“提供并加密令牌”->“复制”。**( Continue -> Choose Free plan -> Create Organization -> Analyze new project -> Select your GitHub repository -> Set Up -> With Travis CI -> Provide and encrypt your token -> Copy.)
返回到 Travis CI 并创建名为 SONAR_TOKEN 的 SonarCloud 环境变量**。** 作为值,粘贴刚刚复制的令牌。
现在,返回 SonarCloud 并单击“继续”-> 编辑.travis.yml文件 -> 选择 Maven 作为构建技术 -> 配置平台 -> 配置扫描程序 -> 复制。 Continue -> Edit your .travis.yml file -> Choose Maven as build technology -> Configure your platform -> Configure the scanner -> Copy.
我选择在 after_success 下编写 SonarCloud 脚本,而不是 script,因为我专注于此处的部署。您可以自由地将其放置在您想要的位置。
此外,创建一个名为 sonar-project.properties 的文件并对其进行如下编辑:sonar.projectKey=GITHUBUSERNAME_cicd-applied-to-spring-boot-java-app
返回 SonarCloud,然后单击 Finish。
最后,我们在 README.md 中添加了一个 SonarCloud 徽章**。**
若要获取其他项目的锁屏提醒,请使用 groupId:artifactId。
以下是已添加的 SonarCloud 徽章:
步骤 6:使用 GitHub site-maven-plugin 构建项目站点
首先,请在计算机上打开pom.xml。我们添加:
- OAuth 令牌和 GitHub 服务器作为属性
- org.apache.maven.plugins:maven-site-plugin
- com.github.github:site-maven-plugin
- org.apache.maven.plugins:maven-project-info-reports-plugin
- 开发人员部分
- 组织部分
- issueManagement 部分
- 软件配置管理 (SCM) 部分
“重要的配置是允许从环境变量中读取 OAuth 令牌(摘自 pom.xml),”正如 Michael Lanyon 的博客所解释的那样。“若要创建令牌,请按照以下说明操作。”
复制令牌,然后创建名为 GITHUB_OAUTH_TOKEN 的新环境变量**。**
将pom.xml推送到 GitHub 并通过在after_success下添加**“- mvn site”来编辑.travis.yml**。
推送所有更改后,将创建 gh-pages 分支和项目站点。 每次推送时,网站都会在必要时更新。
若要查看站点,请单击**“环境”->“查看部署”(在“部署到 github-pages”下)。**
这是我的 GitHub 存储库的链接。
第 7 步:使用 heroku-maven-plugin 在 Heroku 上部署应用程序
来吧!登录或注册 Heroku。
单击**“新建”->“创建新应用”。** 要继续,请输入应用程序名称 (cicd-spring-boot-java-app)。cicd-applied-to-spring-boot-java-app 作为应用程序名称太长。选择一个区域,然后单击创建应用。
接下来,单击“连接到 GitHub”。
搜索 GitHub 存储库。找到它后,单击**“连接”。**
选中**“等待 CI 通过后再部署(Wait for CI to pass before deploying)”。**
单击启用自动部署(Enable Automatic Deploys)
转到帐户设置。Account settings
复制您的 API 密钥并创建一个名为 HEROKU_API_KEY 的新 Travis CI 环境变量**。** 这是链接到此项目的最后一个环境变量。
是时候编辑pom.xml并将其推送到 GitHub 了。我们添加:
- full-artifact-name 作为属性
- com.heroku.sdk:heroku-maven-插件
现在,我们专注于**.travis.yml。**
- 为了在 Docker Hub 上部署,我们使用了 *mvn deploy*。
- 要在 Heroku 上部署,我们将使用 *mvn heroku:deploy*。
- 为了在 Docker 和 Heroku 上进行部署,我们将重复部署阶段两次,并冒着超时的风险。
- 为了避免这种情况,我们只使用 *mvn heroku:deploy。*
我们成功地部署在 Heroku 上!万岁!现在,转到 https://cicd-spring-boot-java-app.herokuapp.com/。
现在,是时候进行最后一步了。
步骤 8:管理主题
进入最后阶段意味着什么!?在快速了解项目时,主题很有帮助。
返回到 GitHub 存储库,单击**“管理主题(Manage topics)“**然后添加所需的任何内容。
顺便说一句,我们在pom.xml的 README.md 和许可证部分添加了一个 MIT 许可证徽章!
结论
祝贺!你都完成了。总而言之,您学习了如何使用 Maven、GitHub、Travis CI、Docker、Codecov、SonarCloud 和 Heroku 在 Spring Boot Java 应用上实现 CI/CD。这是一个您可以免费使用的模板。
如果您感到困惑,请在评论中提问。我还建议根据需要多次阅读可用的文档。
代码可在此处获得。
以上我跟着操作了一遍,很有价值,所以做个分享,然后感谢原作者的分享