【问题标题】:Ruby / Rails - A better way of running post-deploy tasks?Ruby / Rails - 运行部署后任务的更好方法?
【发布时间】:2010-09-08 13:15:52
【问题描述】:

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

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

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

是否有任何系统可以让我们定义要在下一次部署时运行的任务,有点像迁移。我心目中的理想系统如下:

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

对于安排这些部署后任务并让它们启动(除非它们已经在服务器上运行)的最佳实践有什么建议吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby deployment rake


    【解决方案1】:

    试试after_party ruby​​ gem,它以 db:migrate 的基本操作为蓝本,但用于部署后任务。部署后 (rake) 任务使用类似这样的名称创建

    lib/tasks/deployment/20130130215258_task_name.rake

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

    我没有使用它,但我正准备试一试,因为我们的要求与您描述的相似。

    【讨论】:

    • 看起来确实不错 - 听起来确实很合适。感谢您发布此信息,我必须牢记这一点以备不时之需。
    【解决方案2】:

    我想到了两种方法

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

    【讨论】:

    • 谢谢,罗伯。很高兴在 Stack Overflow 上找到你。这个答案建议使用迁移可能是最好的选择(stackoverflow.com/questions/3671471),尽管它看起来有点脏。您是否见过用于数据库以外的任何类似迁移的功能?我确实喜欢那种声音...
    • 我从来没有见过这样做的。这样做似乎确实可行,但我总是犹豫是否让一件事做独立第三方不会期望的事情。不过,我可能让这太复杂了。
    猜你喜欢
    • 2011-03-04
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多