2011-01-31 119 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