【发布时间】:2014-05-31 20:32:15
【问题描述】:
我们有两个环境,DEV 和 PROD。每个环境有 3 个节点:
- 开发
-
devapp01(雄猫) -
devapp02(Tomcat;与 01 相同且负载均衡) -
devdb01(MySQL)
-
- 产品
-
app01(雄猫) -
app02(Tomcat;与 01 相同且负载均衡) -
db01(MySQL)
-
Tomcat 实例服务于 CI 构建生成的 WAR。
我们需要将所有 DEV 机器上的软件堆栈配置为与 PROD 上的相同。我们设置了一个简单的 Chef 服务器来管理所有节点上的配置,并为应用程序和数据库服务器创建了配方。
在 Chef 服务器上,我们目前有一个自动更新功能,该功能每 30 分钟运行一次,以检查所有节点并确保它们与各自的食谱同步。我们的内部“厨师”(系统管理员)设置所有内容的方式,有一个配方的一部分对 Tomcat 的webapps 目录进行存在性检查以确定是否应该执行更新。换句话说,如果 Tomcat 的 webapp 目录中已经有 WAR,那么当自动更新每 30 分钟运行一次时,由于 webapps 不为空,Chef 不会去 CI 服务器并拉入新的战争。
为了解决这个问题,我们的厨师制作了一个“clean slate”配方,该配方将首先从 Tomcat 的 webapps 目录中删除爆炸的 WAR。因此,只要该配方首先执行,TOMCAT_HOME/webapps 就会在 Tomcat 检查之前执行;然后它将自己从 Chef 运行列表中删除。他删除的理由是——在生产中——如果我们是 总是删除 Tomcat 的 webapps 目录,然后我们将每 30 分钟重新部署一次 prod 节点。
所以在 DEV 上,我们确实希望每个 CI 构建都生成一个新的 WAR,并将其部署到我们的 Tomcat 实例 (devapp01/02)。在 PROD 中,我们希望手动启动部署,根据厨师如何配置所有内容,这涉及手动添加 clean slate recipe 以便 CI 服务器可以部署新的 WAR。
我想知道其他人/团队过去如何结合使用 CI 和 Chef,以及他们是否遇到了类似的问题。我的具体问题是:我们如何才能让 CI 驱动所有 DEV 部署,但仍然让 PROD 部署成为手动过程?
【问题讨论】:
标签: continuous-integration chef-infra