通过多个部署阶段维护Rails环境

时间:2012-06-30 22:44:10

标签: ruby-on-rails performance capistrano loading environment

我一直在使用Capistrano将多个rails应用程序部署到单个EC2实例。这些应用程序都使用Apache + Passenger。其中大部分的部署阶段如下:

- 获取代码,在主应用目录的“releases / [timestamp]”子目录中暂存。

- 运行bundler for staged release

- 运行分阶段发布的迁移

- 运行资产编译(“assets:precompile”)rake任务以进行分阶段发布

- 重新启动delayed_job任务队列处理守护程序和任何其他后台进程

- 将分阶段发布符号链接到“当前”(乘客网络根目录)

- 重启乘客(通过触摸app目录中的“tmp / restart”)

这是一个非常标准的Rails部署过程。我注意到它的一个巨大瓶颈是为每个需要它的任务加载rails环境。对于我的一个较大的应用程序,环境加载需要大约40秒或更长时间,并且对于需要rails环境的n个任务(运行bundler,迁移,资产编译,delayed_job守护程序)重复n次。请原谅这是一个天真的问题,但我想知道是否有一种简单的方法只为所有这些任务加载环境一次(最好比将所有这些任务/作业的实现合并到一个加载的单个rake任务更容易环境)。

2 个答案:

答案 0 :(得分:0)

我建议您查看vagrant。这是一种快速简便的部署方式。它利用chef来定制流浪盒。我想你会想要创建你自己的收件人(一个厨师的东西..)来击中你列出的大多数项目。一旦完成,你就好了。

答案 1 :(得分:0)

更新:我最终为此编制了我自己的解决方案,效果很好。我没有从shell中单独运行依赖于rails环境的每个命令(使用Capistrano“run”方法),而是将它们捆绑在一起,形成一个依赖于rails环境的rake任务。我之前运行过“rake db:migrate”,然后“rake assets:precompile”等,我现在运行一个rake任务,其主体包括“Rake :: Task ['db:migrate']。invoke”和“Rake” ::任务[ '资产:预编译']。调用”。环境现在只加载一次。