diff --git a/docs/how-to-upgrade.md b/docs/how-to-upgrade.md index 07c5127..e5f166e 100644 --- a/docs/how-to-upgrade.md +++ b/docs/how-to-upgrade.md @@ -185,7 +185,7 @@ Test your changes: Things to watch out for: -- Run `rm -rf var` and `find . -name "*.md5" -delete` to reset the environment and start over. +- Run `rm -rf var/ src/` and `find . -name "*.md5" -delete` to reset the environment and start over. - Upgrading Node.js can require that we also upgrade dependencies in `package.json`. If you see any npm errors during setup: diff --git a/ixc_django_docker/bin/dev-reset-environment.sh b/ixc_django_docker/bin/dev-reset-environment.sh new file mode 100755 index 0000000..d84aa78 --- /dev/null +++ b/ixc_django_docker/bin/dev-reset-environment.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +# Reset a local development environment + +set -e + +if [[ -z "$PROJECT_DIR" ]]; then + >&2 echo "ERROR: Missing environment variable: PROJECT_DIR" + exit 1 +fi + +rm -rf "$DIR/var" + +find . -name "*.md5" -delete diff --git a/ixc_django_docker/bin/setup.sh b/ixc_django_docker/bin/setup.sh index b085a97..9fc4f63 100755 --- a/ixc_django_docker/bin/setup.sh +++ b/ixc_django_docker/bin/setup.sh @@ -32,10 +32,6 @@ setup-postgres.sh # Apply migrations. migrate.sh "$PROJECT_DIR/var" -# Run build script. -echo "Executing: npm run ${SETUP_NPM_RUN:-build}..." -npm run "${SETUP_NPM_RUN:-build}" --if-present - # Save git commit. echo "$(git rev-parse HEAD)" > "$PROJECT_DIR/var/setup-git-commit.txt" echo "Updated '$PROJECT_DIR/var/setup-git-commit.txt' ($(cat $PROJECT_DIR/var/setup-git-commit.txt))" diff --git a/ixc_django_docker/settings/base.py b/ixc_django_docker/settings/base.py index 2ce8225..2b8c9f4 100644 --- a/ixc_django_docker/settings/base.py +++ b/ixc_django_docker/settings/base.py @@ -20,6 +20,9 @@ from django.utils.six import text_type +# Store DOTENV from environment as a setting +DOTENV = os.environ.get('DOTENV', 'dotenv-not-set') + # Get project directory from environment. This MUST already be defined. # Copied from __init__.py I'm not sure why it's needed here as well PROJECT_DIR = os.environ['PROJECT_DIR'].rstrip('/') @@ -136,6 +139,9 @@ MEDIA_ROOT = os.path.join(VAR_DIR, 'media_root') MEDIA_URL = '/media/' +# Prefix for admin URL paths, see `ixc_django_docker.urls` +ADMIN_URL = '/admin/' + # # HTTPS # diff --git a/ixc_django_docker/urls.py b/ixc_django_docker/urls.py index 7aefa2a..88e8fd2 100644 --- a/ixc_django_docker/urls.py +++ b/ixc_django_docker/urls.py @@ -17,10 +17,10 @@ # Django Admin. if 'django.contrib.admin' in settings.INSTALLED_APPS: + _prefix = settings.ADMIN_URL.strip("/") urlpatterns += [ - url(r'^admin/doc/', include('django.contrib.admindocs.urls')), - url(r'^admin/util/tools/', include('admin_tools.urls')), - url(r'^admin/', include(admin.site.urls)), + url(r'^%s/doc/' % _prefix, include('django.contrib.admindocs.urls')), + url(r'^%s/' % _prefix, include(admin.site.urls)), ] # Django Auth. diff --git a/project_template/.dockerignore b/project_template/.dockerignore index 984b92f..7499750 100644 --- a/project_template/.dockerignore +++ b/project_template/.dockerignore @@ -20,7 +20,7 @@ project_settings_local.py src/ static_root/ var/ -venv +venv/ # Docker ignores. *.secret diff --git a/project_template/.env.local.sample b/project_template/.env.local.sample index 92f8967..2cbabf2 100644 --- a/project_template/.env.local.sample +++ b/project_template/.env.local.sample @@ -2,3 +2,7 @@ export DOTENV='develop' export TRANSCRYPT_PASSWORD='' # Get from 1Password # export WITHOUT_COVERAGE=1 + +# Safely send real emails; Bandit prevents sending to arbitrary addresses +export BANDIT_EMAIL='YOURNAME@interaction.net.au' +export BANDIT_WHITELIST='interaction.net.au,user_abc@client.org.au' diff --git a/project_template/codefresh.yml b/project_template/codefresh.yml index d4af7ff..e19a05a 100644 --- a/project_template/codefresh.yml +++ b/project_template/codefresh.yml @@ -10,48 +10,59 @@ steps: type: build image_name: interaction/project_template - run_tests: - type: composition - composition: - version: '2' + # Run tests and push built image in parallel + in_parallel: + type: parallel + steps: - services: - django: - depends_on: - # - elasticsearch - - postgres - - redis - environment: - DOTENV: test - # ELASTICSEARCH_ADDRESS: elasticsearch:9200 - PGHOST: postgres - PGUSER: postgres - REDIS_ADDRESS: redis:6379 - image: '${{build_image}}' + # Push UNTESTED image to improve caching (not to be used directly) + push_untested_image: + candidate: '${{build_image}}' + type: push + tag: 'untested-${{CF_REVISION}}' - # elasticsearch: - # image: interaction/elasticsearch-icu:7-alpine + run_tests: + type: composition + composition: + version: '2' - postgres: - environment: - POSTGRES_HOST_AUTH_METHOD: trust - image: postgres:12.2-alpine + services: + django: + depends_on: + # - elasticsearch + - postgres + - redis + environment: + DOTENV: test + # ELASTICSEARCH_ADDRESS: elasticsearch:9200 + PGHOST: postgres + PGUSER: postgres + REDIS_ADDRESS: redis:6379 + image: '${{build_image}}' - redis: - image: redis:6-alpine + # elasticsearch: + # image: interaction/elasticsearch-icu:7-alpine - volumes: - # elasticsearch-data: - postgres-data: - redis-data: + postgres: + environment: + POSTGRES_HOST_AUTH_METHOD: trust + image: postgres:12.2-alpine - composition_candidates: - django: - command: runtests.sh --failfast . - when: - condition: - all: - skip_tests_variable: lower('${{CF_SKIP_TESTS}}') != 'true' + redis: + image: redis:6-alpine + + volumes: + # elasticsearch-data: + postgres-data: + redis-data: + + composition_candidates: + django: + command: runtests.sh --failfast . + when: + condition: + all: + skip_tests_variable: lower('${{CF_SKIP_TESTS}}') != 'true' push_images: candidate: '${{build_image}}' diff --git a/project_template/package.json b/project_template/package.json index c7c0bbe..499e3c4 100644 --- a/project_template/package.json +++ b/project_template/package.json @@ -2,6 +2,7 @@ "name": "project_template", "dependencies": { "bower": "^1.8.2", + "npm-run-all": "^4.1.5", "sass": "^1.9.0" }, "private": true, diff --git a/project_template/requirements.in b/project_template/requirements.in index bdb8108..0b572ce 100644 --- a/project_template/requirements.in +++ b/project_template/requirements.in @@ -1,2 +1,33 @@ # -e ..[celery,celery4,celery-email,compressor,datadog,debug-toolbar,email-bandit,extensions,logentries,master-password,newrelic,nose,post-office,postgres,pydevd,sentry,storages,whitenoise] -e git+https://github.com/ixc/ixc-django-docker.git@master#egg=ixc-django-docker[celery,celery4,celery-email,compressor,datadog,debug-toolbar,email-bandit,extensions,logentries,master-password,newrelic,nose,post-office,postgres,pydevd,sentry,storages,whitenoise] + + +############################################################################## +# Django<1.11 compatibility recommendations + +# -e git+https://github.com/ixc/ixc-whitenoise.git@9812e7b3caa62a438c9332653c2b297856d6f104#egg=ixc-whitenoise # Compatibilty with older Django +# celery<4.3 # Version 4.3 requires Django>=1.11 +# django-appconf<1.0.4 # Version 1.0.4 should work with Django 1.8 but doesn't +# django-celery-beat<1.6 # Version 1.6 requires Django>=1.11.17 +# django-celery-email<3 # Version 3.0.0 requires Django>1 +# django-celery-results<1.1 # Version 1.1 requires celery>=4.3 +# django-compressor<2.2 # Version 2.3 requires Django>1.11, but 2.2 doesn't work +# django-debug-toolbar<1.10 # Version 1.10 requires Django>=1.11 +# django-extensions<2.1.1 # Version 2.1.1 requires Django>=1.11 +# django-ipware<3 # Version 3 requires Python>=3.5 +# django-post-office<3.3 # Version 3.3.0 requires Django>=1.11 +# django-redis<4.9 # Version 4.9.0 requires Django>=1.11 +# django-storages<1.6.6 # Version 1.6.6 requires Django>=1.11 +# django-timezone-field<3.1 # Version 3.1 requires Django>=1.11 +# jsonfield<2.1 # Version 2.1 requires Django>=1.11 + +############################################################################## + + +############################################################################## +# Use Thumbor for thumbnails (latest versions of IC forks of Thumbor libs) + +# -e git+https://github.com/ixc/django-thumbor.git@481cf39536b384369b2bc31da2af2bee34a4c617#egg=django-thumbor +# -e git+https://github.com/ixc/libthumbor.git@d5f44bbd6cd7c19f61f47d941213d1de52209521#egg=libthumbor + +############################################################################## diff --git a/setup.py b/setup.py index bd9d0db..40f05b6 100644 --- a/setup.py +++ b/setup.py @@ -93,6 +93,7 @@ 'storages': [ 'boto3', 'django-storages', + 'requests', ], 'whitenoise': [ 'ixc-whitenoise',