自动化基础架构中的系统测试

测试很重要!我们都知道这一点。但是我们如何适当地自动化测试,以及如何将系统测试集成到自动化部署系统中?

在当今软件交付的世界中,基础设施的自动化已经成为提供一致性和可靠性的关键组件。我们可以轻松地“启动”成千上万个虚拟机,这掩盖了一个事实,即需要考虑的基础设施非常复杂。

虚拟化,网络,安全性,存储和其他技术的复杂性要求在适当的配置方面具有适当水平的专业知识。 以下是一个简单的Spring-Boot服务可用于使用Docker for AWS的基础架构的各种配置的小样本:

  • IAM policies
  • VPC(s)
  • Elastic Load Balancer(s)
  • Subnets
  • Security Groups
  • Route 53 Hosted Zones
  • EC2 AMI(s)
  • Network Interfaces
  • Autoscale Groups
  • Docker images / DockerHub
  • Volumes
  • RDS Instance(s)

我们怎么知道基础架构是否正确呢

考虑系统测试。 系统测试提供了一种有效的方法,可以验证软件及其支持环境是否符合您的功能和非功能要求。

系统测试的实际效果如何?

我们为客户机执行的一个示例是模拟集群成员在生产负载期间停止的效果。使用完全集成的stg环境,我们测量了对客户端延迟的影响、客户端接收到的HTTP错误计数和服务器性能指标。

这些数据是在集群加载和删除成员并重新引入时收集的。通过LoadUI模拟负载,使用SoapUI断言收集客户端指标。这个测试的结果帮助我们了解在减少可用成员时集群可以支持的容量。它还确认了新成员的添加进展顺利,对客户端或其他集群成员没有影响。 当然 你也可以使用jmeter gatling 等性能测试工具来检测集群的性能。

自动化基础设施的系统测试

利用云提供商(如Amazon Web Services、Microsoft Azure或谷歌Compute test)中的自动化基础设施的组织,以确保其基础设施配置支持弹性。Netflix在开发开源工具以禁用基础设施方面处于领先地位(例如Chaos Monkey)。这些停机通常会测试以下特性:

  • 容器自我修复
  • 自动缩放组
  • DNS故障转移
  • 弹性负载平衡
  • 多可用区故障转移
  • 多区域故障转移

结合开源API测试工具(如SoapUI,postman)或API测试框架(如Ready!,supertest,httpclient等)的强大功能 使用API​​,您可以模拟系统级中断,并深入了解基础架构的行为。

敏捷API开发入门指南

我最近有机会与SmartBear Software合作获得了新的教育资源:《敏捷API开发入门指南:API交付中的DevOps,CI和CD》。 除了分享用于系统测试的最佳实践之外,我还将研究如何选择和实施正确的工具如何改变您的API交付策略。

我们来看:

API开发环境的变化,以及它们给寻求发展的组织带来的挑战和机遇

什么是DevOps? DevOps组织中的API团队的结构如何?

在DevOps中,什么是持续集成/持续交付? 您如何确定最适合您的API团队的方法?

现代软件交付的最佳实践,以及与之配套的工具的详尽说明

CI / CD是什么?

CI/CD代表持续集成和持续交付。持续集成(CI)是开发人员和测试人员协作验证新代码的过程。CI使开发人员能够执行频繁的迭代构建。尽早发现问题可以更容易、更快地修复bug。持续交付(CD)是确保应用软件随时可以部署的过程。部署应该与按下按钮一样简单,而且回滚是无缝的。

CI/CD是DevOps的关键支柱,它是一种协作和集成的哲学和实践,以持续快速地交付和实现业务目标。要了解更多关于DevOps和实际实践的信息,请阅读本系列。

了解工作流程

我们将介绍一个简单的CI实施,在其中我们将创建一个工作流程,该流程将自动执行以下步骤:

从代码存储库克隆项目。 为简单起见,我已将GitHub中API Builder的默认“ myproject”作为示例应用程序代码提交。 该应用程序包括一些我们可以用来验证构建过程的API。

