如何阻止Chef部署失败测试的代码?

时间:2012-12-30 18:01:44

标签: continuous-integration chef continuous-deployment

在过去的一周里,我一直在为厨师做准备,并准备(情绪和操作上)停止使用Capistrano。 (我们正在托管Rails应用程序。)

我们遵循GitHub流程,这意味着我们只有主人和一大堆功能分支。现在我们使用Jenkins进行持续集成和持续部署,我们使用Capistrano将master部署到我们的服务器 - 但只有在我们的单元,集成和验收测试通过之后。

我正在使用Chef的deploy_revision资源,我对它的工作情况感到非常兴奋。我渴望从“推”到“拉”。但除非我们的测试已通过,否则我不想部署代码。我坚持在实现这种效果的替代方法之间做出选择:

  1. 指向标记的主厨(例如2.0),并在我们的部署配方中定期更新该标记。 (我不喜欢这个,因为它不是真正的持续部署。我们现在每次想要发布它时都会手动保存我们的代码。)
  2. 分支机构的Point Chef,在测试套件通过后让Jenkins合并master -> release。 (我不喜欢这个,因为现在我的Jenkins服务器对我的存储库具有读/写访问权限。)
  3. 不要将Chef配置为定期运行,而是让Jenkins通过SSH运行chef-client。 (我不喜欢这个,因为我期待有一天我们的Jenkins机器不再有SSH访问我们的服务器。)
  4. 部署代码,但如果之后测试失败则还原提交。 (在我看来,太容易出错了。)
  5. 我认为我已经完成了足够的功课。我一直在关注Steve Jang's thorough write-up等等,并花了好几个小时的时间来Chef docs。但是在与Chef持续部署的所有优秀社区教程中,我没有看到任何关于这个特定用例的提及。

    我可以忍受上面的大部分选项,但如果我知道这是一种行之有效的方法,我会感觉更好。我相信其他组织已经解决了这个问题。你是怎么做到的?

2 个答案:

答案 0 :(得分:2)

您可以设置一个小脚本来监听Jenkins的产品并为您运行厨师 - 换句话说,为Jenkins进行有限形式的触发访问,不需要完全SSH访问。

另一种选择是Jenkins合并master - >的存储库的单独克隆。 release进入,这不是您的开发存储库。然后让Chef从那里拉出来(或者让Chef在那里查找修订版本,然后从原始存储库中提取该修订版本,这会让您更有信心,没有人人为地搞砸了它们之间的提交)。

答案 1 :(得分:0)

我使用的一个解决方案是保护环境变量背后的厨师食谱中的实际代码部署(具体来说,ENV['deploy_build'])。与实际部署代码无关的所有内容都留在配方中的这些警卫之外,厨师 - 客户每半小时都会愉快地运行,确保基本系统准备就绪。

当构建和测试运行成功时,构建系统将触发以下形式的ssh:

ssh deploy_system deploy_build=true chef-client

允许配方部署最新版本。这有助于特别是因为我们的构建系统需要按特定顺序将更新部署到服务器,因此它可以从构建系统(jenkins)进行编排