2010-09-08 55 views
3

我们正在使用EngineYard App Cloud托管我们的Ruby on Rails应用程序,该应用程序非常适合我们。他们提供了一系列类似于Capistrano回调的部署回调(before_restart,after_restart等)。Ruby/Rails - 运行部署后任务的更好方法?

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

这些任务没有硬性或快速时间表,但我们也不想运行每个部署的每个任务,因为它们减慢了部署过程。

是否有任何系统可以让我们定义要在下一次部署中运行的任务,类似于迁移。在我心中理想的系统将工作如下:

  • 我们认识到,在接下来的部署,任务将需要运行
  • 我们通过系统
  • 安排任务在接下来的部署,系统会查看部署后任务的列表 - 它注意到最新的一个尚未在特定服务器上运行(例如迁移时数据库如何在运行时对数据库进行注释,以便仅执行最新的未运行迁移被触发) - 新任务被触发

任何关于安排这些部署后任务的最佳实践,并让它们启动,除非它们已经在服务器上运行了?

谢谢!

回答

2

两种方法来我的心

  1. 快速/肮脏的解决方案......可能你只是用迁移做到这一点?创建一个Rails迁移,在rake db:migrate运行时触发任务
  2. 采用与迁移相同的方法。创建一个对等表到schema_migrations表,然后在你的before_symlink.rb(或其他)运行尚未执行的任务,然后更新表?
+0

谢谢,罗布。很高兴在Stack Overflow上找到你。这个答案建议使用迁移可能是最好的选择(http://stackoverflow.com/questions/3671471),尽管它看起来有点肮脏。你有没有见过用于除DB之外的任何类似迁移的功能?我喜欢那种声音... – shedd 2010-09-08 21:01:00

+0

我从来没有见过这样做。这样做似乎是切实可行的,但我总是不愿意让一件事情做一些独立的第三方不期望的事情。虽然我可能会让这个过于复杂。 – 2010-09-08 23:31:13

2

尝试使用after_party ruby​​ gem,该模型基于db:migrate的基本操作,但是用于部署后任务。部署完成后(耙)的任务是创建一个带有名字,像这样

的lib /任务/部署/ 20130130215258_task_name.rake

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

我没有使用它,但我要给它一个镜头因为我们有类似的要求,如你所描述的。

+0

这看起来不错 - 听起来它确实会是一个很好的选择。感谢您发布此信息,我将不得不考虑未来。 – shedd 2014-05-15 14:52:58

相关问题