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

Continuous integration 如何阻止Chef部署测试失败的代码?,continuous-integration,chef-infra,continuous-deployment,Continuous Integration,Chef Infra,Continuous Deployment,在过去的一周里,我一直在加强对Chef的控制,并准备(从情感上和操作上)停止使用Capistrano。(我们正在托管一个Rails应用程序。) 我们遵循GitHub流程,这意味着我们只有master和一整套功能分支。现在我们使用Jenkins进行持续集成和持续部署,我们使用Capistrano将master部署到我们的服务器上——但只有在我们的单元、集成和验收测试通过之后 我正在使用Chef'sdeploy\u revisionresource,我为它的工作效果感到激动。我渴望从“推”到“拉”。

在过去的一周里,我一直在加强对Chef的控制,并准备(从情感上和操作上)停止使用Capistrano。(我们正在托管一个Rails应用程序。)

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

我正在使用Chef's
deploy\u revision
resource,我为它的工作效果感到激动。我渴望从“推”到“拉”。但我不想部署代码,除非我们的测试已经通过。我被困在实现这一效果的两种备选方法之间的选择上:

  • 将Chef指向一个标签(例如
    2.0
    ),并在我们的部署方案中定期更新该标签。(我不喜欢这样,因为它不是真正的连续部署。现在,每当我们想要发布代码时,我们都会手握代码。)
  • 将厨师点在分支,让Jenkins在测试套件通过后合并
    master->release
    。(我不喜欢这样,因为现在我的Jenkins服务器对我的存储库具有读/写访问权限。)
  • 不要将Chef配置为定期运行,而是让Jenkins通过SSH运行Chef客户端。(我不喜欢这样,因为我期待着有一天我们的Jenkins机器不再具有对服务器的SSH访问权。)
  • 部署代码,但如果测试失败,则恢复提交。(在我看来,太容易出错了。)
  • 我想我已经做了足够的家庭作业了。除其他外,我一直在跟踪,并在网上花了数小时。但是在所有关于Chef持续部署的优秀社区教程中,我没有看到任何关于这个特定用例的提及


    我可以接受上面的大多数选择,但如果我知道这是一种行之有效的方法,我会感觉更好。我相信其他组织已经解决了这个问题。您是如何做到的?

    您可以设置一个小脚本,用于侦听Jenkins的提示并为您运行chef—换句话说,为Jenkins创建一种不需要完全SSH访问的有限形式的触发访问


    另一个选择是拥有一个单独的存储库克隆,Jenkins将
    master
    ->
    release
    合并到该存储库中,该存储库不是您的开发存储库。然后让Chef从那里调出(或者让Chef在那里查找修订,并从原始存储库中调出该修订,这会让您更加确信没有人人为地在两者之间弄乱了提交)。

    我使用的一个解决方案是在环境变量后面保护Chef配方中实际部署的代码(特别是,
    ENV['deploy_build']
    )。所有与实际部署代码无关的东西都留在了配方中的这些警卫之外,chef client每半小时都会愉快地运行一次,确保基本系统准备就绪

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

    ssh-deploy\u-system-deploy\u-build=true-chef-client


    这使得配方能够部署最新的构建。这尤其有助于我们的构建系统需要以特定的顺序将更新部署到服务器,以便可以从构建系统进行编排(jenkins)

    谢谢你,Amber,这些都是很好的建议。我可以使用后一个选项运行,这样我仍然可以定期运行
    chef client
    进行基础设施更新,而不必更新我们的代码。你有没有将类似的东西付诸实践?@AlexL.类似。如果你查看构建的Git部分的高级配置,那么这里有使用多个存储库的选项。您可以设置一个单独的存储库URL,将成功的构建推送到该存储库。嘿,我甚至没有看到。对于其他任何人来说,在Jenkins作业中,该选项位于SCM>Git>Advanced>Merge options>Merge before build下。(需要单击几下才能看到它。)我将对此进行破解。再次感谢!因此部署配方将查看
    deploy\u build
    的值,如果
    true
    ,配方将继续,一旦完成,它将
    deploy\u build
    设置为false,以便下次自动运行时不会触发部署?