Jak Automatycznie uruchomić opóźnione zadanie podczas wdrażania projektu rails na Amazon Elastic Beanstalk?
Hostuję projekt rails na Amazon Elastic Beanstalki próbuję skonfigurować polecenie container, aby automatycznie ponownie uruchomić mój delayed_job worker na serwerze po każdym wdrożeniu.
Próbowałem z tym:
container_commands:
restartdelayedjob:
command: "RAILS_ENV=production script/delayed_job --pid-dir=/home/ec2-user/pids start"
cwd: /var/app/current
Ale wydaje się, że wersja popchnięta jest wdrażana po ponownym uruchomieniu workera, więc zadania nie zostały przetworzone przez worker.
Kiedy podłączam się do mojej instancji przez ssh, zabijam proces worker I restartuję nowy z folderu wdrożona wersja, wszystko działa dobrze.
Masz jakiś pomysł, jak sobie z tym poradzę?Thanks
4 answers
Zgodnie z dokumentacją Amazona dla container_commands
:
Uruchamiane są po skonfigurowaniu aplikacji i serwera www oraz wyodrębnieniu Pliku wersji aplikacji, ale przed wdrożeniem wersji aplikacji .
(moje)
Oznacza to, że w tym momencie /var/app/current
, który ustawiasz jako cwd
dla Twojego polecenia, nadal wskazuje na poprzednią wersję. Jednak domyślnie, z dokumentów ponownie, cwd
:
Jest katalogiem rozpakowanej aplikacji.
Oznacza to, że jeśli chcesz uruchomić delayed_job
z katalogu aplikacji, która właśnie została wyodrębniona (ale jeszcze nie została wdrożona), nie nadpisuj cwd
i powinieneś uruchomić delayed_job dla aplikacji, która ma zostać wdrożona.
Aktualizacja:
Skonfigurowałem to sam i stwierdziłem, że istnieją ograniczenia w robieniu tego za pomocą standardowego container_commands
- zasadniczo delayed_job zostanie uruchomiony, gdy będzie nadal w katalogu /var/app/ondeck
. Zazwyczaj jest to OK, ale miałem pewne problemy z niektórymi zadaniami, ponieważ ta ścieżka utknęła wokół niego spowodowałaby błędy, ponieważ aplikacja była teraz w /var/app/current
.
Znalazłem nieudokumentowaną (więc uwaga!) podejście, że można dodać skrypty do uruchomienia po ponownym uruchomieniu serwera aplikacji (a nowe wdrożenie jest w /var/app/current
).
Zasadniczo Elastic Beanstalk wykona skrypty w /opt/elasticbeanstalk/hooks/appdeploy/post
po ponownym uruchomieniu serwera www. Oznacza to, że jeśli upuścisz skrypty powłoki do tego katalogu, zostaną one uruchomione.
Stworzyłem taki skrypt powłoki:
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
cd $EB_CONFIG_APP_CURRENT
su -c "RAILS_ENV=production script/delayed_job --pid-dir=$EB_CONFIG_APP_SUPPORT/pids restart" $EB_CONFIG_APP_USER
Załadowałem ten skrypt do wiadra S3 i upewniłem się, że jest "publiczny". Następnie możesz użyć skryptu options w swoim katalogu .ebextensions
(np. 99delayed_job.config
) aby wdrożyć ten skrypt jako część aplikacji deploy, biorąc pod uwagę, że katalog post
może nie istnieć:
commands:
create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
mode: "000755"
owner: root
group: root
source: http://YOUR_BUCKET.s3.amazonaws.com/99_restart_delayed_job.sh
Po uruchomieniu powinieneś zobaczyć coś takiego w swoim /var/log/eb-tools.log
:
2013-05-16 01:20:53,759 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Executing directory: /opt/elasticbeanstalk/hooks/appdeploy/post/
2013-05-16 01:20:53,760 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Executing script: /opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh
2013-05-16 01:21:02,619 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Output from script: delayed_job: trying to stop process with pid 6139...
delayed_job: process with pid 6139 successfully stopped.
2013-05-16 01:21:02,620 [INFO] (6467 MainThread) [directoryHooksExecutor.py-29] [root directoryHooksExecutor info] Script succeeded.
Jak już mówiłem, umieszczanie rzeczy w tym katalogu "post" jest nieudokumentowane - ale mam nadzieję, że w pewnym momencie Amazon dodał rzeczywiste wsparcie dla skryptów .options
do uruchamiania poleceń po wdrożeniu, w takim przypadku można przenieść to do oficjalnie wspierane podejście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-16 01:40:48
On 64bit Amazon Linux 2014.09 v1.1.0 uruchomiony Ruby 2.1 (osobowa osobowa) , działa dzięki ten post .
Zauważ, że ten skrypt jest uruchamiany jako root, ale twoi pracownicy powinni być uruchamiani jako użytkownik webapp.
# Adds a post-deploy hook such that after a new version is deployed
# successfully, restarts the delayed_job workers.
#
# http://stackoverflow.com/questions/14401204/how-to-automatically-restart-delayed-job-when-deploying-a-rails-project-on-amazo
# http://www.dannemanne.com/posts/post-deployment_script_on_elastic_beanstalk_restart_delayed_job
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_delayed_job.sh":
mode: "000755"
owner: root
group: root
encoding: plain
content: |
#!/usr/bin/env bash
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_APP_CURRENT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
EB_APP_PIDS_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh
cd $EB_APP_CURRENT_DIR
# Switch to the webapp user. Worker shouldn't be run as root.
su -s /bin/bash -c "bundle exec bin/delayed_job --pid-dir=$EB_APP_PIDS_DIR restart" $EB_APP_USER
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 19:08:00
W przypadku, gdyby ktoś chciał opóźnić pracę w najnowszym ElasticBeanstalk (64bit Amazon Linux 2014.09 v1.0.9 z systemem Ruby 2.1 (Puma)): mam go do pracy przy użyciu poniższego kodu (dzięki damontorgerson). Te akta są w ruby.config in .folder ebextensions.
# Install git in order to be able to bundle gems from git
packages:
yum:
git: []
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/50_restart_delayed_job":
mode: "000777"
owner: root
group: root
content: |
EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
EB_APP_STAGING_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_staging_dir)
EB_CONFIG_APP_CURRENT=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
EB_CONFIG_APP_LOGS=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)
EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
EB_CONFIG_APP_PIDS=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
. $EB_SUPPORT_DIR/envvars
. $EB_SCRIPT_DIR/use-app-ruby.sh
cd $EB_CONFIG_APP_CURRENT
. $EB_SUPPORT_DIR/envvars.d/sysenv
bin/delayed_job --pid-dir=/var/tmp restart
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-28 13:29:36
Ja swoje tak mam z klejnotem" demony":
commands:
create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
webapp_pids:
command: "mkdir /home/webapp/pids"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_delayed_job.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
. /opt/elasticbeanstalk/support/envvars
chown webapp:webapp /home/webapp/pids
su -l -c "$EB_CONFIG_APP_CURRENT/bin/delayed_job --pid-dir=/home/webapp/pids restart" $EB_CONFIG_APP_USER
echo "worker starting" >> /var/log/directory-hooks-executor.log
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-08 20:49:08