使用Travis-CI的SpringBoot应用程序的CI / CD

在本文中,我们将学习如何将Travis CI用于SpringBoot应用程序的持续集成和持续部署(CI / CD)。 我们将学习如何运行Maven构建目标,使用JaCoCo插件,使用SonarCloud代码质量检查,建立泊坞窗图像进行测试覆盖率验证并推DockerHub并最终将其部署到Heroku的

本文的源代码位于https://github.com/sivaprasadreddy/freelancer-kit

上周,我和我的朋友谈论了使用SpringBoot构建Java应用程序并对其进行部署变得多么容易。 在讨论中,有一点提出了关于构建Java应用程序并将其部署到某个地方(云)的成本。 因此,我想探索更多关于免费服务的信息,我们可以使用这些免费服务以最小的成本或根本没有成本使所有项目开发活动自动化。

几年前,我使用CloudBeesCloudFoundry构建并部署了提供免费托管服务的宠物项目,但它们不再提供免费服务。

过去,我仅将Travis CI用于Java项目只是为了进行初步测试,但查看它们的文档后,我意识到它们提供了很多功能。

因此,我想检查一下是否可以将Travis CI用于我的项目,以执行所有常规任务,例如:

  • 签出最新代码
  • 编译并运行单元和集成测试
  • 运行JaCoCo代码覆盖率,如果未达到所需的百分比,则构建失败
  • 运行SonarQube代码质量检查
  • (可选)构建Docker映像并将其发布到Docker Hub
  • 在一些免费的云托管服务(如HerokuOpenShift)上部署应用程序

在阅读了他们的文档之后,我意识到我们可以通过使用一些免费的在线服务以及与Travis-CI的集成来完成所有这些任务。

  • GitHub代码存储库
  • SonarCloud免费的SonarQube服务
  • 用于发布Docker映像的Docker Hub
  • Heroku用于部署应用程序

让我们看看如何使用Travis-CISpringBoot项目执行上述所有任务。

步骤1:创建SpringBoot项目

使用http://start.spring.io或从您的IDE创建一个SpringBoot项目。 我正在使用Maven构建工具,也可以根据需要使用Gradle。 现在将项目提交到您的github存储库中。

步骤2:建立.travis.yml档案

为了启用Travis-CI集成,我们需要在项目根文件夹中创建.travis.yml文件。
在创建基于Maven的Java项目时,请创建具有以下内容的.travis.yml文件:

.travis.yml

language: java
jdk: oraclejdk8

这种最小的配置足以使Travis-CI识别并构建基于Maven的Java项目。 如果我们的项目根文件夹中有一个build.gradle文件,Travis会将其视为Gradle项目,或者如果存在pom.xml它将其视为Maven项目。 如果同时存在build.gradle和pom.xml,则Gradle构建脚本将具有优先权。

默认情况下,Travis将运行mvn test -B来构建项目。 如果Travis找到mvnw包装器,则它将像./mvnw test -B一样使用。
但是,如果您要运行其他命令或要运行多个命令,则可以使用脚本块对其进行自定义。

现在,提交.travis.yml文件并将其推送到GitHub。

步骤3:为GitHub储存库启用Travis-CI

转到https://travis-ci.org/并使用GitHub登录
现在单击添加新存储库 (+符号)。
为存储库启用Travis。 启用Travis后,单击该存储库,然后可以通过选择More Options-> Trigger build来触发构建

现在您可以看到构建正在运行并且测试已执行,并且有关构建状态的电子邮件通知将发送到您的电子邮件中。

步骤4:添加JaCoCo代码覆盖率检查

将Maven JaCoCo插件添加到pom.xml中,并使用诸如所需的代码覆盖率百分比,要忽略的包/类等选项。

