如何在rails中运行时更新代码?

时间:2014-12-16 19:53:26

标签: ruby-on-rails git

我有一个简单的场景(使用Passenger的Rails 4):

1)一台开发机器。 2)在机器1上开发的系统的多个客户。该系统在与开发机器相同的虚拟机中的客户设施处运行。

在这个系统中,我们试图创建一个功能,显示(仅限管理员)一个页面,他可以在该页面上单击一个按钮(更新代码),系统会这样做:

  1. 连接到git服务器。
  2. 运行git pull。
  3. 触摸tmp / restart.txt。
  4. 我们设置所有证书是为了不要求密码,设置Passenger / Apache以使用Rails应用程序所有者的同一用户,并且在控制台中,它使用以下代码:

    ....
    item = "git pull"
    @result = %x[ #{item} ]
    ....
    

    但是,当我在我的应用程序中运行它时,它没有做任何事情,也没有输出任何东西。 一个奇怪的线索是,当我为一些不必访问git服务器的命令(例如,git status)更改命令时,它可以完美地工作(请记住,在控制台中,在同一个虚拟机上,代码作品)

    如果有人可以提供帮助......

1 个答案:

答案 0 :(得分:0)

我不想承担太多责任,但听起来您需要实施持续集成(CI)策略。我认为管理员会推动这个"按钮"当他们被告知有新代码时,对吗?

你们有没有尝试使用像Capistrano这样的东西来推动对客户系统的更新?

编辑:

建议使用popen -

# Get new code
IO.popen "cd #{Rails.root} && git pull" do |io|
    io.each { |line| Rails.logger.info line }
end

# Bundle if necessary
IO.popen "cd #{Rails.root} && bundle" do |io|
    io.each { |line| Rails.logger.info line }
end

# Migrate if necessary
IO.popen "cd #{Rails.root} && rake db:migrate" do |io|
    io.each { |line| Rails.logger.info line }
end

# Restart Passenger
IO.popen "cd #{Rails.root} && touch tmp/restart.txt" do |io|
    io.each { |line| Rails.logger.info line }
end

您可能还想在shell脚本中推送它并调用它。