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

travis-ci

在本文中,我们将学习如何将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 =“我的声纳令牌在这里”

最后,让我们将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

travis-ci

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

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

相关文章

音标、音节、音素、音符

[kəˌmjuːnɪˈkeɪʃn] &#x1f446;上面这个叫『音标』&#xff0c;里面有三个『音节』&#xff0c;kə、mjuːnɪ、keɪʃn&#xff0c;mjuːnɪ是『轻读音节』&#xff0c;keɪʃn是『重读音节』&#xff0c;这个『音标』含有11个『音素』&#xff0c;分别为&#xff1…

outlook邮箱邮件大小限制_设置Office 365邮箱默认发送和接收邮件大小限制

Office 365默认的 35MB 的邮件大小限制。Office 365 最大是支持 150MB 的邮件体积的。我们只需用 Windows Powershell 连接 Office 365 &#xff0c;然后通过命令修改 Exchange Online 中的邮箱计划即可。方法如下&#xff1a;1、连接到 Office 365 PowerShell借助 Office 365 …

python中形参*args和**kwargs简述

形参*args的作用&#xff1a;传递任意数量的实参。 形参*args中的星号让python创建一个名为args的空元组&#xff0c;并将收到的所有值都封装到这个元组中。其实args换成其他的标识符完全没问题&#xff0c;只是习惯上用args。 如下举例&#xff1a; def fun(*args):print(a…

运动基元_Java更快地对基元数组进行排序?

运动基元看来&#xff0c;在不久的将来&#xff0c;Java中的原语排序数组可能会提高性能。 弗拉基米尔雅罗斯拉夫斯基&#xff08;Vladimir Yaroslavskiy&#xff09;已在core-libs-dev邮件列表中发布了一条消息 &#xff0c;标题为“ Dual-Pivot Quicksort的新优化版本 ”&…

Linux 命令之 rpmbuild -- 用于创建 rpm 格式的二进制软件包和源码软件包

文章目录一、命令介绍二、命令选项&#xff08;一&#xff09;从 specfile 建立&#xff08;二&#xff09;从 tarball 包建立&#xff08;三&#xff09;从 source package 包建立&#xff08;四&#xff09;其它选项&#xff08;五&#xff09;所有 rpm 都可使用的选项&#…

只做macd二次金叉_【教你一招】MACD低位二次金叉

原标题&#xff1a;【教你一招】MACD低位二次金叉来源&#xff1a;K线密码MACD低位二次金叉技术要点1、第二次金叉离第一次金叉距离越近越好&#xff1b;2、MACD第二次金叉的位置以高于第一次金叉为好&#xff1b;3、MACD第二次金叉时结合K线形态上的攻击形态研判(如&#xff1…

计算机领域专业术语中英文对照(时常更新)

