【问题标题】:GIt Deployment + Configuration Files + HerokuGit 部署 + 配置文件 + Heroku
【发布时间】:2011-06-18 22:14:26
【问题描述】:

我正在使用 Heroku 来托管 Rails 应用程序,这意味着使用 Git 部署到 Heroku。由于 Heroku 上的“纯 Git 工作流程”,任何需要上游到服务器的东西都必须在我的本地机器上进行相同的配置。

但是,根据我是在本地设置中还是部署在 Heroku 上,我需要使某些配置文件有所不同。同样,由于 Heroku 使用的部署方法,我不能使用 .gitignore 和模板(正如我多次看到的建议,并在其他项目中使用过)。

我需要 git 以某种方式跟踪文件的更改,但有选择地告诉 git 在从特定存储库中提取时不要覆盖某些文件——基本上只是单向进行某些更改。

这可以吗?如有任何建议,我将不胜感激!

【问题讨论】:

  • 不是让 git 分支成为一种选择吗?

标签: ruby git ruby-on-rails-3 configuration heroku


【解决方案1】:

您可以将配置变量永久存储在每个 heroku 应用程序的本地设置中,这样它们就不必在您的代码中了!因此相同的代码可以在多个 Heroku 站点上运行,但配置不同。它非常简单,轻松,优雅......

这是我们使用的方法。 (我们用它来做同样的事情......我们在 Heroku 有多个相同应用程序的克隆,但我们只想要 github 上的一个源,在我们的 dev 本地目录中,我们执行 PUSH to ORIGIN (github),然后当我们有按照我们喜欢的方式,我们 CD 到 prod 本地目录,该目录转到相同的 github 存储库,我们只从 GITHUB PULL 到这个目录,从不推送(例如,所有推送到 github 来在我们的 dev 目录中,prod 目录只是另一个 Heroku 应用程序的暂存区。)

通过在不同的 HEROKU 网站上使用不同的配置(如下所述),EXACT SAME CODE 可以在两个 heroku 网站上运行。

所以我们的工作流程是:(关键是两个目录都指向同一个 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)*

就是这样!

现在,您将如何在 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”

最后,在您以 DEV 模式运行的本地目录 myDEVdir 上,将相同的配置命令放入您的 config/environment/development.rb 文件中,您的“开发”版本的配置变量将被设置为应有的任何值:

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

简单,优雅。谢谢,Heroku!

【讨论】:

  • 哇,这是一个真正的好方法。非常感谢,这是一个巨大的帮助!
  • 我们现在一直使用这种方法——允许我们使用不同的电子邮件、支付处理器等运行多个子域,或者使用相同的代码库运行我们服务的“白标”版本配置。
  • 您可以拥有多个 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。你只需要一个目录。
【解决方案2】:

这里有一些解决方案:

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) 如果您的更改很重要,请为每台附加服务器编写一个配置文件和add a "smudge file" 到 config/initializers。基本上,使用 (2) 中的技术,您将拥有单独的文件。

4) 如果您的更改是 SWEEPING(不太可能),则为每个服务器维护单独的分支。

5) This script 可以完全按照您的要求进行操作,但可能有点矫枉过正。

希望对你有所帮助。

【讨论】:

  • 好吧,更具体地说,问题是我实际上已经有两个分支,我希望能够在它们之间进行更改,但一个是生产分支(我想使用生产配置)和一个是一个测试分支(我想使用测试配置)......所以每当我更新测试分支时,我必须返回并确保将所有配置更改为远离产品。设置,反之亦然,如果我拉回更改,那么我必须复制配置并用备份副本替换拉取的配置。很蹩脚。不过感谢您的建议!
  • 我认为“涂抹”可能会起作用,我会研究一下,如果有效,我会接受这个答案:)
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多