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