0

我刚刚开始部署我已经在 Openshift 上开发的 Django 应用程序。我已经创建了应用程序并正确设置了环境(据我所知),现在我可以git push对 Openshift 进行已提交的更改。

我使用我的家庭 Linux 桌面作为开发机器,您可以想象这两种环境之间存在不同的设置——数据库登录信息、路径等。我的问题是,我如何在家开发,将更改推送到Openshift,并且仍然最容易在两个系统上维护我的设置?我已经知道了,.gitignore但我的理解是,这只在您第一次提交到您的存储库时才会产生影响。如果我想稍后开始忽略其他文件,我会发现这变得难以维护。

用在不同环境中保存不同值的环境变量替换 settings.py 中的这些值会更好吗?就像在我的本地机器上定义 $OPENSHIFT_HOME_DIR 一样?这似乎有点hacky。

我应该如何解决这个问题?我很想听听任何在 Openshift 或具有类似环境的其他系统上执行此操作的人的意见。

4

2 回答 2

0

您应该为不同的环境制作不同的设置文件。您可以制作一个 base.py 文件以包含通用设置,然后将其导入 dev.py 和 production.py 并在那里定义环境特定设置

检查这个项目的布局:https ://github.com/twoscoops/django-twoscoops-project/tree/develop/project_name/project_name

于 2013-08-22T19:20:40.067 回答
0

我也有这个问题。我尝试了@Arsh Singh 所说的,为基础、开发和生产创建文件,并将 DJANGO_SETTINGS_MODULE 设置为settings.productionOpenshift。但是,我得到错误只是因为 openshift 找不到设置文件。

如果您只想运行您的生产(openshift)和开发(本地机器)版本,您可以在名为 pre_start_python-2.7 的 action_hook 上将环境变量设置为 openshift。该文件的路径是:.openshift/action_hooks/pre_start_python-2.7

例子:

#!/bin/bash
export DEV_MACHINE="False"
export EMAIL_HOST='smtp.example.com'

它只是为我工作,但它有任何问题。第一个是如果你想更改环境变量的任何值,你应该推送一个提交。另一个问题是将您的敏感设置(如密码、路径)放在 git 上并不是一个好的做法。这只是为了代码。我遇到的另一个问题是,当需要为 Staging 运行第三个环境时,这个解决方案就不合适了。

然后,为了再次解决问题,我使用 Frabric[1] 在 openshift 上运行了一些命令。我的解决方案包括在我的 django 应用程序上创建一个名为 config 的文件夹。在此文件夹中,创建三个文件local_env.txt2staging_env.txt2production_env.txt2. 在这些文件中,我有一个 json 字典,如下所示:

{
    "DEV_MACHINE": "True",
    "EMAIL_HOST":"smtp.gmail.com"
}

然后,为了将环境变量发送到 openshift,我创建了以下代码,只读取配置文件并发送到 openshift。此代码的文件名应为fabfile.py.

"""Management utilities."""

from fabric.api import abort, env, local, settings, task, run, sudo, cd
from fabric.operations import put
import json

# DEPLOY ON OPENSHIFT

@task
def staging_site():
    """Staging config for deployment on openshift"""
    env.environment_variables = "config/staging_env.txt2"
    env.environment = "staging"
    env.app_name = '<staging project name on openshift>' # 

@task
def production_site():
    """Production config for deployment on openshift"""
    env.environment_variables = "config/production_env.txt2"
    env.environment = "production"
    env.app_name = '<production project name on openshift>'

@task
def set_envs_openshift(args=""):
    """
    Setup all evironmnt variables
        Example of usage:
            * fab staging_site setup_envs_openshift

        if you are logged in more than one accont on openshift, use it:
            * fab staging_site setup_envs_openshift:'-l <account email>'

    """
    unset_envs_openshift(args)
    # run locally command
    str_envs = open(env.environment_variables, 'r').read()
    json_envs = json.loads(str_envs)
    env_list = ''
    for k, v in json_envs.items():
        env_list += ' %s="%s" ' % (k, v)

    local("rhc env set %s -a %s %s" % (env_list, env.app_name, args))
    local("rhc app-stop -a %s %s" % (env.app_name, args))
    local("rhc app-start -a %s %s" % (env.app_name, args))

@task
def unset_envs_openshift(args=""):
    """
    Unset all environment variables on openshift.
        Example of usage:
            * fab staging_site unset_envs_openshift
    """

    str_envs = open(env.environment_variables, 'r').read()
    json_envs = json.loads(str_envs)
    keys_list = ''
    for k in json_envs.keys():
        keys_list += ' %s ' % k
    local("rhc env unset %s -a %s %s --confirm" % \ 
        (keys_list, env.app_name, args))

# END DEPLOY ON OPENSHIFT

然后,要部署您的环境变量,请运行它:

fab production_site setup_envs_openshift

希望有帮助。

于 2014-03-17T02:28:08.540 回答