Ruby on Rails *function*部署的最佳实践?

我们在服务器上运行2个不同的环境 – 比如production.mydomain.com和staging.mydomain.com

暂存环境几乎与生产环境相同,只是它通常有几个正在审查的新function(例如new_user_profile,image_tagging等)。 这些function在不同时间由客户单独接受。

将任何单个function(例如new_user_profile)从暂存升级到生产的最佳方法是什么?

我们的设置如下所示,但您也希望听到您使用的替代方案:

  • Ruby on Rails
  • Git(我们有几个function分支,在接近完成时会合并到一个“分段”分支)
  • Capistrano,多阶段分机。

我们尝试了以下两种方法,两种方法都不是很好:

  1. 在我们的代码中有很多if / else语句,例如new_user_profile ….
  2. 将各个git分支(例如,分支new_user_profile)部署到分段,进行审核,然后合并到生产

如果没有额外的ifs,您最好的选择可能是在准备部署时将function分支合并到master中。 或者,您可以实现function切换模式。 我不知道它有一个共同的gem,但我在自己的项目中使用了类似的模式。 Martin Fowler在这里写了一篇关于function切换的好post,如果你想查看一下。 他提出了一个非常有效的论点,即function分支违背了持续集成的想法。 我不是那么强烈,只要分支机构通过CI服务器,但你的milage可能会有所不同。 我想看一个好的库只使用具有function切换function的块,所以你可以这样做:

with_feature :something do #code that should only be enabled with :something feature end 

虽然不知道一个很好的解决方案。 制作一个gem并把它放在github上:)

使用此工作流程:

  1. 使用master分支作为生产分支,它始终通过测试和可部署
  2. 在Gitlab上使用每个function的分支和GitHub上的Pull请求或Merge请求
  3. 使用CI服务( https://travis-ci.org/,https://circleci.com/ )在合并之前检查新的分支代码
  4. 为http://teatro.io/等阶段使用特殊服务,这将为每个function分支自动创建并行阶段。 将feature-stage的链接发送给客户端。
  5. 合并分支由CI和cutomer测试,以掌握并部署到生产

我认为你应该把每个新function都保留在自己的分支中。 在第一次测试与master合并后,您可以将它与staging合并。

另一种可以尝试git cherry-pick for move commits的方法属于new_user_profilestagingmaster