在本文中,我们将学习如何将Travis CI用于SpringBoot应用程序的持续集成和持续部署(CI / CD)。 我们将学习如何运行Maven构建目标,使用JaCoCo插件,使用SonarCloud代码质量检查,建立泊坞窗图像进行测试覆盖率验证并推DockerHub并最终将其部署到Heroku的 。
上周,我和我的朋友谈论了使用SpringBoot构建Java应用程序并对其进行部署变得多么容易。 在讨论中,有一点提出了关于构建Java应用程序并将其部署到某个地方(云)的成本。 因此,我想探索更多关于免费服务的信息,我们可以使用这些免费服务以最小的成本或根本没有成本使所有项目开发活动自动化。
几年前,我使用CloudBees和CloudFoundry构建并部署了提供免费托管服务的宠物项目,但它们不再提供免费服务。
过去,我仅将Travis CI用于Java项目只是为了进行初步测试,但查看它们的文档后,我意识到它们提供了很多功能。
因此,我想检查一下是否可以将Travis CI用于我的项目,以执行所有常规任务,例如:
- 签出最新代码
- 编译并运行单元和集成测试
- 运行JaCoCo代码覆盖率,如果未达到所需的百分比,则构建失败
- 运行SonarQube代码质量检查
- (可选)构建Docker映像并将其发布到Docker Hub
- 在一些免费的云托管服务(如Heroku或OpenShift)上部署应用程序
在阅读了他们的文档之后,我意识到我们可以通过使用一些免费的在线服务以及与Travis-CI的集成来完成所有这些任务。
- GitHub代码存储库
- SonarCloud免费的SonarQube服务
- 用于发布Docker映像的Docker Hub
- Heroku用于部署应用程序
让我们看看如何使用Travis-CI对SpringBoot项目执行上述所有任务。
步骤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: oraclejdk8
script:
- ./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: oraclejdk8
env:
global:
- secure: "....encrypted sonar token here....."
addons:
sonarcloud:
organization: "sivaprasadreddy-github"
token:
secure: $SONAR_TOKEN
script:
- ./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: required
services:
- 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: heroku
api_key: $HEROKU_API_KEY
app: freelancerkit
现在,完整的.travis.yml文件将如下所示:
sudo: required
language: java
jdk: oraclejdk8
services:
- docker
env:
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_TOKEN
script:
- ./mvnw clean install -B
- ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar
after_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;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;gt;&amp;amp;amp;amp;amp;lt;/span&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_NAME
deploy:
provider: heroku
api_key: $HEROKU_API_KEY
app: 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