Jak wdrożyć na jednym konkretnym serwerze przy użyciu Capistrano
Mam system w produkcji, który ma kilka serwerów w kilku rolach. Chciałbym przetestować nowy serwer aplikacji, wdrażając go na tym konkretnym serwerze, bez konieczności ponownego rozmieszczania na każdym serwerze produkcyjnym. Czy istnieje sposób, aby poprosić Capistrano, aby wdrożyć na określonym serwerze? Idealnie chciałbym móc uruchomić coś takiego jak
cap SERVER=app2.example.com ROLE=app production deploy
Gdybym tylko chciał wdrożyć do app2.example.com.
Dzięki![update] Wypróbowałem rozwiązanie zaproponowane przez wulonga przez wykonanie:
cap HOSTS=app2.server.hostname ROLE=app qa deploy
Ale capistrano wydawał się próbować wykonywać zadania dla innych ról na tym serwerze oprócz zadań aplikacji. Może muszę zaktualizować moją wersję cap (używam v2.2.0)?
5 answers
W końcu zamieściłem pytanie na liście użytkowników capistrano tutaj i otrzymałem następującą odpowiedź od Jamisa (edytowany trochę przeze mnie tutaj dla jasności):
Wypróbuj zmienną środowiskową HOSTS:
cap HOSTS=app2.example.com production deploy
Zauważ, że w ten sposób app2 będzie traktowany jako pełniący każdą rolę, a nie tylko bez względu na to, w jakiej roli (- ach) zostanie zadeklarowana.
Jeśli chcesz zrobić regularne wdrożenie, ale działaj tylko na app2, i tylko jak app2 jest zadeklarowana w pliku receptury, można użyć HOSTFILTER zmienna zamiast:
cap HOSTFILTER=app2.example.com production deploy
[...]
Rozważ ten konkretny przykład. Załóżmy, że Twój skrypt definiuje trzy serwery, A, B i C. i definiuje zadanie, " foo", to (domyślnie) chce działać na A i B, ale nie NA C. W ten sposób:
role :app, "A", "B"
role :web, "C"
task :foo, :roles => :app do
run "echo hello"
end
Teraz, jeśli to zrobisz cap foo
, uruchomi polecenie echo zarówno na A jak I B.
Jeśli wykonasz cap HOSTS=C foo
, uruchomi polecenie echo Na C,
niezależnie od parametru: roles do zadania.
Jeśli to zrobisz cap HOSTFILTER=C foo
, nie będzie działać Komenda echo w
wszystkie, ponieważ przecięcie (A B) I (C) jest zbiorem pustym. (Tam
nie ma hostów na liście hostów foo, które pasowałyby do C.)
Jeśli wykonasz cap HOSTFILTER=A foo
, uruchomi polecenie echo tylko na
A, ponieważ (A B) przecinane przez (a) jest (a).
Wreszcie, jeśli to zrobisz cap HOSTFILTER=A,B,C foo
, uruchomi echo
polecenie na A i B (ale nie C), ponieważ (A B) przecinają się z (A B C)
jest (A B).
Podsumowując: hosty całkowicie nadpisują deklarację hostów lub ról zadania i siły wszystko, aby uruchomić z podanymi hostami. Z drugiej strony, HOSTFILTER po prostu filtruje istniejące hosty na podaną listę, wybierając tylko te serwery, które są już w Lista zadań serwera.
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
2011-10-05 15:55:36
Po wyjęciu z pudełka powinny działać:
cap HOSTS=app2.example.com ROLE=app deploy
Jeśli chcesz wdrożyć do > 1 serwera o tej samej roli:
cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy
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
2009-01-11 00:49:46
Mam podobny problem i wypróbowałem następujące. Działa:
cap production ROLES=web HOSTS=machine1 stats
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
2011-03-30 12:36:19
Powinieneś być w stanie zrobić coś takiego w deploy.rb:
task :production do
if ENV['SERVER'] && ENV['ROLE']
role ENV['ROLE'], ENV['SERVER']
else
# your full config
end
end
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
2009-01-10 05:06:32
Możesz również określić parametr hostów na poziomie zadania w ten sposób:
task :ship_artifacts, :hosts => ENV['DEST_HOST'] do
end
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-03-11 07:53:37