Python CircleCI未拾取运行步骤中定义的环境变量?

Python CircleCI未拾取运行步骤中定义的环境变量?,python,django,yaml,circleci,Python,Django,Yaml,Circleci,我正在尝试为Django项目运行CircleCI测试,在该项目中,manage.py确定要应用的settings.py(development.py,staging.py,或production.py)的版本,该版本来自环境变量ENV\u ROLE。以前,ENV_ROLE如果未定义,则默认设置为development,但我正在对其进行更改,以便Django在未定义时抛出配置不正确的错误 为了使测试通过,我需要在CircleCI测试环境中定义ENV_角色环境变量。接下来,我将以下内容添加到run步

我正在尝试为Django项目运行CircleCI测试,在该项目中,
manage.py
确定要应用的
settings.py
development.py
staging.py
,或
production.py
)的版本,该版本来自环境变量
ENV\u ROLE
。以前,
ENV_ROLE
如果未定义,则默认设置为
development
,但我正在对其进行更改,以便Django在未定义时抛出
配置不正确的
错误

为了使测试通过,我需要在CircleCI测试环境中定义
ENV_角色
环境变量。接下来,我将以下内容添加到
run
步骤中:

      - run:
          environment:
            ENV_ROLE: development
但是,我仍然从CircleCI得到这个错误:

#!/bin/bash -eo pipefail
cd lucy-web
source venv/bin/activate
python manage.py compilescss --verbosity 0
python manage.py collectstatic --clear --no-input --verbosity 0
flake8
python manage.py test
Traceback (most recent call last):
  File "/root/lucy/lucy_web/lucy-web/env.py", line 5, in <module>
    ENV_ROLE = os.environ['ENV_ROLE']
  File "/usr/local/lib/python3.6/os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'ENV_ROLE'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 4, in <module>
    from env import ENV_ROLE
  File "/root/lucy/lucy_web/lucy-web/env.py", line 8, in <module>
    "No 'ENV_ROLE' environment variable is defined. "
django.core.exceptions.ImproperlyConfigured: No 'ENV_ROLE' environment variable is defined. Please define it as 'development', 'staging', or 'production'.
Exited with code 1
Django项目有一个修改的
manage.py

#!/usr/bin/env python
import os
import sys
from dotenv import load_dotenv, find_dotenv

if __name__ == "__main__":
    # Set environment variables from .env file
    load_dotenv(find_dotenv())

    # Determine which settings to apply (development, staging, or production)
    from env import ENV_ROLE
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"lucy.settings.{ENV_ROLE}")
    try:
        from django.core.management import execute_from_command_line
    except ImportError:
        # The above import may fail for some other reason. Ensure that the
        # issue is really that Django is missing to avoid masking other
        # exceptions on Python 2.
        try:
            import django  # noqa: F401
        except ImportError:
            raise ImportError(
                "Couldn't import Django. Are you sure it's installed and "
                "available on your PYTHONPATH environment variable? Did you "
                "forget to activate a virtual environment?"
            )
        raise
    execute_from_command_line(sys.argv)
其中,
env.py
检查是否定义了
env_角色
环境变量,并抛出
配置不正确
错误,否则:

import os
from django.core.exceptions import ImproperlyConfigured

try:
    ENV_ROLE = os.environ['ENV_ROLE']
except KeyError:
    raise ImproperlyConfigured(
        "No 'ENV_ROLE' environment variable is defined. "
        "Please define it as 'development', 'staging', or 'production'.")

我不明白为什么CircleCI没有“选择”环境变量
ENV_ROLE
?我的语法或对文档的理解有问题吗?

我在使用circleCI+GAE时遇到了类似的问题;我以为我在.circleCI/config.yml中设置的变量实际上从未进入应用程序,因为GAE运行的构建过程没有将它们传入。相反,我需要:

  • 创建多个app.yaml文件(在我的例子中是app-staging.yaml和app-prod.yaml)
  • 更新.circleci/config.yml以在每个命令语句中使用它们,如:

    命令:gcloud app deploy app-staging.yaml


尝试在docker:部分中指定变量

docker:
    environment:
        ENV_ROLE: development
这将使您的容器具有环境变量。在容器可以访问一些构建之前,我必须测试在何处插入我的变量

如果您可以在需要ENV_角色的时候看到这两个变量中的任何一个,那么您可能也希望在那里添加您的变量

environment:
          DATABASE_URL: ...
        environment:
          POSTGRES_USER: ...
          POSTGRES_DB: ...

您可以尝试在作业级别而不是步骤级别设置变量吗?我会尝试在命令的第一行添加
env
,以打印出完整的环境,并查看是否正在设置
env\u角色。
environment:
          DATABASE_URL: ...
        environment:
          POSTGRES_USER: ...
          POSTGRES_DB: ...