Автоматический запуск нескольких демонов сельдерея с помощью Jenkins - PullRequest
4 голосов
/ 11 мая 2011

У меня есть сервер 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 Ответ

7 голосов
/ 20 мая 2011

Один из моих коллег, наконец, сделал эту работу. Вместо того, чтобы запускать демона 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
...