python - CircleCI 没有拾取运行步骤中定义的环境变量?
问题描述
我正在尝试为 Django 项目运行 CircleCI 测试,在该项目manage.py
中,settings.py
从development.py
环境变量. 以前,如果未定义,则设置为默认值,但我正在对其进行更改,以便 Django在未定义时抛出错误。staging.py
production.py
ENV_ROLE
ENV_ROLE
development
ImproperlyConfigured
为了使测试通过,我需要ENV_ROLE
在我们的 CircleCI 测试环境中定义环境变量。在https://circleci.com/docs/2.0/env-vars/#setting-an-environment-variable-in-a-step之后,我在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
这是完整的.circleci/config.yml
:
version: 2
jobs:
build:
working_directory: ~/lucy/lucy_web/
docker:
- image: python:3.6.5
environment:
DATABASE_URL: ...
- image: jannkleen/docker-postgres-gis-hstore
environment:
POSTGRES_USER: ...
POSTGRES_DB: ...
- image: redis:4.0.9-alpine
steps:
- checkout
- restore_cache:
key: deps1-{{ .Branch }}-{{ checksum "lucy-web/requirements.txt" }}
- run:
name: Install Python deps in a venv
command: |
cd lucy-web
python3 -m venv venv
. venv/bin/activate
pip3 install -r requirements.txt
- save_cache:
key: deps1-{{ .Branch }}-{{ checksum "lucy-web/requirements.txt" }}
paths:
- "venv"
- run:
environment:
ENV_ROLE: development
command: |
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
- store_artifacts:
path: test-reports/
destination: tr1
- store_test_results:
path: test-reports/
app_test:
working_directory: ~/lucy/lucy_app
docker:
- image: node:8
steps:
- checkout
- run:
command: |
cd lucy-app
yarn install
yarn lint
yarn jest
workflows:
version: 2
build_and_test:
jobs:
- build
- app_test
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)
whereenv.py
检查ENV_ROLE
环境变量是否已定义,ImproperlyConfigured
否则抛出错误:
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
环境变量?我的语法或对文档的理解有问题吗?
解决方案
尝试在 docker: 部分中指定变量。
docker:
environment:
ENV_ROLE: development
这应该使用环境变量启动您的容器。在我的容器可以访问它们之前,我必须测试在几个构建中插入我的 VAR 的位置。
如果您可以在需要 ENV_ROLE 时看到这些变量中的任何一个,那么您可能还想在此处添加您的变量。
environment:
DATABASE_URL: ...
environment:
POSTGRES_USER: ...
POSTGRES_DB: ...
推荐阅读
- javascript - javascript错误SyntaxError:缺少:属性ID之后
- javascript - 访问 Stripe 门户
- docker - 服务器 2019 机器上的 Linux 容器
- linux - 为什么即使使用 nohup 也会捕获挂断信号?
- typo3 - TYPO3:如何显示来自不同页面的内容元素
- azure - Azure 管道如何从内部 TFS 和外部 Git 获取源?如何更新代理?
- java - 有什么区别吗?SwingWorker#publish vs SwingUtilities#invokeLater
- spring - 使用 UUID 获取对象时出现 Spring Boot 错误
- macos - 如何从源代码构建 VSCode 应用程序包
- python - Nginx error_page 404 proxy_pass