2011-01-31 185 views
11

我使用Heroku來託管Rails應用,這意味着使用Git部署到Heroku。由於Heroku上的「純粹的Git工作流程」,任何需要上傳到服務器的東西都必須在我的本地盒子上進行相同的配置。GIt部署+配置文件+ Heroku

但是我需要某些配置文件有所不同,具體取決於我是在本地設置還是部署在Heroku上。同樣,由於Heroku使用的部署方法,我不能使用.gitignore和一個模板(正如我見過的很多次,並已在其他項目中使用過)。

我需要的是混帳以某種方式跟蹤對文件的變化,但有選擇地讓Git沒有替換某些文件從一個特定的回購拉動時 - 基本上作一定的修改只是單向的。

可以這樣做嗎?我會很感激任何建議!

+0

是否讓git分支不是一個選項? – freedrull 2011-01-31 23:08:52

回答

16

您可以將配置變量永久存儲在每個heroku應用程序的本地設置上,因此它們不必在您的代碼中!所以相同的代碼可以在多個heroku站點上運行,但具有不同的配置。它非常簡單,輕鬆,優雅...

這是我們使用的方法。 (我們用它來做同樣的事情...我們在Heroku有多個SAME應用程序的克隆,但我們只需要一個github源代碼,在我們的開發本地目錄中,我們對ORIGIN(github)執行PUSH,然後當我們有它是我們喜歡它的方式,我們把CD放到prod本地目錄,它轉到SAME github存儲庫,我們只從GITHUB進入PULL到這個目錄,永遠不要推送(例如,所有的github都會從我們的開發目錄中獲取,督促目錄僅僅是爲其他的Heroku應用程序的臨時區域。)

通過具有的不同的Heroku網站不同CONFIGS(如下所述),確切相同的代碼作品上都Heroku的網站。

因此,我們的工作流程是:(關鍵是這兩個目錄指向SAME GitHub庫)

cd myDEVdir 
*....develop away....* 
git add . 
git commit -am "another day, another push" 
git push origin *(to our SINGLE github repo)* 
git push heroku *(test it out on heroku #1)* 

cd ../myPRODdir 
git pull   *(grabs SAME code as used on other site *) 
git push heroku *(now the SAME code runs on Heroku #2)* 

這就是它!

現在,這裏是你如何讓你的站點特定的配置瓦爾ON Heroku的網站:

http://docs.heroku.com/config-vars

本地命令行上,爲每個兩個本地目錄,這樣做:

$ heroku config:add FIRST_CONFIGVAR=fooheroku1 
Adding config vars: 
    FIRST_CONFIGVAR => fooheroku1 

$ heroku config:add SECOND_CONFIGVAR=barheroku1 
Adding config vars: 
    SECOND_CONFIGVAR => barheroku1 

看到那些你已經定義:

$ heroku config 
FIRST_CONFIGVAR => fooheroku1 
SECOND_CONFIGVAR => barheroku1 

然後cd到你的其他目錄myPRODdir並做同樣的事情,只設置相同的遠程heroku vars到fooheroku2和barheroku2。

然後在你的Rails應用程序,你簡單引用這些像這樣:

a = ENV['FIRST_CONFIGVAR'] 

一個應用程序將顯示「fooheroku1」的其他應用程序將顯示「fooheroku2」

最後,在你的本地目錄myDEVdir,在那裏你在DEV模式下運行,把相同的配置命令,在您的config/environment/development.rb文件的「開發」的配置瓦爾的版本將被設置到任何他們應該是:

ENV['FIRST_CONFIGVAR'] = "foodev" 
ENV['SECOND_CONFIGVAR'] = "bardev" 

簡單,優雅。謝謝,Heroku!

5

這裏有幾個解決方案:

1)如果你只想在Heroku上忽略文件,使用slugignore

2)如果你的改變是次要的,保持乾爽,並使用通用配置文件,插入交換機特定服務器的行爲

if Rails.env == "production" 
    #production server code 
elsif Rails.env == "development" 
    #development server code 
else 
    #test server code 
end 

3)如果你的變化是主要的,寫一個配置文件,並add a "smudge file"來配置其它每個服務器/初始化。基本上,你可以使用(2)中的技術分開文件。

4)如果您的更改是SWEEPING(不太可能),則爲每個服務器維護單獨的分支。

5)This script可以做你要求什麼,但可能是矯枉過正。

我希望有所幫助。

+0

嗯,更具體的問題是我實際上已經有兩個分支,我希望能夠拉動之間的變化,但一個是生產分支(我想使用生產配置),一個是測試分支(我想要使用測試配置)...所以任何時候我更新測試分支,我必須重新進入,並確保將所有配置從prod更改。設置,然後反之亦然,如果我拉回變化,那麼我必須複製配置,並用備份副本替換拉的。這是蹩腳的。不過謝謝你的建議! – Andrew 2011-02-01 07:18:04

+0

我認爲「污跡」可能會使它工作,我會研究,如果它的工作,我會接受這個答案:) – Andrew 2011-02-01 07:19:11