生成/编译项目。 我们将使用API​​ Builder项目随附的Dockerfile构建Docker映像。

将映像作为Docker容器运行。

测试。 执行curl命令以验证应用程序的API(例如/ api / greet)。

为了安排这些步骤,我们将使用Jenkins作为CI自动化工具。 Jenkins是一个具有很多社区支持的开源工具,并且有多个插件可用于将工具集成到CI / CD工具链中。 为了在Jenkins中实现工作流程,我们将配置Jenkins Pipeline,其中包括构建应用程序,对其进行测试然后进行交付的阶段。

要求

我们暂时不需要注册任何外部解决方案,因此以下是您所需的最低要求:

在您的服务器或本地计算机上安装了Docker

可以连接到Internet的服务器

安装Jenkins

让我们开始安装Jenkins。 我们将Jenkins作为Docker容器运行,因此我们无需执行手动安装步骤。

确保您的服务器中已经安装了Docker。

执行以下命令(大约需要2分钟)

> docker run -d --name myjenkins -p 9081:8080 -v /var/run/docker.sock:/var/run/docker.sock jocotech/jenkins-docker

跟踪的示例输出:

Unable to find image 'jocotech/jenkins-docker:latest' locally
latest: Pulling from jocotech/jenkins-docker
cd8eada9c7bb: Already exists
c2677faec825: Already exists
fcce419a96b1: Already exists
045b51e26e75: Already exists
88e50f3a5916: Already exists
9db1045008ba: Pull complete
5ba72089e00c: Pull complete
810bdb5dd91f: Pull complete
62b563475556: Pull complete
a2a2a4696ad5: Pull complete
bafbaa3dc29c: Pull complete
e95108b76c18: Pull complete
b576d217ee87: Pull complete
22ea7e4b05ac: Pull complete
52f6bbc55d53: Pull complete
fb1b8b8d85a8: Pull complete
d3e97125d2d4: Pull complete
6724e249196a: Pull complete
1541ce6ca956: Pull complete
bb2f94277986: Pull complete
2b8e2dfef6c1: Pull complete
6672118ddcb6: Pull complete
8fcbc06a30cc: Pull complete
bfa5fcef83ed: Pull complete
513e5fa6617a: Pull complete
Digest: sha256:ca0771afe4c0b0b3feea6d28885e49f019a08a6b5570194f1218c3cdcac95a56
Status: Downloaded newer image for jocotech/jenkins-docker:latest
9661f4ecaf0782d7461d4246222de4794fcfbdd56f1768e1f50a9b4345426a52

参数解释

让我们来看看每个参数。

docker run: -d –name myjenkins -p 9081:8080 -v /var/run/docker.sock:/var/run/docker.sock jocotech/jenkins-docker


以分离模式运行容器,并将其命名为myjenkins:

-d --name myjenkins

Jenkins浏览器接口将通过主机的系统端口9081进行访问,该端口绑定到容器端口8080的内部(Jenkins服务在此监听)。

-p 9081:8080

将主机的Docker套接字装入容器中。这将允许Jenkins容器使用主机的Docker守护进程来构建映像并运行容器

-v /var/run/docker.sock:/var/run/docker.sock

这是一个预先构建的Jenkins图像与Docker二进制文件。这是用于构建此映像的Dockerfile

jocotech/jenkins-docker

验证

运行此命令以验证Docker主机和容器挂载是否工作

> docker exec myjenkins docker images

输出

REPOSITORY                            TAG                 IMAGE ID            CREATED             SIZE
jocotech/jenkins-docker               latest              8591474b374f        3 days ago          1.17GB

如果它返回“connect: permission denied”错误(这在一些linux发行版上发生),执行这个命令来修复权限错误

> docker exec -u root myjenkins chmod 666 /var/run/docker.sock

运行此命令以检查Jenkins容器是否正在运行

docker ps

