diff --git a/Makefile b/Makefile index 56ee18a44d..c38fab87cf 100644 --- a/Makefile +++ b/Makefile @@ -177,7 +177,7 @@ collectstatic: fi; \ mkdir -p awx/public/static && $(PYTHON) manage.py collectstatic --clear --noinput > /dev/null 2>&1 -UWSGI_DEV_RELOAD_COMMAND ?= supervisorctl restart tower-processes:awx-dispatcher tower-processes:awx-receiver +DEV_RELOAD_COMMAND ?= supervisorctl restart tower-processes:* uwsgi: collectstatic @if [ "$(VENV_BASE)" ]; then \ @@ -192,12 +192,13 @@ uwsgi: collectstatic --processes=5 \ --harakiri=120 --master \ --no-orphans \ - --py-autoreload 1 \ --max-requests=1000 \ --stats /tmp/stats.socket \ --lazy-apps \ - --logformat "%(addr) %(method) %(uri) - %(proto) %(status)" \ - --hook-accepting1="exec: $(UWSGI_DEV_RELOAD_COMMAND)" + --logformat "%(addr) %(method) %(uri) - %(proto) %(status)" + +awx-autoreload: + @/awx_devel/tools/docker-compose/awx-autoreload /awx_devel "$(DEV_RELOAD_COMMAND)" daphne: @if [ "$(VENV_BASE)" ]; then \ diff --git a/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 b/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 index b15699a12f..4659288024 100644 --- a/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 +++ b/tools/ansible/roles/dockerfile/templates/Dockerfile.j2 @@ -158,6 +158,8 @@ RUN pip3 install black git+https://github.com/coderanger/supervisor-stdout # It is nice to have in the dev env, but not necessary. # Add it back to the list above if the repo ever straighten up. RUN dnf --enablerepo=baseos-debug -y install python3-debuginfo || : + +RUN dnf install -y epel-next-release && dnf install -y inotify-tools && dnf remove -y epel-next-release {% endif %} # Copy app from builder diff --git a/tools/ansible/roles/dockerfile/templates/supervisor.conf.j2 b/tools/ansible/roles/dockerfile/templates/supervisor.conf.j2 index 95a25971aa..e67b79fbe9 100644 --- a/tools/ansible/roles/dockerfile/templates/supervisor.conf.j2 +++ b/tools/ansible/roles/dockerfile/templates/supervisor.conf.j2 @@ -27,7 +27,7 @@ stderr_logfile_maxbytes=0 command = make uwsgi directory = /awx_devel environment = - UWSGI_DEV_RELOAD_COMMAND='supervisorctl -c /etc/supervisord_task.conf restart all; supervisorctl restart tower-processes:daphne tower-processes:wsbroadcast' + DEV_RELOAD_COMMAND='supervisorctl -c /etc/supervisord_task.conf restart all; supervisorctl restart tower-processes:daphne tower-processes:wsbroadcast' {% else %} command = /var/lib/awx/venv/awx/bin/uwsgi /etc/tower/uwsgi.ini directory = /var/lib/awx diff --git a/tools/docker-compose/awx-autoreload b/tools/docker-compose/awx-autoreload new file mode 100755 index 0000000000..593f644d01 --- /dev/null +++ b/tools/docker-compose/awx-autoreload @@ -0,0 +1,15 @@ +#!/bin/env bash + +if [ $# -lt 2 ]; then + echo "Usage:" + echo " autoreload directory command" + exit 1 +fi + +inotifywait -mrq -e create,delete,attrib,close_write,move --exclude '/awx_devel/awx/ui' $1 | while read directory action file; do + if [[ "$file" =~ .*py$ ]]; then + echo "File changed: $file" + echo "Running command: $2" + eval $2 + fi +done diff --git a/tools/docker-compose/supervisor.conf b/tools/docker-compose/supervisor.conf index 0726c083fa..f7c0b6f57d 100644 --- a/tools/docker-compose/supervisor.conf +++ b/tools/docker-compose/supervisor.conf @@ -95,6 +95,20 @@ stderr_logfile_maxbytes=0 programs=awx-dispatcher,awx-receiver,awx-uwsgi,awx-daphne,awx-nginx,awx-wsbroadcast,awx-rsyslogd priority=5 +[program:awx-autoreload] +command = make awx-autoreload +autostart = true +autorestart = true +startsecs = 30 +stopasgroup=true +killasgroup=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +stdout_events_enabled = true +stderr_events_enabled = true + [eventlistener:superwatcher] command=stop-supervisor events=PROCESS_STATE_FATAL