Ruby / Rails - 运行部署后任务的更好方法?

时间:2010-09-08 13:15:53

标签: ruby-on-rails ruby deployment rake

我们正在使用EngineYard App Cloud托管我们的Ruby on Rails应用程序,这对我们来说非常有用。它们提供了一系列部署回调(before_restart,after_restart等),类似于Capistrano的回调。

我们的应用程序中有一系列Rake任务,用于维护应用程序的各个部分。如果我们向数据库添加新的业务规则,我们可能需要重新加载用户的相关业务规则等。

这些任务没有硬性或快速的计划,但我们也不希望在每次部署时运行每个任务,因为它们会降低部署过程的速度。

是否有任何系统可以让我们定义在下次部署时运行的任务,有点像迁移。我认为理想的系统可以如下工作:

  • 我们意识到在下一次部署时,需要运行一项任务
  • 我们通过系统安排任务
  • 在下一次部署时,系统会看到部署后任务列表 - 它注意到最新的任务尚未在特定服务器上运行(如迁移时如何记录数据库)只触发最近的非运行迁移) - 触发新任务

有关安排这些部署后任务的最佳做法的任何建议,除非它们已在服务器上运行,否则将其启动?

谢谢!

2 个答案:

答案 0 :(得分:2)

我想到了两种方法

  1. 快速/肮脏的解决方案......您可以使用迁移来执行此操作吗?创建Rails迁移,在运行rake db:migrate时启动任务
  2. 采用与迁移相同的方法。创建一个到schema_migrations表的对等表,然后在你的before_symlink.rb(或其他)中运行尚未执行的任务,然后更新表?

答案 1 :(得分:2)

尝试使用db {migrate基本操作建模的after_party ruby​​ gem,但是用于部署后任务。使用如此名称

创建部署后(rake)任务

LIB /任务/部署/ 20130130215258_task_name.rake

您当然可以在rake任务中调用任何ruby代码。文档说它支持同步和异步任务(异步任务是长时间运行的任务,你可以在应用程序启动时在后台进行)

我没有使用它,但是我准备试试,因为我们有与你所描述的相似的要求。