在本教程中,我们将学习持续集成和交付如何帮助我们测试和准备Docker的Java应用程序。
持续集成(CI)是一种软件工程实践,其中,我们在每次更新时都测试我们的代码。 这种做法会创建一个强大的反馈循环,一旦发现错误,就会立即发现错误。 因此,我们可以花更多的时间来编码功能,而不是寻找错误。
一旦对代码有信心,就可以继续进行持续交付(CD)。 持续交付需要完成发布的所有步骤,因此每个成功的更新都将具有一个相应的程序包-可供部署。
我们将使用Docker进行打包,因为它在所有云提供商中得到了普遍支持。 此外,对于更高级的部署(例如Kubernetes),Docker是必需的。 在本教程的第二部分中,我们将学习您可以使用“持续部署”(也包括CD)来一键式将新版本部署到Kubernetes的过程。
我认为实践是最好的学校。 这就是为什么我们将进行演示项目。 在执行这些步骤时,您将了解CI / CD如何帮助您更快更好地进行编码。
做好准备
这是您需要入门的清单。
- 您最喜欢的Java开发编辑器和SDK。
- Docker Hub帐户和Docker。
- GitHub帐户和Git 。
- 卷曲以测试应用程序。
让我们准备好一切。 首先,派生带有演示的存储库并将其克隆到您的计算机上。 这是项目的结构:
该应用程序是在Java Spring Boot中构建的,它公开了一些API端点。 它使用内存中的H2数据库。 它将用于测试和开发,但是一旦投入生产,我们将需要切换到其他存储方法。 该项目包括测试,基准测试以及创建Docker映像所需的一切。
这些是我们可以用来测试和运行应用程序的命令:
$ mvn clean test
$ mvn clean test -Pintegration-testing
$ mvn spring-boot:run
该项目与Apache Jmeter一起提供以生成基准:
$ mvn clean jmeter:jmeter
$ mvn jmeter:gui
还包括一个用于创建Docker映像的Dockerfile:
$ docker build -t semaphore-demo-java-spring
CI / CD工作流程
在本节中,我们将检查.semaphore目录中的内容。 在这里,我们将找到CI / CD工作流程的整个配置。
我们将使用信号量作为我们的持续集成解决方案。 我们的CI / CD工作流程将:
- 下载Java依赖项。
- 生成应用程序JAR。
- 运行测试和基准测试。 而且,如果一切顺利...
- 创建一个Docker映像并将其推送到Docker Hub。
但是首先,请在Semaphore中打开浏览器并使用GitHub帐户进行注册; 这将链接两个帐户。 然后,下载sem CLI工具并登录您的计算机:
$ sem connect ORGANIZATION.semaphoreci.com ACCESS_TOKEN
通过单击Semaphore帐户右上角的终端图标可以找到您的身份验证。
最后,使用sem init
将项目添加到Semaphore:
$ cd semaphore-demo-java-spring
$ sem init
持续集成
还请参见: Kotlin的8个主要功能使其比Java更具优势
信号量将始终在.semaphore / semaphore.yml中查找初始管道文件。 管道将信号量完成工作所需的所有配置,环境和命令捆绑在一起。 让我们检查一下CI管道。
姓名和代理
管道以名称和代理开头。 代理是为作业提供动力的虚拟机类型。 Semaphore提供了几种机器类型 ,我们将在Ubuntu 18.04上使用免费套餐e1-standard-2类型。
version: v1.0
name: Java Spring example CI pipeline on Semaphore
agent:
machine:
type: e1-standard-2
os_image: ubuntu1804
工作与障碍
作业定义了赋予CI流程以生命的命令。 作业按块分组。 块中的所有作业完成后,下一个块开始。
第一个块无需运行任何测试即可下载依赖项并构建应用程序JAR。 该块使用检出克隆库和高速缓存来存储和检索Java的依赖关系:
blocks:
- name: "Build"
task:
env_vars:
- name: MAVEN_OPTS
value: "-Dmaven.repo.local=.m2"
jobs:
- name: Build
commands:
- checkout
- cache restore
- mvn -q package jmeter:configure -Dmaven.test.skip=true
- cache store
第二个块有两个作业,一个用于单元测试,一个用于集成测试。 序言中的命令在每个作业之前运行,因此是放置常见设置命令的好地方:
- name: "Test"
task:
env_vars:
- name: MAVEN_OPTS
value: "-Dmaven.repo.local=.m2"
prologue:
commands:
- checkout
- cache restore
- cache restore
- mvn -q test-compile -Dmaven.test.skip=true
jobs:
- name: Unit tests
commands:
- mvn test
- name: Integration tests
commands:
- mvn test -Pintegration-testing
第三块运行基准测试:
- name: "Performance tests"
task:
env_vars:
- name: MAVEN_OPTS
value: "-Dmaven.repo.local=.m2"
prologue:
commands:
- checkout
- cache restore
jobs:
- name: Benchmark
commands:
- java -version
- java -jar target/spring-pipeline-demo.jar > /dev/null &
- sleep 20
- mvn -q jmeter:jmeter
- mvn jmeter:results
促销活动
至此,配置项已完成。 如果代码通过了所有测试,我们可以跳到下一个阶段:持续交付。 我们使用促销活动来链接管道。 CI管道的结尾包括一个促销,如果没有错误,则启动docker构建:
promotions:
- name: Dockerize
pipeline_file: docker-build.yml
auto_promote_on:
- result: passed
持续交付
在本节中,我们将回顾Semaphore如何构建Docker映像。 但是,在运行此管道之前,您必须告诉Semaphore如何与Docker Hub连接。
为了安全地存储密码,信号量提供了秘密功能。 使用您的Docker Hub用户名和密码创建一个秘密。 信号量将需要它们将图像推送到您的存储库中:
$ sem create secret dockerhub -e DOCKER_USERNAME='YOUR_USERNAME' -e DOCKER_PASSWORD='YOUR_PASSWORD'
要查看您的机密信息,请执行以下操作:
$ sem get secret dockerhub
现在我们已经准备好了持续交付管道的所有内容,让我们检查一下它是如何工作的。 打开
.semaphore/docker-build.yml file
。 管道由一个工作块组成一个块:
blocks:
- name: "Build"
task:
env_vars:
- name: MAVEN_OPTS
value: "-Dmaven.repo.local=.m2"
- name: ENVIRONMENT
value: "dev"
secrets:
- name: dockerhub
prologue:
commands:
- checkout
- cache restore
jobs:
- name: Build and deploy docker container
commands:
- mvn -q package -Dmaven.test.skip=true
- echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin
- docker pull "$DOCKER_USERNAME"/semaphore-demo-java-spring:latest || true
- docker build --cache-from "$DOCKER_USERNAME"/semaphore-demo-java-spring:latest --build-arg ENVIRONMENT="${ENVIRONMENT}" -t "$DOCKER_USERNAME"/semaphore-demo-java-spring:latest .
- docker push "$DOCKER_USERNAME"/semaphore-demo-java-spring:latest
在这里,序言将依赖项拉到缓存中。 然后,构建作业将JAR打包到Docker映像中,并将其推送到Docker Hub。 如果高速缓存中有映像,则docker build命令可以运行得更快,这就是为什么管道首先尝试从存储库中提取最新映像的原因。
测试Docker映像
还请参见:您是哪种Java开发人员? 参加我们的Java测验找出答案!
要开始工作流程,请对代码进行任何修改并将其推送到GitHub:
$ touch some_file
$ git add some_file
$ git commit -m "test workflow"
$ git push origin master
转到您的Semaphore帐户以查看管道的工作情况。
我的工作流程
几秒钟后,管道应完成:
工作流程
到目前为止,您的存储库中应该已经有一个就绪的Docker映像。 让我们去吧。 将新创建的映像拉到您的计算机上:
$ docker pull YOUR_DOCKER_USER/semaphore-demo-java-spring:latest
并在您的机器上启动它:
$ docker run -it -p 8080:8080 YOUR_DOCKER_USERNAME/semaphore-demo-java-spring
您可以使用POST请求创建用户:
$ curl -w "\n" -X POST -d '{ "email": "wally@example.com", "password": "sekret" }' -H "Content-type: application/json" localhost:8080/users
{"username":"wally@example.com"}
创建用户后,您可以进行身份验证并查看安全网页:
$ curl -w "\n" --user wally@example.com:sekret localhost:8080/admin/home
<!DOCTYPE HTML>
<html>
<div class="container">
<header>
<h1>
Welcome <span>tom@example.com</span>!
</h1>
</header>
</div>
您也可以在localhost:8080 / admin / home的登录页面上尝试。
结论
您已经设置了第一个CI / CD管道。 有了这个系统,您就可以在代码中进行操作,并确保它不断地受到测试。
在下一个教程中 ,我们将看到如何对Kubernetes集群进行持续部署。
翻译自: https://jaxenter.com/cicd-microservices-docker-162408.html