【问题标题】:How to approach CI如何接近 CI
【发布时间】:2011-12-05 14:23:39
【问题描述】:

我正在从头开始建立一家公司(Tomcat+Spring Rest+Java),所以我们可以奢侈地做一些正确的事情(或者在列表中不要重复我们过去的错误),这是我们想要的目标之一实现的是自动构建、测试(单元、集成)和部署的能力。

我们的平台是由一个静态 HTML/JS 接口站点构建的,该站点由 NGiNX 和一些 API 服务器(不同的应用程序)提供服务,其中一些是公开的,其中一些只能通过公开的 API 应用程序从农场内部访问。

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

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

  1. 开发健全性:从 git 签出,运行 DB 脚本以准备数据库,执行全新安装的 maven 目标(因此我们的 testng 套件正在执行),执行代码覆盖率和静态代码分析 此配置正在执行,非常棒。

  2. 集成:从 git 签出,运行 DB 脚本以准备 Database,执行全新安装的 maven 目标(因此正在执行我们的 testng 套件)

现在我已经到了有问题的部分,在我们的集成测试开始之前,我们的配置需要将几个 .war 文件部署到不同的机器上,而且我想以这样一种方式构建它,以便我能够添加第三个配置将在集成通过后部署到实时生产,因此它与第二个配置基本相同,但添加了一些功能,例如关闭应用程序并在优雅部署后将其重新上线,我已经看到了几种方法这该怎么做 来自 maven cargo、shell 脚本、fabric 等......

根据你过去的经验,有没有推荐的方法来处理这幅画? 我也不清楚运行涉及要部署的多个应用程序的集成测试的最佳方法是什么,我已经看到了许多嵌入式码头等示例。但这仅适用于一个应用程序或当您需要时非常简单的配置在您开始测试之前要部署 3-4 个应用程序,最好的方法是什么?添加另一个专门用于集成测试的项目,并在部署完成后使用特定配置文件执行另一个 maven 目标?

顺便说一句 - 部署到 AWS

谢谢各位。

【问题讨论】:

    标签: continuous-integration amazon-web-services integration-testing


    【解决方案1】:

    首先,我强烈建议您阅读持续交付(Jez Humble、David Farley),其中包含大量相关信息。有一个sample chapter here

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

    1. 提交阶段 - 开发健全性 - 编译、单元测试和一些指标。这 初始阶段还构建其余部分所需的二进制文件 管道
    2. 集成阶段 - 这需要与 上一阶段(不是新的结帐)并在 记忆
    3. 自动化验收测试阶段 - 从 提交阶段并部署到我们运行 selenium 测试的服务器
    4. QA 阶段 - 这是由 QA 部署的,他们只需单击按钮即可拉取 无论他们想要什么构建,它只是部署二进制文件 从提交阶段到 QA 服务器
    5. UAT - 与 QA 相同,但更类似于生产环境,我们还进行性能测试
    6. 生产环境 - 从提交阶段获取二进制文件并部署到生产环境。

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

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

    Here's 带有构建管道插件的 jenkins 中的管道是什么样的。

    [编辑]

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

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

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

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

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

    【讨论】:

    • 这看起来是一个很好且定义明确的方法,你们花了多少时间来实施它?您能否在技术上更具体地了解您如何实施硒测试(不同的项目?)和部署?
    • 正如我所说的 - '我已经开始实施' - 所以这还没有完成 - 我会用更多信息更新我的答案。
    • 你完成过这个吗?看看你是如何实现它的会很有趣。
    猜你喜欢
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多