CONTAINER ID  IMAGE                    COMMAND                  CREATED        STATUS        PORTS                                                           NAMES
8591474b374f  jocotech/jenkins-docker  "/sbin/tini -- /us..."   2 minutes ago  Up 2 minutes  0.0.0.0:50000->50000/tcp,0.0.0.0:9081->8080/tcp         myjenkins

使用此命令获取初始管理密码

>docker exec -it myjenkins cat /var/jenkins_home/secrets/initialAdminPassword

输出

8340d7cbd92440f8857a43f0463efd49

通过浏览器使用以下url启动Jenkins: http://localhost:9081,粘贴密码,然后继续:

选择安装建议的插件

这将显示正在安装的不同插件:

在下一个屏幕上,选择Continue as admin,然后保存并完成

现在,Jenkins的安装已经完成。点击开始使用Jenkins

这是Jenkins的主页,也叫Jenkins dashboard

pipeline说明

让我们来看看必须执行的流水线的不同步骤。 第一步是从GItHub存储库复制API Builder项目。 无需GitHub凭据即可访问此项目。

     stage('Clone API Builder project'){

       脚步 {

         git'https://github.com/jocotech/apib-default'

       }

     }

接下来,此脚本将构建应用程序的docker映像,并将其标记为myproject并标记为1。

  stage('Build Docker image') {
      steps{
        script {
           docker.build "myproject:1" 
        }
      }
    }

然后,将应用程序作为标有myproject的Docker容器运行,它将监听端口8080。

  stage('Run Docker Container') {
      steps{
        sh "docker run -d --name myproject  -p 8080:8080 myproject:1"
      }
    }

最后一步是测试并调用默认API。 该API将返回Howdy Joel作为成功响应。

   stage('Test API') {
      steps{
        sh "curl http://server-ip:8080/api/greet?username=joel"
      }
    }

请注意,您需要用服务器的IP地址替换server-ip。

返回到Jenkins仪表板。 现在,我们可以通过选择“新建项目”来创建工作。 输入作业名称(例如CICD-Part1),选择“管道”,然后单击“确定”。

复制下面的完整pipeline脚本

pipeline {
  agent any
   stages {
    stage('Clone API Builder project') {
      steps {
        git 'https://github.com/jocotech/apib-default'
      }
    }
    stage('Build Docker image') {
      steps{
        script {
           docker.build "myproject:1" 
           sh "docker images"
        }
      }
    }
    stage('Run Docker Container') {
      steps{
        sh "docker run -d --name myproject  -p 8080:8080 myproject:1"
        sh "docker ps"
      }
    }   
    stage('Test API') {
      steps{
        sh  "sleep 4"
        sh "curl http://server-ip:8080/api/greet?username=joel"
      }
    }    
  }
}

请记住将server-ip替换为服务器的IP地址。

向下滚动到“管道”部分,粘贴脚本,然后保存。

现在,我们准备执行管道。 单击立即生成以触发作业。

这将显示每个步骤的状态和持续时间。 如果球变成蓝色,则作业成功。 请注意,执行所有步骤只花了不到一分钟的时间。

我们还可以通过单击作业编号并选择控制台输出来查看管道执行的完整跟踪。

在控制台输出的底部,我们应该看到最终状态以及API响应“ Howdy joel”。

而已。 我们已经通过Jenkins配置并成功运行了CI管道。

清理

要清理并删除管道创建的docker映像和容器,请运行以下命令:

docker stop myproject docker rm myproject docker rmi myproject:1

或者使用这个示例脚本创建另一个jenkins作业来实现自动化

pipeline {
  agent any
  stages {
    stage('Clean up Part1') {
      steps{
        sh "docker stop myproject"
        sh "docker rm myproject"
        sh "docker rmi myproject:1"
      }
    }    
  }
}

摘要

在这篇文章中,我们看到了安装Jenkins并为API Builder项目运行一个简单的Continuous Integration过程非常容易。 实施CI流程后,每个代码签入均由自动构建进行验证,从而使团队可以及早发现错误。 请继续关注下一部分,该部分将介绍连续交付过程。