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

4
我们正在使用EngineYard App Cloud托管我们的Ruby on Rails应用程序,这对我们非常有效。他们提供了一系列部署回调(before_restart、after_restart等),类似于Capistrano的回调。
我们的应用程序中有一系列Rake任务,用于维护应用程序的各个部分。如果我们在数据库中添加了新的业务规则,我们可能需要重新加载用户关联的业务规则等。
这些任务没有硬性时间表,但我们也不想在每次部署时运行每个任务,因为它们会减慢部署过程。
是否有任何系统可以允许我们定义一个任务在下一次部署时运行,类似于迁移。我心中理想的系统如下:
- 我们意识到在下一次部署时需要运行一个任务 - 我们通过系统安排任务 - 在下一次部署时,系统查看后置部署任务列表--它注意到最近的任务尚未在特定服务器上运行(就像迁移在运行时标记数据库一样,只有最新的未运行迁移才会被触发)--新任务被触发
有没有关于安排这些后置部署任务的最佳实践建议,并确保它们在服务器上运行之前已经运行?
谢谢!
3个回答

3
尝试使用after_party Ruby gem,它基于db:migrate的基本操作,但用于发布后任务。发布后(rake)任务的名称如下所示:

lib/tasks/deployment/20130130215258_task_name.rake

当然,您可以从rake任务中调用任何Ruby代码。文档显示它支持同步和异步任务(异步任务是长时间运行的任务,在应用程序启动时可以在后台运行)
我还没有使用过它,但正准备尝试,因为我们有与您描述的类似要求。

看起来不错 - 听起来确实很适合。谢谢你发布这个,我将来会记住的。 - shedd

2

我脑海中想到了两种方法:

  1. 快速/简单的解决方案...你可以使用迁移来完成这个任务吗?创建一个Rails迁移,在运行rake db:migrate时触发任务
  2. 采用与迁移相同的方法。创建一个与schema_migrations表对等的表,然后在before_symlink.rb(或其他地方)运行尚未执行的任务,然后更新表格?

谢谢,Rob。很高兴在Stack Overflow上找到你。这个答案建议使用迁移可能是最好的选择(https://dev59.com/elDTa4cB1Zd3GeqPIVhh),尽管它似乎有点不干净。你有没有见过类似于迁移的功能用于除了数据库之外的其他任何东西?我喜欢听起来的声音... - shedd
我从未见过以那种方式完成。以那种方式似乎很实用,但我总是不愿让一件事情做出独立第三方不期望的事情。虽然我可能把这件事情想得太复杂了。 - Rob Di Marco

0
你应该试试 rails_tasker。它提供了一种简单直接的方式来自动化你的部署后任务。这里有一篇文章描述了如何使用这个 gem。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接