我有一个简单的场景(使用Passenger的Rails 4):
1)一台开发机器。 2)在机器1上开发的系统的多个客户。该系统在与开发机器相同的虚拟机中的客户设施处运行。
在这个系统中,我们试图创建一个功能,显示(仅限管理员)一个页面,他可以在该页面上单击一个按钮(更新代码),系统会这样做:
我们设置所有证书是为了不要求密码,设置Passenger / Apache以使用Rails应用程序所有者的同一用户,并且在控制台中,它使用以下代码:
....
item = "git pull"
@result = %x[ #{item} ]
....
但是,当我在我的应用程序中运行它时,它没有做任何事情,也没有输出任何东西。 一个奇怪的线索是,当我为一些不必访问git服务器的命令(例如,git status)更改命令时,它可以完美地工作(请记住,在控制台中,在同一个虚拟机上,代码作品)
如果有人可以提供帮助......
答案 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脚本中推送它并调用它。