如何处理CI

Amn*_*non 6 continuous-integration integration-testing amazon-web-services

我正在从头开始建立一家公司(Tomcat + Spring Rest + Java),所以我们有幸做一些正确的事情(或者列出不重复我们过去的错误),我们想要达到的目标之一是能力自动构建,测试(单元,集成)和部署.

我们的平台构建了一个静态HTML/JS界面站点,配备NGiNX和一些API服务器(不同的应用程序),其中一些是公开的,其中一些只能通过公开的API应用程序从服务器场内访问.

我选择了TeamCity作为CI服务器,因为我对它有点熟悉,到目前为止我对Jetbrain的所有产品都有很好的体验.

到目前为止,我已经定义了两个构建配置

  1. 开发健全:从git中检出,运行DB脚本来准备数据库,执行干净安装的maven目标(这样我们的testng套件正在执行),执行代码覆盖和静态代码分析这个配置正在执行并且很棒.

  2. 集成:从git中检出,运行数据库脚本来准备数据库,执行干净安装的maven目标(所以我们的testng套件正在执行)

现在我已经到达了有问题的部分,我们的配置需要在我们的集成测试开始之前将几个.war文件部署到不同的机器上,我也希望以这样的方式构建它以便我能够添加第三个配置一旦Integration通过,它将部署到实时生产,所以它基本上与第二个配置相同但添加了一些功能,例如关闭应用程序并在优雅地部署后将其重新联机,我已经看到了几种关于如何做的方法这来自maven货物,shell脚本,面料等......

有关如何从过去的经历中获取此绘图的推荐方法吗?另外我不清楚运行集成测试的最佳方式是什么,涉及几个应用程序要部署,我已经看过许多嵌入式jetty等的例子..但这只适用于一个应用程序或非常简单的配置,当你需要时在你开始测试之前要部署3-4个应用程序,最好的方法是什么?添加另一个专门用于集成测试的项目,并在部署完成后使用特定的配置文件执行另一个maven目标?

BTW - 部署到AWS

多谢你们 .

bla*_*ank 4

首先,我强烈建议您阅读《持续交付》(Jez Humble、David Farley),其中有大量关于这方面的信息。这里有一个示例章节

自从阅读本文后,我开始实现一个构建管道,其中对 svn 的每次提交都会经历管道中的每个阶段,随着构建的进行,环境逐渐变得更像生产环境。我们为此使用 Jenkins。

  1. 提交阶段- 开发理智 - 编译、单元测试和一些指标。这个初始阶段还构建了管道其余部分所需的二进制文件
  2. 集成阶段- 这采用与前一阶段相同的文件(不是新的签出)并在内存中运行数据库集成测试
  3. 自动验收测试阶段- 从提交阶段获取二进制文件并部署到我们运行 selenium 测试的服务器
  4. QA 阶段- 这是由 qa 部署的,他们只需单击一个按钮即可拉取他们想要的任何构建,同样它只是将二进制文件从提交阶段部署到 QA 服务器
  5. UAT - 与 QA 相同,但更像生产环境,我们也进行性能测试
  6. 生产- 将二进制文件从提交阶段获取并部署到生产。

每个阶段都充当“质量门” - 构建在通过某个阈值之前不允许进一步进行 - 测试失败、指标 %s 等。某些阶段自动流动,其他阶段则手动触发。每个环境所需的任何配置更改都是通过解压缩原始二进制文件、更改设置、再次打包来完成的 - 理想情况下,我想将配置与应用程序二进制文件分开,但尚未找到实现这一点的方法。

自动验收测试阶段仅更新服务器上的现有应用程序 - qa 阶段执行完整的停止、卸载、安装和启动操作。每个都运行不同的脚本 - ant 和 python 的组合。

这是带有构建管道插件的詹金斯管道的样子。

[编辑]

实际上,您不必一次性实现每个阶段,很容易为每个阶段设置占位符,这些占位符只是流到下一个阶段,而无需实际执行任何操作。如果您映射当前的流程,您应该能够自动化其中的一部分,并一点一点地走向管道。

提交阶段是最容易做的,它基本上就是您在设置普通 CI 服务器、创建项目、将其连接到版本控制、编译、执行测试、运行一些统计数据(所有这些都来自 ant/maven 任务)时要做的事情。运行时间需要 5 分钟多一点。

统计任务运行时间太长(> 15 分钟),因此我在提交时运行一个子集,并每晚运行一次,执行所有 Findbugs、PMD、Checkstyle 和 Cobertura。我更愿意在提交时运行所有这些,但这需要更多的硬件和工作来设置某种构建网格。

Selenium 测试目前不在一个单独的项目中,但它们被打包为一个单独的 jar,并且通过 jenkins 的“复制工件”插件可用于自动验收测试阶段 - ant/python 脚本打包 WAR 文件并部署到容器,然后 ant 解压并运行 Selenium 测试(通过 junit)。目前只有少数“冒烟测试”,并且它们不依赖于主要的战争,尽管我可能会看到这种变化。我实际上不喜欢为代码和测试建立单独的项目的想法 - 构建脚本只是打包主项目中每个模块所需的类和库 - 对于您的情况(很快,我们的情况)您可能需要做一些事情不同 - 如何使用您需要的配置启动一两个虚拟机并部署到该虚拟机上。(《持续交付》一书中有很多关于这方面的信息)

很高兴 Jenkins 通过插件支持很多这样的功能 - 我们从 Atlassian Bamboo 迁移,因为我们想要的大部分内容都不可用,并且现有插件要么无法工作,要么与 Bamboo 版本不兼容。我有一段时间没有使用 Team City,所以我不知道它是否支持“管道”的想法[显然不]。“构建管道”插件相当新,有一些粗糙的边缘,但正在积极开发中 - 我认为可以使用 Jenkins 的“升级构建”和试金石构建来做到这一点,但尚未尝试过。如果您有足够的资源(金钱!),您可能想看看Go