【发布时间】:2012-12-15 02:44:18
【问题描述】:
上周我一直在加强 Chef,并准备(在情感上和操作上)停止使用 Capistrano。 (我们正在托管一个 Rails 应用程序。)
我们遵循 GitHub 流程,这意味着我们只有 master 和一系列功能分支。现在我们使用 Jenkins 进行持续集成和持续部署,并且我们使用 Capistrano 将master 部署到我们的服务器 - 但只有在我们的单元、集成和验收测试通过之后。
我正在使用 Chef 的 deploy_revision 资源,我对它的运行效果感到非常兴奋。我渴望从“推”到“拉”。但除非我们的测试通过,否则我不想部署代码。我被困在实现这种效果的替代方法之间的选择:
- 将 Chef 指向一个标签(例如
2.0),并在我们的部署配方中定期更新该标签。 (我不喜欢这样,因为它不是真正的持续部署。我们现在又回到了每次想要发布代码时都手持代码的方式。) - Point Chef 在一个分支,在测试套件通过后让 Jenkins 合并
master -> release。 (我不喜欢这样,因为现在我的 Jenkins 服务器对我的存储库具有读/写访问权限。) - 不要将 Chef 配置为定期运行,而是让 Jenkins 通过 SSH 运行
chef-client。 (我不喜欢这样,因为我期待有一天我们的 Jenkins 机器不再拥有对我们服务器的 SSH 访问权限。) - 部署代码,但如果之后测试失败,则恢复提交。 (在我看来太容易出错了。)
我确实认为我已经完成了足够多的功课。我一直在关注Steve Jang's thorough write-up 等,并在Chef docs 上花费了数小时的时间。但是在所有关于使用 Chef 进行持续部署的优秀社区教程中,我没有看到任何提及这个特定用例的内容。
我可以接受上述大多数选项,但如果我知道这是一种行之有效的方法,我会感觉更好。我相信其他组织已经解决了这个问题。你是怎么做到的?
【问题讨论】:
标签: continuous-integration chef-infra continuous-deployment