<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.7.9</version><configuration><excludes><exclude>in/sivalabs/freelancerkit/entities/*</exclude><exclude>in/sivalabs/freelancerkit/*Application</exclude></excludes></configuration><executions><execution><id>default-prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>default-prepare-agent-integration</id><goals><goal>prepare-agent-integration</goal></goals></execution><execution><id>default-report</id><phase>verify</phase><goals><goal>report</goal></goals></execution><execution><id>default-report-integration</id><goals><goal>report-integration</goal></goals></execution><execution><id>default-check</id><goals><goal>check</goal></goals><configuration><rules><!-- implementation is needed only for Maven 2 --><rule implementation="org.jacoco.maven.RuleConfiguration"><element>BUNDLE</element><limits><!-- implementation is needed only for Maven 2 --><limit implementation="org.jacoco.report.check.Limit"><counter>COMPLEXITY</counter><value>COVEREDRATIO</value><minimum>0.60</minimum></limit></limits></rule></rules></configuration></execution></executions>
</plugin>

步骤5:运行单元和集成测试

如前所述,默认情况下,Travis运行mvn test -B ,它将仅运行Unit tests

我们希望通过使用maven-failsafe-plugin分别运行单元测试和集成测试。 我们将遵循惯例,将单元测试命名为* Test.java / * Tests.java将集成测试命名为* IT.java

如下所述添加maven-failsafe-plugin

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><configuration><includes><include>**/*IT.java</include></includes></configuration><executions><execution><id>failsafe-integration-tests</id><phase>integration-test</phase><goals><goal>integration-test</goal></goals></execution></executions>
</plugin>

在为SpringBoot项目配置maven-failsafe-plugin时,我遇到了这个问题https://github.com/spring-projects/spring-boot/issues/6254 。
为了解决这个问题,我将分类器配置添加到spring-boot-maven-plugin,如下所示:

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><classifier>exec</classifier></configuration>
</plugin>

现在,我们将使用脚本块来指定要运行的自定义Maven目标,而不是默认目标。

.travis.yml

language: java
jdk: oraclejdk8script:
- ./mvnw clean install -B

步骤6:使用SonarCloud进行SonarQube代码质量检查

基于SonarQube构建的SonarCloud ,可为开源项目提供免费的代码质量检查。
使用GitHub登录并转到“ 我的帐户”->“安全性”,并为您的项目生成一个新令牌并将其保存在某处。 现在,单击“ 组织”选项卡,并使用一些唯一的密钥创建组织。

