git多个遥控器:如何处理忽略/私有文件

时间:2012-04-03 13:22:49

标签: django git heroku branching-and-merging git-remote

我的问题/问题

我们正在开发一个我们在github上托管的开源项目。该项目是用Django编写的,因此我们在settings.py文件中设置了这些项目。我们开源并不是因为我们对订阅来说太便宜了,而是因为我们故意希望它是开源的。

无论如何,我们也希望自己运行这个代码,所以我们有一个site_settings.py,其中包含所有敏感数据,如db密码等。因为我们不希望这个在github上供大家看,所以这是在.gitignore文件。

通常我们克隆repo并在本地和服务器上添加此文件,这样我们都有我们的个人设置,敏感数据不会存储在git上。

问题是我们现在想要在Heroku上运行我们的代码,它不支持在服务器上创建文件,因为heroku不像普通服务器那样工作(它适用于分布式文件系统)。

当然我自己已经考虑过了,但我不确定这是不是正确的做法。请记住,我是Heroku和Git的新手。以下是我目前的解决方案:

我目前关于如何解决这个问题的想法

有两个遥控器:

  • origin == Github
  • heroku == Heroku

省略了所有的开发和功能分支,我们只有两个主分支(在Heroku和Github上)担心。

我的想法是让分支机构在本地设置:

  • master - >遥控器/产地/主
  • heroku - >遥控器/ Heroku的/主

在master分支上我们将site_settings.py放在.gitignore中,所以git在提交给Github时会忽略它,所有dev分支都是如此等等。我们收集了master分支中的所有更改,直到我们有了新版本。

在heroku分支上,我们编辑了.gitignore文件以停止忽略site_settings.py,因此一旦我们推送到heroku分支,它将被提交给Heroku。

一旦我们有了新版本,我们就会切换到heroku分支并将master合并到heroku中,如下所示:

git checkout heroku
git pull
git merge master

一旦我们从合并中整理出合并冲突,我们就会提交Heroku,我们有一个新版本并且正在运行.. = D

我的问题

解决这个问题我的想法是否可以接受(它甚至可以像这样使用.gitignore吗?)如果不是,我们如何以最干净/最好的方式解决这个问题?如果您需要更多信息,请不要犹豫:)

2 个答案:

答案 0 :(得分:1)

对于初学者来说,将配置存储在文件中是错误的方法,所以不要这样做。

来自12factor app

  

应用程序的配置是部署之间可能不同的所有内容   (分期,制作,开发者环境等)。这包括:

     
      
  • 数据库,Memcached和其他支持的资源句柄   服务
  •   
  • 外部服务的凭据,例如Amazon S3或Twitter
  •   
  • 按部署值,例如部署的规范主机名
  •   
     

应用程序   有时将配置存储为代码中的常量。这是违规行为   十二因素,需要严格分离配置   码。配置在部署之间差异很大,代码没有。

     

对应用程序是否正确分析了所有配置的试金石   代码是代码库是否可以在任何时候开源   那一刻,没有妥协任何凭据。

     

请注意,“config”的此定义不包含internal   应用程序配置,例如Rails中的config / routes.rb,或者代码如何   模块在Spring中连接。这种配置不会改变   在部署之间,最好在代码中完成。

     

配置的另一种方法是使用不是的配置文件   检查到版本控制,例如Rails中的config / database.yml。   与使用常量检查相比,这是一个巨大的进步   代码回购,但仍有缺点:很容易误检查   在配置文件中到repo;配置文件有倾向   分散在不同的地方和不同的格式,制作   很难在一个地方看到和管理所有配置。而且,这些   格式往往是语言或框架特定的。

     

十二因素应用程序将配置存储在环境变量中(通常   缩写为env vars或env)。环境变量之间很容易改变   部署而不改变任何代码;与配置文件不同,有   他们偶然检查代码回购的可能性很小;   与自定义配置文件或其他配置机制不同   Java系统属性,它们是与语言和操作系统无关的标准。

     

配置管理的另一个方面是分组。有时应用批量   配置命名为命名组(通常称为“环境”)   特定部署,例如开发,测试和生产   Rails中的环境。这种方法不能干净地扩展:更多   创建应用程序的部署,新的环境名称是必要的,   如分期或qa。随着项目的进一步发展,开发人员可以   添加自己的特殊环境,如joes-staging,从而产生一个   配置的组合爆炸,这使得管理部署   应用非常脆弱。

     

在十二因子应用中,env vars是粒度控件,每个都是完全控制的   与其他env vars正交。它们永远不会组合在一起   “环境”,而是针对每个部署进行独立管理。   随着应用程序自然扩展,这是一个可以平滑扩展的模型   在其生命周期中进行更多部署。

对于Python,您的配置可以在os.environ中找到。对于特定的配置,特别是您希望使用的数据库:

import os
import sys
import urlparse

# Register database schemes in URLs.
urlparse.uses_netloc.append('postgres')
urlparse.uses_netloc.append('mysql')

try:

    # Check to make sure DATABASES is set in settings.py file.
    # If not default to {}

    if 'DATABASES' not in locals():
        DATABASES = {}

    if 'DATABASE_URL' in os.environ:
        url = urlparse.urlparse(os.environ['DATABASE_URL'])

        # Ensure default database exists.
        DATABASES['default'] = DATABASES.get('default', {})

        # Update with environment configuration.
        DATABASES['default'].update({
            'NAME': url.path[1:],
            'USER': url.username,
            'PASSWORD': url.password,
            'HOST': url.hostname,
            'PORT': url.port,
        })
        if url.scheme == 'postgres':
            DATABASES['default']['ENGINE'] = 'django.db.backends.postgresql_psycopg2'

        if url.scheme == 'mysql':
            DATABASES['default']['ENGINE'] = 'django.db.backends.mysql'
except Exception:
    print 'Unexpected error:', sys.exc_info()

有关配置变量的详细信息,请参阅此处:https://devcenter.heroku.com/articles/config-vars

答案 1 :(得分:0)

我没有在Heroku上开发复杂的基于git的设置文件和变量部署,而是将环境变量用于所有敏感内容。这样你就不必将它们保存在代码中。有关信息,请参阅database docsenvironment variables docs - 将所有内容放入其中,然后通过os.getenv() python docs进行访问。

使用heroku cli工具查看应用的环境变量:

 heroku run env

将打印出所有变量。要添加新变量(例如S3键等),请使用:

heroku config:add VAR_NAME=value