【发布时间】:2014-04-01 08:56:13
【问题描述】:
我正在尝试使用 application_ruby 食谱部署我的 Rails 应用程序。我需要运行一些一次性设置活动(例如使用rake db:seed 为数据库播种)。这些不应该在随后的厨师运行期间完成。定义这些任务的正确方法是什么?
【问题讨论】:
标签: chef-infra chef-recipe cookbook
我正在尝试使用 application_ruby 食谱部署我的 Rails 应用程序。我需要运行一些一次性设置活动(例如使用rake db:seed 为数据库播种)。这些不应该在随后的厨师运行期间完成。定义这些任务的正确方法是什么?
【问题讨论】:
标签: chef-infra chef-recipe cookbook
尝试使用after_party gem。 这种方式运行许多 rake 任务(你说哪些),如迁移,意味着不要执行两次。然后你必须记住,如果你想改变之前由这个 rake 任务之一执行的东西,你必须创建一个新的(比如迁移)
出于种子目的,您可以尝试使用seed_fu。使用约束 技术。我相信这对种子来说是正确的,但有 seed_fu 语法。
有些人将种子或数据放入迁移中(我不喜欢)。看着 this question/answer。我相信,这是与迁移最糟糕的合并种子不是好主意。随时间变化的种子意味着新的迁移,而随环境变化的种子几乎是不可能的。
【讨论】:
我解决这个问题的方法是使用这样的条件执行:
execute "seed database" do
cwd node[:release_path]
user node[:owner]
environment ({'RAILS_ENV' => node[:environment]})
command "bundle exec rake db:seed && touch #{node[:deploy_path]}/db.seeded"
not_if { ::File.exists?("#{node[:deploy_path]}/db.seeded") }
end
这可确保设置步骤只发生一次。
【讨论】: