New assemble and run scripts with Django support
This commit is contained in:
parent
5488484238
commit
97a7a56175
2 changed files with 156 additions and 74 deletions
|
@ -1,52 +1,63 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# For SCL enablement
|
# This script uses these environment variables:
|
||||||
source .bashrc
|
#
|
||||||
|
# DISABLE_COLLECTSTATIC: if not empty, inhibits execution of 'manage.py collectstatic'.
|
||||||
|
|
||||||
set -e
|
function assemble() {
|
||||||
|
# For SCL enablement
|
||||||
|
source .bashrc
|
||||||
|
|
||||||
echo "---> Copying application source ..."
|
set -e
|
||||||
cp -Rf /tmp/src/* ./
|
|
||||||
|
|
||||||
if [ -f setup.py ]; then
|
echo "---> Copying application source ..."
|
||||||
echo "---> Installing application ..."
|
cp -Rf /tmp/src/* ./
|
||||||
python setup.py install --user
|
|
||||||
elif [ -f requirements.txt ]; then
|
|
||||||
echo "---> Installing dependencies ..."
|
|
||||||
pip install --user -r requirements.txt
|
|
||||||
fi
|
|
||||||
|
|
||||||
# set permissions for any installed artifacts
|
if [ -f setup.py ]; then
|
||||||
chmod -R og+rwx /opt/openshift
|
echo "---> Installing application ..."
|
||||||
|
python setup.py install --user
|
||||||
|
elif [ -f requirements.txt ]; then
|
||||||
# Support for Django
|
echo "---> Installing dependencies ..."
|
||||||
|
pip install --user -r requirements.txt
|
||||||
# Take shallowest manage.py script
|
|
||||||
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
|
|
||||||
|
|
||||||
if pip show -q django && [ -f "$MANAGE_FILE" ]; then
|
|
||||||
set +e
|
|
||||||
|
|
||||||
# Check if collectstatic can be run.
|
|
||||||
python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null && RUN_COLLECTSTATIC=true
|
|
||||||
|
|
||||||
# Collect assets if settings seems okay.
|
|
||||||
if [ "$RUN_COLLECTSTATIC" ]; then
|
|
||||||
echo "---> Collecting static assets ..."
|
|
||||||
python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d'
|
|
||||||
|
|
||||||
[ $? -ne 0 ] && {
|
|
||||||
echo "ERROR: 'manage.py collectstatic' failed. See the build logs for more info."
|
|
||||||
exit 1
|
|
||||||
} || true
|
|
||||||
else
|
|
||||||
echo "WARNING: 'manage.py collectstatic' ignored. To debug, run:"
|
|
||||||
echo " $ python $MANAGE_FILE collectstatic --noinput"
|
|
||||||
echo "Ignore this warning if you're not serving static files with Django."
|
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
|
# set permissions for any installed artifacts
|
||||||
|
chmod -R og+rwx /opt/openshift
|
||||||
|
|
||||||
# remove pip temporary directory
|
set +e
|
||||||
rm -rf /tmp/pip_build_default
|
django_collectstatic
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# remove pip temporary directory
|
||||||
|
rm -rf /tmp/pip_build_default
|
||||||
|
}
|
||||||
|
|
||||||
|
function django_collectstatic() {
|
||||||
|
[ -n "$DISABLE_COLLECTSTATIC" ] && return
|
||||||
|
! pip show -q django && return
|
||||||
|
|
||||||
|
# Find shallowest manage.py script, either ./manage.py or <project>/manage.py
|
||||||
|
local MANAGE_FILE=$(find . -maxdepth 2 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
|
||||||
|
|
||||||
|
if [ ! -f "$MANAGE_FILE" ]; then
|
||||||
|
echo "WARNING: seems that you're using Django, but we could not find a 'manage.py' file."
|
||||||
|
echo "'manage.py collectstatic' ignored."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "---> Collecting Django static files ..."
|
||||||
|
if ! python $MANAGE_FILE collectstatic --dry-run --noinput &> /dev/null; then
|
||||||
|
echo "WARNING: could not run 'manage.py collectstatic'. To debug, run:"
|
||||||
|
echo " $ python $MANAGE_FILE collectstatic --noinput"
|
||||||
|
echo "Ignore this warning if you're not serving static files with Django."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! python $MANAGE_FILE collectstatic --noinput 2>&1 | sed '/^Copying/d;/^$/d;/^ /d'; then
|
||||||
|
local status=$?
|
||||||
|
echo "ERROR: 'manage.py collectstatic' failed."
|
||||||
|
return $status
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
assemble
|
||||||
|
|
133
.sti/bin/run
133
.sti/bin/run
|
@ -1,38 +1,109 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
function is_gunicorn_installed() {
|
# This script uses these environment variables:
|
||||||
pip show gunicorn
|
#
|
||||||
|
# APP_MODULE: Python dotted path to your WSGI application.
|
||||||
|
# If not provided, tries to find the Python path to a 'wsgi.py' file
|
||||||
|
# in the source tree.
|
||||||
|
# That file is present in Django projects by default.
|
||||||
|
# APP_CONFIG: Optional configuration file for gunicorn.
|
||||||
|
# APP_FILE: Optional path to Python script to run your application.
|
||||||
|
# Defaults to 'app.py' if it exists.
|
||||||
|
#
|
||||||
|
# DISABLE_MIGRATE: if not empty, inhibits execution of 'manage.py migrate'.
|
||||||
|
|
||||||
|
BIND_ADDR="0.0.0.0:8080"
|
||||||
|
|
||||||
|
function run() {
|
||||||
|
# For SCL enablement
|
||||||
|
source .bashrc
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Try to run application with the strategies below, in precedence order.
|
||||||
|
# The first successful strategy takes over this script's process via exec.
|
||||||
|
# If no strategy succeed, report an error message and terminate.
|
||||||
|
run_django
|
||||||
|
run_gunicorn "$APP_MODULE"
|
||||||
|
run_python_script "${APP_FILE:-app.py}"
|
||||||
|
|
||||||
|
echo "ERROR: don't know how to run your application."
|
||||||
|
echo "Please set either APP_MODULE or APP_FILE environment variables,"
|
||||||
|
echo "or create a file 'app.py' to launch your application."
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
# For SCL enablement
|
function run_django() {
|
||||||
source .bashrc
|
! pip show -q django && return
|
||||||
|
|
||||||
set -e
|
# Find shallowest manage.py script, either ./manage.py or <project>/manage.py
|
||||||
|
local MANAGE_FILE=$(find . -maxdepth 2 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
|
||||||
|
|
||||||
|
django_migrate "$MANAGE_FILE"
|
||||||
|
|
||||||
|
# try to use gunicorn
|
||||||
|
run_gunicorn "$APP_MODULE"
|
||||||
|
# or fallback to Django's development server
|
||||||
|
django_runserver "$MANAGE_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function django_migrate() {
|
||||||
|
[ -n "$DISABLE_MIGRATE" ] && return
|
||||||
|
echo "---> Migrating database ..."
|
||||||
|
django_manage_cmd "$1" migrate --noinput
|
||||||
|
}
|
||||||
|
|
||||||
|
function django_runserver() {
|
||||||
|
echo "---> Serving application with 'manage.py runserver' ..."
|
||||||
|
echo "---> WARNING: this is NOT a recommended way to run you application in production!"
|
||||||
|
django_manage_cmd "$1" runserver "$BIND_ADDR"
|
||||||
|
}
|
||||||
|
|
||||||
|
function django_manage_cmd() {
|
||||||
|
local MANAGE_FILE="$1"
|
||||||
|
local CMD="${@:2}"
|
||||||
|
|
||||||
|
if [ ! -f "$MANAGE_FILE" ]; then
|
||||||
|
echo "WARNING: seems that you're using Django, but we could not find a 'manage.py' file."
|
||||||
|
echo "'manage.py $CMD' ignored."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$CMD" =~ ^runserver ]]; then
|
||||||
|
exec python "$MANAGE_FILE" $CMD
|
||||||
|
else
|
||||||
|
python "$MANAGE_FILE" $CMD
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_gunicorn() {
|
||||||
|
! pip show -q gunicorn && return
|
||||||
|
|
||||||
|
local APP_MODULE="$1"
|
||||||
|
|
||||||
|
if [ -z "$APP_MODULE" ]; then
|
||||||
|
# Find shallowest wsgi.py file, one of ./wsgi.py, <project>/wsgi.py or <project>/<project>/wsgi.py,
|
||||||
|
# replace "/" with "." and remove ".py" suffix
|
||||||
|
APP_MODULE=$(find . -maxdepth 3 -type f -name 'wsgi.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1 | sed 's:/:.:;s:.py$::')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$APP_MODULE" ]; then
|
||||||
|
echo "WARNING: seems that you're trying to use gunicorn, but no WSGI application module was specified."
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "---> Serving application with gunicorn ..."
|
||||||
|
exec gunicorn "$APP_MODULE" --bind="$BIND_ADDR" --access-logfile=- --config "$APP_CONFIG"
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_python_script() {
|
||||||
|
local APP_FILE="$1"
|
||||||
|
|
||||||
|
[ ! -f "$APP_FILE" ] && return
|
||||||
|
|
||||||
|
echo "---> Running application from Python script ..."
|
||||||
|
exec python -u "$APP_FILE"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
# Support for Django
|
run
|
||||||
|
|
||||||
# Take shallowest manage.py script
|
|
||||||
MANAGE_FILE=$(find . -maxdepth 3 -type f -name 'manage.py' -printf '%d\t%P\n' | sort -nk1 | cut -f2 | head -1)
|
|
||||||
|
|
||||||
if pip show -q django && [ -f "$MANAGE_FILE" ]; then
|
|
||||||
set -x
|
|
||||||
python $MANAGE_FILE migrate --noinput
|
|
||||||
set +x
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
export APP_FILE=${APP_FILE:-"app.py"}
|
|
||||||
|
|
||||||
if [[ ! -v APP_MODULE && -f setup.py ]]; then
|
|
||||||
APP_MODULE=`python setup.py --name`":application"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if is_gunicorn_installed && [[ -v APP_MODULE ]]; then
|
|
||||||
if [[ -v APP_CONFIG ]]; then
|
|
||||||
export CONFIG="--config ${APP_CONFIG}"
|
|
||||||
fi
|
|
||||||
exec gunicorn ${APP_MODULE} --bind=:8080 ${CONFIG}
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec python -u ${APP_FILE}
|
|
||||||
|
|
Loading…
Reference in a new issue