Автоматический запуск нескольких демонов сельдерея с помощью Jenkins
У меня есть сервер Ubuntu, на котором запущено 5 разных сайтов django. Они используются для тестирования, поэтому каждый разработчик имеет свой собственный сайт и базу данных, а также один сайт для интегрированного кода, который обновляется только тогда, когда функции готовы. Jenkins используется для обновления каждого сайта с Github при каждом внесении изменений в репозиторий.
Недавно мы добавили Django-Celery в наши зависимости, чтобы мы могли выполнять некоторую обработку загруженных файлов асинхронно. Каждый сайт теперь нуждается в собственной очереди сельдерея, которая использует правильные настройки (база данных, каталог загрузки и т. Д.) Для этого конкретного сайта.
Я хочу перезапускать каждый сервер сельдерея всякий раз, когда код изменяется, чтобы он мог получать последние изменения автоматически. В нашем репозитории git есть скрипт обновления, который Jenkins запускает всякий раз, когда обновляет сайт. Когда я пытаюсь запустить демона сельдерея в этом сценарии, запускается сельдерей, но он снова выключается в конце сценария.
Вот копия моего скрипта обновления:
#!/bin/bash
# Delete all *.pyc files
find $WORKSPACE -name '*.pyc' | xargs rm
# Update the database
[…]
# Run automated tests
python code/manage.py test <project> --noinput
TEST_STATUS=$?
# Refresh this repo's public website
touch $WORKSPACE/apache/wsgi.py
# Restart our celery daemon for this installation
/sbin/start-stop-daemon --stop -p $WORKSPACE/../celery.pid
echo 'Starting Celery Server'
# When run on the command line, this line starts a daemon just fine
/sbin/start-stop-daemon --start --background --quiet --oknodo -p $WORKSPACE/../celery.pid -m --exec $WORKSPACE/code/manage.py -- celeryd --logfile=$WORKSPACE/../celery.log
echo 'Celery Server Status: '$?
exit $TEST_STATUS
Вот копия журнала сельдерея во время выполнения этого сценария:
[2011-05-10 20:45:41,286: WARNING/MainProcess] -------------- celery@ip-10-227-139-6 v2.2.6
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: djkombu.transport.DatabaseTransport://guest@localhost:5672/
- ** ---------- . loader: djcelery.loaders.DjangoLoader
- ** ---------- . logfile: /var/lib/jenkins/jobs/mpdaugherty-farmforce/workspace/../celery.log@WARNING
- ** ---------- . concurrency: 1
- ** ---------- . events: OFF
- *** --- * --- . beat: OFF
-- ******* ----
--- ***** ----- [Queues]
-------------- . celery: exchange:celery (direct) binding:celery
[2011-05-10 20:45:41,333: WARNING/MainProcess] celery@ip-10-227-139-6 has started.
[2011-05-10 20:46:28,481: WARNING/MainProcess] celeryd: Warm shutdown (MainProcess)
Любой совет, как я могу заставить демонов сельдерея, начатых Дженкинсом, не закрываться? Большое спасибо!
1 ответ
Один из моих коллег, наконец, сделал эту работу. Вместо того, чтобы запускать демона Celery напрямую, мы используем at
запланировать это немедленно и отключиться от текущей оболочки.
Вместо:
# Restart our celery daemon for this installation
/sbin/start-stop-daemon --stop -p $WORKSPACE/../celery.pid
echo 'Starting Celery Server'
# When run on the command line, this line starts a daemon just fine
/sbin/start-stop-daemon --start --background --quiet --oknodo -p $WORKSPACE/../celery.pid -m --exec $WORKSPACE/code/manage.py -- celeryd --logfile=$WORKSPACE/../celery.log
Изменить на:
# Restart our celery daemon for this installation
echo "/sbin/start-stop-daemon --stop -p $WORKSPACE/../celery.pid
echo 'Starting Celery Server'" | at now
# When run on the command line, this line starts a daemon just fine
echo "/sbin/start-stop-daemon --start --background --quiet --oknodo -p $WORKSPACE/../celery.pid -m --exec $WORKSPACE/code/manage.py -- celeryd --logfile=$WORKSPACE/../celery.log" | at now