机器学习 线性回归(linear regression) 多标签分类(multi-label classification&#xff0c;MLC) 验证集(validation) 均方误差(MSE) 偏差(bias) 方差(variance) 深度学习 多层感知机(MLP) 反向传播(Back Propagation) 张量(Tensor) 随机梯度下降(SGD) 向量(Vector) 标量(Sc…

owasp maven_OWASP依赖性检查Maven插件–必须具备

owasp maven我不得不非常遗憾地承认&#xff0c;我不知道OWASP依赖检查maven插件 。 自2013年以来似乎已经存在。显然GitHub上已有千个项目正在使用它。 过去&#xff0c;我手动检查了依赖项&#xff0c;以根据漏洞数据库检查它们&#xff0c;或者在很多情况下&#xff0c;我只…

软件包管理器 RPM 升级软件包过程分析

升级软件包 alsaplayer-0.99.76-2.2.fc4.i386.rpm&#xff0c;并显示详细的升级信息&#xff1a; rpm -Uvv alsaplayer-0.99.76-2.2.fc4.i386.rpm把显示内容当中对我们有用的挑出来&#xff1a; D: opening db environment /var/lib/rpm/Packages joinenv D: opening d…

ubtunu打开firefox_Linux Ubuntu 终端命令行打开firefox报错

1&#xff0c;报错$ firefox(firefox:2673): GConf-WARNING **: Client failed to connect to the D-BUS daemon:Failed to connect to socket /tmp/dbus-80Eq35bHIz: Connection refused(firefox:2673): GConf-WARNING **: Client failed to connect to the D-BUS daemon:Fail…

自然语言处理领域基本概念笔记

自然语言处理 词向量&#xff1a; 自然语言处理问题要转化为机器学习的问题&#xff0c;首先就要把单词数学化表示&#xff0c;就是用n维实数向量来代表一个单词。 对话系统 对话系统发展历程的三个阶段&#xff1a; 1.基于符号规则和模板的对话系统 2.基于统计机器学习的…

spring-junit4_基于Spring的应用程序-迁移到Junit 5

spring-junit4这是关于将基于Gradle的Spring Boot应用程序从Junit 4迁移到闪亮的新Junit 5的快速文章。Junit 4测试继续与Junit 5 Test Engine抽象一起工作&#xff0c;该抽象为在不同编程模型中编写的测试提供支持。例如&#xff0c;Junit 5支持能够运行JUnit 4测试的Vintage …

如何理解 inode

一、inode是什么&#xff1f; 理解inode&#xff0c;要从文件储存说起。 文件储存在硬盘上&#xff0c;硬盘的最小存储单位叫做"扇区"&#xff08;Sector&#xff09;。每个扇区储存512字节&#xff08;相当于0.5KB&#xff09;。 操作系统读取硬盘的时候&#xff0c…

go语言os.exit(1)_Go语言-信号os.Interrupt和信号syscall.SIGTERM的应用

实例package mainimport("fmt""os""os/signal""sync""syscall""time")func worker(stop for {select {case fmt.Println("exit")returndefault:fmt.Println("running...")time.Sleep(3)}}}fu…

深度学习基本概念笔记

注意力机制(Attention Mechanism): 注意力机制受到人类视觉注意力机制的启发&#xff0c;即关注图像特定部分的能力。即当神经网络发现输入数据的关键信息后&#xff0c;通过学习&#xff0c;在后继的预测阶段对其予以重点关注。 Attention Mechanism可以帮助模型对输入的X每个…

java api 开发_Java开发人员应该知道的前20个库和API

java api 开发优秀且经验丰富的Java开发人员的特征之一是对API的广泛了解&#xff0c;包括JDK和第三方库。 我花了很多时间来学习API&#xff0c;尤其是在阅读了Effective Java 3rd Edition之后 &#xff0c;Joshua Bloch建议在Java 3rd Edition中使用现有的API进行开发&#x…

Linux 系统的硬链接和软链接详解

文章目录什么是链接链接用来干什么的硬链接和软链接的区别硬链接和软链接的图示总结我们知道文件都有文件名与数据&#xff0c;这在 Linux 上被分成两个部分&#xff1a;用户数据 (user data) 与元数据 (metadata)。用户数据&#xff0c;即文件数据块 (data block)&#xff0c;…

js如何监听元素事件是否被移除_JavaScript 监听元素是否进入/移出可视区域

JavaScript 监听元素是否进入/移出可视区域常规操作防抖节流IntersectionObserver兼容的代码常规操作通常的做法是&#xff0c;监听srcoll事件&#xff0c;根据元素的offset来判断。window.addEventListener(scroll, this.scrollHandle, true);使用getBoundingClientRec()来获取…

人工智能领域论文常见基本概念笔记

BLEU分数: 一个比较候选文本翻译与其他一个或多个参考翻译的评价分数。 AUC: 衡量学习器优劣的一种指标&#xff0c;Roc曲线下与坐标轴围成的面积(0.5~1),越接近1&#xff0c;检测方法真实性越高。 Image Caption: 一般有几种叫法&#xff1a;图像描述&#xff0c;图像标注…

okta-spring_通过Okta的单点登录保护Spring Boot Web App的安全

okta-spring“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 您可以使用SpringBoot和Okta在不到20分钟的时间内启动具有完整用户身份和…