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



我有一个简单的场景(使用乘客的Rails 4(:

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

在这个系统中,我们试图制作一个功能,显示(仅适用于管理员(一个页面,他可以在该页面上单击按钮(更新代码(,系统将执行以下操作:

  1. 连接到 git 服务器。
  2. 运行 git 拉取。
  3. 触摸 TMP/重新启动.txt。

我们设置所有证书是为了不要求输入密码,将乘客/Apache设置为使用与Rails应用程序所有者相同的用户,并且在控制台中,它使用以下代码工作:

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

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

如果有人能帮忙...

我不想假设太多,但听起来您需要实施持续集成 (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 脚本并调用它。

最新更新