2009-01-09 9 views
53

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 wdrażania na każdym serwerze produkcyjnym. Czy istnieje sposób, aby poprosić Capistrano o wdrożenie na konkretnym serwerze? Idealnie chciałbym móc uruchomić coś w rodzaju: , jeśli chcę tylko wdrożyć na app2.example.com.Jak wdrożyć na pojedynczym serwerze przy użyciu Capistrano

Dzięki!

[aktualizacja] Próbowałem rozwiązanie sugerowane przez Wulong wykonując:

cap HOSTS=app2.server.hostname ROLE=app qa deploy 

ale capistrano wydawało się próby wykonania zadania dla innych ról na tym serwerze oprócz zadań aplikacji. Może muszę zaktualizować moją wersję cap (używam v2.2.0)?

Odpowiedz

122

skończyło się zamieszczając pytanie na Kapistrana Lista użytkowników here, i otrzymał następującą odpowiedź od Jamis (red trochę przeze mnie tu dla jasności):


spróbować gospodarze zmienną środowiskową:

cap HOSTS=app2.example.com production deploy 

Należy zauważyć, że w ten sposób będą traktować app2 jako w każdej roli nie tylko cokolwiek rola (e) zdarza się być zadeklarowane.

Jeśli to, co chcesz robić regularne wdrażanie, ale tylko działać na App2 i tylko jako app2 jest zadeklarowana w pliku receptury, ty może używać HOSTFILTER zmienna zamiast:

cap HOSTFILTER=app2.example.com production deploy 

[...]

Rozważmy ten konkretny przykład. Załóżmy, że Twój skrypt definiuje trzy serwery, A, B, i C i określa zadania, "foo", że (domyślnie) chce uruchomić na A i B, ale nie C. Podobnie jak to:

role :app, "A", "B" 
role :web, "C" 

task :foo, :roles => :app do 
    run "echo hello" 
end 

teraz, jeśli zrobić cap foo, to będzie działać z polecenia echo zarówno a i B.

Jeśli nie cap HOSTS=C foo, to będzie działać na polecenie echo C, niezależnie od: role parametr do zadania .

Jeśli wykonasz cap HOSTFILTER=C foo, to nie uruchomisz komendy echo pod numerem , ponieważ przecięcie (A B) i (C) jest zbiorem pustym.(Nie żadnych gospodarze listy gospodarza Foo pasujących C)

Jeśli nie cap HOSTFILTER=A foo, to będzie działać echa polecenia tylko na A ponieważ (A B) przecinają się z (A) (A).

Wreszcie, jeśli nie cap HOSTFILTER=A,B,C foo, to będzie działać echa polecenie na A i B (ale nie C), ponieważ (A B) przecinają się z (A B C) jest (A B).

Podsumowując: HOSTS całkowicie przesłania deklarację gospodarzy lub ról zadania i zmusza do uruchomienia wszystkiego względem podanych hostów. Z kolei HOSTFILTER po prostu filtruje istniejące hosty na podstawie podanej listy, wybierając tylko te serwery, które są już na liście serwerów zadań na stronie .

+0

Wygląda na to, że to już nie działa z Capistrano 3.4 – collimarco

+0

W Capistrano 3, użyjesz zmiennej środowiskowej HOSTS dla tego, co HOSTFILTER znajduje się w Capistrano 2. http://capistranorb.com/documentation/advanced-features/host-filtering / – codener

1

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 
3

Poniższy powinien działać po wyjęciu z pudełka:

cap HOSTS=app2.example.com ROLE=app deploy 

Jeśli chcesz wdrożyć do> 1 serwer z tej samej roli:

cap HOSTS=app2.example.com,app3.example.com,app4.example.com ROLE=app deploy 
+1

Próbowałem pierwszym przypadku (Instalacja na pojedynczym serwerze aplikacji) wykonując cap HOSTS = app2.server .hostname ROLE = app qa wdrożyć , ale capistrano wydaje 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 wersji 2.2.0). –

+0

HOSTFILTER jest odpowiedzią, nie tego chcesz. –

1

Mam podobny problem i próbowałem następujących rzeczy. To działa:

cap production ROLES=web HOSTS=machine1 stats 
0

Można również specifiy gospodarze zadaniowy poziomie parametrów w ten sposób:

task :ship_artifacts, :hosts => ENV['DEST_HOST'] do 

end