使用foreman,我们可以在数据库启动后运行db migration吗?

时间:2017-12-11 03:30:59

标签: ruby-on-rails heroku foreman

我想在foreman中运行数据库和迁移。但是,我发现它们通常在我开始foreman的同时运行。由于我在运行迁移时数据库尚未完全启动,因此导致迁移失败。

使用Procfile的Heroku可以促进发布阶段。在运行所有命令后运行阶段。我可以在计算机上使用领班做同样的事吗?

1 个答案:

答案 0 :(得分:1)

Heroku不依赖于Procfile来维持发布过程。 Heroku构建堆栈。

由于foreman为我们提供了同时运行多个流程的方法,而不是按顺序运行流程,因此您的问题不是foreman的责任

但是,您还有其他一些方法可以这样做。

  1. 简单:由于foreman可以使用shell命令启动您的进程,因此您可以使用基本的shell命令sleep(以秒为单位)来延迟您的进程

    db_process: start_db_script.sh
    migrarion_process: sleep 5; bundle exec rake db:migrate --trace
    
  2. 完全控制:您可以编写另一个rake任务,而不是运行默认迁移rake任务,该任务在执行迁移之前检查与数据库的连接(请参阅this answer

    retried = 0
    begin
      # Establishes connection
      ActiveRecord::Base.establish_connection
      # Try to reconnect
      # It will raise error if cannot reach your database
      ActiveRecord::Base.connection.reconnect! 
      Rake::Task["db:migrate"].invoke if ActiveRecord::Base.connected?
    rescue => e 
      retried += 1
      if retried <= 5 # Retry only 5 times
        sleep 1       # Wait 1 seconds before retry
        retry
      end
      puts "#{e} Cannot connect to your database with 5 seconds"
    end