2013-11-03 50 views
0

我希望我的Rails應用程序在訪問者在Web應用程序中輸入一些值後提交併推送git更改。 在開發過程中,我使用a Ruby Gem來提交和推送更改,這會將存儲庫克隆到文件系統中。更改會寫入這些文件,然後由Gem提交併推送。Heroku(以及類似的服務):克隆,提交併推送到Git倉庫

Heroku只提供只讀文件系統。

有什麼辦法要麼

  • 提交併推送文件,而無需訪問文件系統?
  • 將存儲庫克隆到一個臨時文件夾並在那裏提交?
  • 使用類似Heroku的其他主機,允許寫入文件系統?

我忘了任何明顯的方式來實現我的遠程git存儲庫的變化嗎?

+0

有趣。我從來沒有這樣做過,但我想知道是否可以將github API構建到應用程序中 - 直接將更改寫入github repo,然後使用heroku的後臺任務插件之一從github重新部署觀看更改。 – trh

+0

感謝您的評論。看起來GitHub內置了一個File CRUD API:https://github.com/blog/1498-file-crud-and-repository-statistics-now-available-in-the-api(用於更新:http:// developer.github.com/v3/repos/contents/#update-a-file) – KrauseFx

回答

1

我決定使用亞馬遜雲解決這個任務。 藉助'aws-sdk'創業板,可以輕鬆將文件更改寫入S3在線空間。

然後我用我的CIS下載最新的文件,並將其提交給信息庫,這是一個簡單的Ruby腳本:

require 'git' 
require 'aws-sdk' 
require 'fileutils' 


folder_name = "configs" 

begin 
    g = Git.open(folder_name) 
rescue 
    puts "Cloning repo..." 
    system("mkdir #{folder_name}") 
    g = Git.clone("[email protected]", folder_name, :path => ".") 
end 


g.config("user.name", "GitBot") 
g.config("user.email", "...") 
g.pull 

FileUtils.rm_rf(Dir.glob("#{folder_name}/*")) 

s3 = AWS::S3.new 
bucket = s3.buckets["bucket name"] if not bucket 


bucket.objects.each do |obj| 
    if obj.content_length > 0 
     # only files 
     puts "Writing #{obj.key}" 

     File.write("#{folder_name}/#{obj.key}", obj.read) 
    else 
     puts "Creating folder #{obj.key}" 
     FileUtils.mkdir_p "#{folder_name}/#{obj.key}" 
    end 
end 

begin 
    g.add(:all => true) 
    g.commit("Automatic commit from GitBot") 
    g.push 
    puts "Successfully pushed updates" 
rescue 
    puts "Nothing to commit" 
end 

這不是一個完美的解決方案,但對我的使用情況下的偉大工程。

1

幾年前我做過something similar,那時候在heroku上工作過,今天還應該工作。

基本上:你實際上可以使用文件系統,在/tmp
因此,您必須在該存儲庫中克隆並在那裏進行更改。

然而,雖然這在heroku上是絕對有可能的,但您最終會得到很多平臺特定的代碼,這可能會讓heroku變得困難。
使用GitHub文件評論推薦的CRUP API似乎是一個更好的解決方案。

+0

謝謝。我玩弄了CRUP API,並注意到一個主要問題:我沒有存儲庫的本地副本,導致從其訪問文件時等待時間過長。平臺特定的代碼是什麼意思?在/ tmp中克隆/提交時是否需要考慮任何特殊情況? – KrauseFx