Travis-CI提供了对敏感数据进行加密的功能( https://docs.travis-ci.com/user/encryption-keys/ ),以便我们可以加密任何密钥,密码并在.travis.yml文件中进行配置。

> sudo gem安装travis

在项目根文件夹中,运行以下命令来加密数据:

travis加密SOMEVAR =“ secretvalue”

这将生成类似

安全:“…。 加密的数据……”

我们可以将所有机密添加为全局环境变量,如下所示:

env:global:- secure: "....encrypted data....."

现在,让我们如下加密SonarCloud令牌:

travis加密SONAR_TOKEN =“ my-sonar-token-here”

最后,让我们将SonarCloud支持添加为一个插件( https://docs.travis-ci.com/user/sonarcloud/ ),如下所示:

language: java
jdk: oraclejdk8env:global:- secure: "....encrypted sonar token here....."addons:sonarcloud:organization: "sivaprasadreddy-github"token:secure: $SONAR_TOKENscript:
- ./mvnw clean install -B
- ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar

请注意,我们使用$ SONAR_TOKEN引用加密的令牌变量,并添加了另一个命令在脚本块中运行以运行sonar:sonar目标。

步骤7:构建Docker映像并发布到DockerHub

Travis CI构建可以运行和构建Docker映像,也可以将映像推送到Docker存储库。 有关更多信息,请阅读https://docs.travis-ci.com/user/docker/

在项目根文件夹中为我们的SpringBoot应用程序创建Dockerfile ,如下所示:

FROM frolvlad/alpine-oraclejdk8:slim
VOLUME /tmp
ADD target/freelancer-kit-0.0.1-SNAPSHOT.jar app.jar
RUN sh -c 'touch /app.jar'
ENV JAVA_OPTS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8787,suspend=n"
EXPOSE 8080 8787
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar" ]

要使用Docker,请将以下设置添加到.travis.yml:

sudo: requiredservices:- docker

现在我们可以在构建中运行Docker命令。

构建成功后,我们可能要构建Docker映像并将其推送到Docker Hub。 我们可以利用after_success部分来执行此操作。

在推送映像之前,我们需要登录DockerHub ,我们将通过对其进行加密来配置DockerHub凭据。

travis加密DOCKER_USER =” dockerhub-username”
travis加密DOCKER_PASS =“ dockerhub-password”

将这两个秘密添加到.travis.yml的env.global部分。

现在,我们可以在after_success节中添加我们的docker命令来构建映像并将其发布到dockerhub,如下所示:

after_success:
- docker login -u $DOCKER_USER -p $DOCKER_PASS
- export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH; fi`
- export IMAGE_NAME=sivaprasadreddy/freelancerkit
- docker build -t $IMAGE_NAME:$COMMIT .
- docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG
- docker push $IMAGE_NAME

步骤8:部署到Heroku

Travis CI提供了在广泛的平台(包括Heroku,OpenShift,AWS,Azure等)上进行部署的选项。TravisCI在成功构建后可以自动部署您的Heroku应用程序。

我们将使用Travis https://docs.travis-ci.com/user/deployment/heroku/在Heroku上部署SpringBoot应用程序。 在将我们的应用程序部署到Heroku之前,我们需要登录到https://www.heroku.com/并从Dashboard创建一个应用程序。

现在,在项目的根文件夹中创建Procfile ,如下所示:

web java -Dserver.port=$PORT -Dspring.profiles.active=heroku $JAVA_OPTS -jar target/freelancer-kit-0.0.1-SNAPSHOT-exec.jar

首先,我们需要获取Heroku API密钥并将其添加为加密密钥。

travis加密HEROKU_API_KEY =“此处为您的Heroku-api-key-”

我们可以通过添加以下部署部分来从Travis部署到Heroku:

deploy:provider: herokuapi_key: $HEROKU_API_KEYapp: freelancerkit

现在,完整的.travis.yml文件将如下所示:

sudo: required
language: java
jdk: oraclejdk8services:
- dockerenv:global:- secure: "encrypted-sonar-token"- secure: "encrypted-dockerhub-username"- secure: "encrypted-dockerhub-password"- secure: "encrypted-heroku-api-key"- COMMIT=${TRAVIS_COMMIT::7}addons:sonarcloud:organization: "sivaprasadreddy-github"token:secure: $SONAR_TOKENscript:
- ./mvnw clean install -B
- ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonarafter_success:
- docker login -u $DOCKER_USER -p $DOCKER_PASS
- export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH&amp;amp;amp;amp;amp;amp;lt;span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"&amp;amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;amp;amp;gt;; fi`
- export IMAGE_NAME=sivaprasadreddy/freelancer-kit
- docker build -t $IMAGE_NAME:$COMMIT .
- docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG
- docker push $IMAGE_NAMEdeploy:provider: herokuapi_key: $HEROKU_API_KEYapp: freelancer-kit

一旦构建成功并将其部署在Heroku上,您应该可以通过https:// <app> .herokuapp.com /访问该应用程序。

我仅介绍了Java应用程序中最常执行的任务,但是Travis-CI可以执行更多任务。 在https://docs.travis-ci.com/上查看TravisCI文档。

翻译自: https://www.javacodegeeks.com/2018/01/ci-cd-springboot-applications-using-travis-ci.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一章MCS-51单片机结构,单片机原理、接口及应用

文章目录一、MCS-51单片机内部结构二、CPU三、存储器四、特殊功能寄存器SFR五、时钟电路与复位电路六、引脚功能一、MCS-51单片机内部结构 单片机是在一块芯中集成了CPU、RAM、ROM、定时/计数器和多功能I/O接口等基本部件的大规模集成电路&#xff0c;又称MCU。 51系列单片机…

微信小程序云开发校园社交二手物品跳蚤平台表白动态求助寻物组队

前些天发现了十分不错的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 微信公众号&#xff1a;创享日记&#xff08;微信号csds99202…

html悬浮弹窗后面背景变深,JS+CSS实现Div弹出窗口同时背景变暗的方法

本文实例讲述了JSCSS实现Div弹出窗口同时背景变暗的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;代码如下:JSCSS实现的Div弹出窗口&#xff0c;同时背景变暗function locking(){document.all.ly.style.display"block";document.all.ly.style.widthd…

传感与检测实验报告,差动变压器的特性测定,江南大学物联网自动化

前些天发现了十分不错的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; public class LeastSquares {public static void matching(…

计算机网络由 子网,计算机网络系统是由通信子网和资源子网组成的。()

计算机网络系统是由通信子网和资源子网组成的。()更多相关问题“May I speak to Iris&#xff1f;” “This is () speaking.”用FDI提出的二位数字法记录的牙位24指的是凡在一个登记期内有&#xff1a;伪造学历和出版专业工作资历证明、脱离出版专业技术岗位_______年、因违法…

如何使用Spring初始化程序创建Spring Boot项目

你好朋友&#xff0c; 如果您以前使用过Spring框架&#xff0c;则必须意识到&#xff0c;即使要开始使用基本的Spring功能也需要付出一些真正的努力。有了Spring Boot&#xff0c;最初的麻烦就消失了&#xff0c;您可以在数分钟内开始使用。 欢迎来到Spring Boot的世界&#…

计算机组成原理,计算机系统总线,总线分类、特性、性能指标、结构以及总线控制,判优控制通信控制

文章目录总线的基本概念总线的分类总线特性及性能指标总线结构总线控制一、总线判优控制二、总线通信控制总线的基本概念 一、总线是连接各个部件的信息传输线&#xff0c;是各个部件共享的传输介质。 二、总线上信息的传送有串行和并行&#xff1a; 三、总线结构计算机举例…

虚拟机使用计算机网络,虚拟机技术在计算机网络专业课程教学中的应用

环境&#xff0c;做一些服务器配置&#xff0c;这就需要机房安装多种操作系统与多种软件&#xff0c;还需要允许学生随意的对操作环境进行配置。计算机机房的建设越来越完善&#xff0c;但需要承担的多门课程的学习和实验&#xff0c;使用率高。如若进行与操作系统配置实验&…

传感与检测技术,Pt100热电阻测温实验报告,江南大学物联网

public class LeastSquares {public static void matching(double[] x, double[] y, double[] input, double fully) {double k getK(x, y);double b getB(x, y);System.out.println("线性回归系数 k 值&#xff1a;\t" k "\n" "线性回归系数 b …

html 高度不够,HTML/CSS:Div未扩展到内容高度

我有几个未扩展的div元素以匹配其内容的高度。我已经读过&#xff0c;这可能是由浮动内容引起的;这个内容不是浮动的 - 虽然我开始觉得我应该把我的电脑扔在河里。这算不算&#xff1f;HTML/CSS&#xff1a;Div未扩展到内容高度代码&#xff1a;#interaction-options-container…

传感与检测技术,光电二极管和光敏电阻的特性研究实验报告,江南大学物联网工程学院自动化

前些天发现了十分不错的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;没有广告&#xff0c;分享给大家&#xff0c;大家可以自行看看。&#xff08;点击跳转人工智能学习资料&#xff09; 江南大学物联网工程学院传感与检测技术《光电二极管和光敏电…

sql 动态写入数据库字段_批处理写入,动态SQL和参数化SQL,数据库的性能如何?...

sql 动态写入数据库字段最有效的数据库优化之一是批处理写入。 批处理写入受大多数现代数据库和JDBC标准的一部分支持&#xff0c;并且受大多数JPA提供程序支持。 普通数据库访问包括在单独的数据库/网络访问中将每个DML&#xff08;插入&#xff0c;更新&#xff0c;删除&…

将HTML转换为Apache POI的RichTextString

1.概述 在本教程中&#xff0c;我们将构建一个将HTML作为输入的应用程序&#xff0c;并使用提供HTML的RichText表示形式创建Microsoft Excel工作簿。 为了生成Microsoft Excel工作簿&#xff0c;我们将使用Apache POI 。 为了分析HTML&#xff0c;我们将使用Jericho。 Github上…

计算机基础知识第3版答案,计算机基础知识试题库及答案(3)

65、计算机的CPU每执行一个__B___&#xff0c;就完成一步基本运算或判断。A、语句B、指令C、程序D、软件66、计算机能按照人们的意图自动、高速地进行操作&#xff0c;是因为采用了__A__。A、程序存储在内存B、高性能的CPUC、高级语言D、机器语言67、语言处理程序的发展经历了_…

MySQL常见问题的解决,root用户密码忘记,不是内部或外部命令,修改数据库和表的字符编码,命令行客户端的字符集问题

文章目录问题1&#xff1a;root用户密码忘记&#xff0c;重置的操作问题2&#xff1a;mysql命令报“不是内部或外部命令”问题3&#xff1a;错误ERROR &#xff1a;没有选择数据库就操作表格和数据问题4&#xff1a;命令行客户端的字符集问题问题5&#xff1a;修改数据库和表的…

html首页我的待办,JavaScript / HTML中的待办事项列表

我已经设置了这个待办事项列表,几乎所有东西都完美无缺.但是,如果我删除列表中的所有内容.它不会让我添加一个新的条目,我似乎无法弄明白为什么.只要我在列表中至少有一个条目,它就可以正常工作.非常感谢任何帮助,谢谢.< head >< script type "text/javascript&…

win10下最新MySQL8.0安装与环境配置,Navicat图形化管理工具连接,完整详细可收藏

微信公众号&#xff1a;创享日记 发送&#xff1a;sqlyog 获取SQLyog客户端安装包 文章目录一、MySQL的卸载二、MySQL的下载安装和配置三、MySQL的开启和登录四、MySQL图形化管理工具一、MySQL的卸载 步骤1&#xff1a;停止MySQL服务 在卸载之前&#xff0c;先停止MySQL8.0的服…

Fn函数来构建Oracle ADF应用程序

在我以前的一篇文章中&#xff0c;我描述了如何创建一个Docker容器作为ADF应用程序的构建器。 在这里&#xff0c;我将展示如何将此容器用作 在FN平台的功能 。 首先&#xff0c;让我们更新容器&#xff0c;使其符合功能要求&#xff0c;这意味着可以将其作为接受某些参数的可…

教师计算机提升学到的知识,计算机教学质量提升措施浅谈.doc

计算机教学质量提升措施浅谈计算机教学质量提升措施浅谈一、热情投入&#xff0c;创设宽松和谐的课堂学习氛围在课堂教学中&#xff0c;教师要尊重每一个学生的权利&#xff0c;一视同仁&#xff0c;对于学生的错误&#xff0c;要委婉地指出&#xff0c;鼓励学生进行改正&#…

MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏

文章目录1、SQL语言的分类2、SQL语言的规则与规范3、基本的SELECT语句4、DESCRIBE显示表结构5、WHERE过滤数据1、SQL语言的分类 SQL语言在功能上主要分为如下3大类&#xff1a; DDL&#xff08;Data Definition Languages、数据定义语言&#xff09;&#xff0c;这些语句定义…