2👍
I’ve been able to debug the problem, using a custom python buildpack, so here is the answer for further reference.
The problem was in the settings.py
file. The first thing I do in this file is to check if we are in a cloudControl environment or in a local environment. I do it looking for the CRED_FILE
environment variable (not so different of what is suggested): if no variable is found, I load a local JSON file that mimics that credentials variable for development:
try:
cred_file = os.environ['CRED_FILE']
DEBUG = False
except KeyError:
cred_file = os.path.join(BASE_DIR, 'creds.json')
DEBUG = True
Once I know the environment, I can have different INSTALLED_APPS
(requirements.txt
files are slightly different in production and development, too) or change some settings.
Now the bad news: in the push phase there is no CRED_FILE
available.
So I was trying to load apps that were not installed (because they were only in the development requirements file, like coverage
or django-debug-toolbar
) or use credentials that were not set (creds.json
is, of course, not uploaded to the repository: only a TXT with dummy values is uploaded as a reference). That’s why collectstatic
was failing silently in the push phase.
Here is my solution (it will work as long as you have a dummy credentials file in your repo):
try:
cred_file = os.environ['CRED_FILE']
DEBUG = False
except KeyError:
if os.path.exists(os.path.join(BASE_DIR, 'creds.json')):
cred_file = os.path.join(BASE_DIR, 'creds.json')
DEBUG = True
else:
cred_file = os.path.join(BASE_DIR, 'creds.json.txt')
DEBUG = False
Credentials are not used by collectstatic
, so you can have anything in the creds.json.txt
file. Not very clean, but it works as expected now.
EDIT
As pointed by @pst in a comment there is an environment variable to know if the buildpack is running, so we could use that one too to load the desired credentials and set DEBUG
.
if 'CRED_FILE' in os.environ:
cred_file = os.environ['CRED_FILE']
DEBUG = False
elif 'BUILDPACK_RUNNING' in os.environ:
cred_file = os.path.join(BASE_DIR, 'creds.json.txt')
DEBUG = False
else:
cred_file = os.path.join(BASE_DIR, 'creds.json')
DEBUG = True