用于Spring Boot微服务的CI / CD:第1部分

在本教程中,我们将学习持续集成和交付如何帮助我们测试和准备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工作流程将:

  1. 下载Java依赖项。
  2. 生成应用程序JAR。
  3. 运行测试和基准测试。 而且,如果一切顺利...
  4. 创建一个Docker映像并将其推送到Docker Hub。

但是首先,请在Semaphore中打开浏览器并使用Gi​​tHub帐户进行注册; 这将链接两个帐户。 然后,下载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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值