Git部署 + 配置文件 + Heroku

12
我正在使用Heroku来托管一个Rails应用程序,这意味着使用Git来部署到Heroku。由于Heroku上的“纯Git工作流程”,任何需要上传到服务器的内容都必须在我的本地环境中进行相同的配置。
然而,我需要根据我是在本地设置还是在部署到Heroku上来决定某些配置文件的不同之处。由于Heroku使用的部署方法,我不能使用.gitignore和模板(正如我在其他项目中看到并使用过的那样)。
我需要的是让git以某种方式跟踪文件的更改,并有选择性地告诉git在从特定仓库拉取时不要覆盖某些文件——基本上是使某些更改仅单向进行。
这可以做到吗?我将非常感谢任何建议!

制作Git分支不是一个选项吗? - freedrull
2个回答

17
您可以在每个Heroku应用程序的本地设置中持久保存配置变量,因此它们根本不必出现在您的代码中!因此,相同的代码可以在多个Heroku网站上运行,但具有不同的配置。这非常简单、易用和优雅...
这就是我们使用的方法。(我们用它来做同样的事情...我们在Heroku上有多个克隆应用,但我们只想要一个源在GitHub上,在我们的本地开发目录中我们将其PUSH到ORIGIN(GitHub),然后当我们喜欢它时,我们CD到生产本地目录,它将从SAME GitHub存储库中仅拉取,从未推送过(例如,所有推送到GitHub都来自我们的dev目录,prod目录只是另一个 Heroku 应用的暂存区)。
通过在不同的Heroku网站上具有不同的配置(如下所述),相同的代码可以在BOTH Heroku站点上工作。
因此,我们的工作流程是:(关键是两个目录都指向同一个GitHub repo)
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)*

就是这样!

现在,以下是如何将您的特定于网站的配置变量保留在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

然后进入你的另一个目录myPRODdir,执行相同的操作,只需将相同的远程heroku变量设置为fooheroku2和barheroku2。

然后在你的Rails应用中,你可以这样简单地引用它们:

a = ENV['FIRST_CONFIGVAR']

一个应用程序将读取'fooheroku1',另一个应用程序将读取'fooheroku2'

最后,在您运行开发模式的本地目录myDEVdir中,将相同的配置命令放入您的config/environment/development.rb文件中,您的' dev '版本的配置变量将被设置为它们应该是什么:

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

简单、优雅。谢谢你,Heroku!


哇,这是一个非常好的方法。非常感谢,这对我帮助很大!! - Andrew
我们现在一直使用这种方法——它允许我们运行多个具有不同电子邮件发送器、支付处理器等的子域,或者创建完全不同配置的“白标”版本,但使用相同的代码库。 - jpw
1
你可以拥有多个Heroku远程,并使用“-r”在它们之间切换。 git remote add heroku-qa git@heroku.com:my-qa-app.git && git push heroku-qa master && heroku config:add VAR1=value1 -r heroku-qa。你只需要一个目录。 - yfeldblum

6
以下是几种解决方案:

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

2)如果你的更改很小,请保持DRY并使用通用配置文件,在其中插入服务器特定行为的开关。

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

3) 如果您的更改很大,请编写一个配置文件,并针对每个额外的服务器在config/initializers中添加“smudge file”。基本上,您将使用第(2)种技术来创建单独的文件。

4) 如果您的更改是全面性的(不太可能),那么请为每个服务器维护单独的分支。

5) 这个脚本可以完全按照您的要求执行,但可能过于复杂。

希望对您有所帮助。


更具体地说,问题是我已经有了两个分支,想要在它们之间拉取更改。但是一个是生产分支(我想使用生产配置),而另一个是测试分支(我想使用测试配置)...所以每次更新测试分支时,我必须回去确保将所有配置从生产设置更改,然后如果我回滚更改,我就必须复制配置并用备份副本替换被回滚的配置。很烦人。不过还是谢谢你的建议! - Andrew
我认为“smudge”可能会使它工作,我会研究一下,如果有效的话,我会接受这个答案 :) - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接