You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CircleCI未识别run步骤定义的ENV_ROLE环境变量问题

排查CircleCI中Django项目ENV_ROLE未定义的KeyError问题

我帮你梳理下可能导致这个问题的原因,以及对应的排查和解决步骤:

1. 确认CircleCI环境变量的作用范围是否正确

CircleCI的环境变量定义位置直接影响它能被哪些步骤访问到:

  • 如果你只在单个run步骤里定义ENV_ROLE,它只会作用于该步骤的命令。如果你的测试流程包含多个步骤(比如安装依赖、运行测试是分开的),其他步骤就拿不到这个变量,进而触发错误。
  • 正确的做法是把环境变量定义在job的顶层environment块,让所有步骤都能访问到:
jobs:
  test:
    docker:
      - image: python:3.9
    # 把环境变量定义在这里,所有步骤都能读取
    environment:
      ENV_ROLE: development
    steps:
      - checkout
      - run: pip install -r requirements.txt
      - run: python manage.py test

如果必须在单个步骤里定义,要确保每个需要ENV_ROLE的步骤都加上环境变量配置,比如安装依赖时也用到settings的情况。

2. 检查Django代码读取环境变量的逻辑

你修改后的代码会在ENV_ROLE未定义时抛出错误,要确认代码是从系统环境变量读取,而不是依赖未加载的配置文件:

比如你的env.py应该是这样直接读取系统环境的:

import os
from django.core.exceptions import ImproperlyConfigured

def get_env_variable(var_name):
    try:
        # 直接读取系统环境变量
        return os.environ[var_name]
    except KeyError:
        raise ImproperlyConfigured(f"请设置{var_name}环境变量")

manage.py里的调用逻辑:

#!/usr/bin/env python
import os
import sys
from env import get_env_variable

def main():
    # 这里会严格读取ENV_ROLE,无默认值
    env_role = get_env_variable("ENV_ROLE")
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", f"your_project.settings.{env_role}")
    
    # 后续的Django初始化逻辑
    try:
        from django.core.management import execute_from_command_line
    except ImportError as exc:
        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?") from exc
    execute_from_command_line(sys.argv)

if __name__ == "__main__":
    main()

如果你用了python-dotenv这类库,要确保在CircleCI步骤中加载了对应的.env文件,或者确认库会优先读取系统环境变量。

3. 验证CircleCI步骤中环境变量是否实际存在

在CircleCI的流程里加一个打印环境变量的步骤,直接确认ENV_ROLE是否被正确设置:

steps:
  - checkout
  # 添加这一步,查看环境变量是否存在
  - run:
      name: 检查ENV_ROLE环境变量
      command: echo "当前ENV_ROLE值为: $ENV_ROLE"
  - run: pip install -r requirements.txt
  - run: python manage.py test

如果这一步输出为空,说明你的CircleCI配置有语法问题(比如缩进错误),导致环境变量没被正确加载。

4. 排查是否有其他脚本覆盖环境变量

如果你的测试流程用到了自定义脚本(比如run_tests.sh),要检查脚本里是否有重置环境变量的逻辑,或者用exec等命令导致环境变量丢失。确保在执行manage.py之前,ENV_ROLE没有被修改或清空。

内容的提问来源于stack exchange,提问作者Kurt Peek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:24:57