2010-09-08 54 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

相關問題