Capistrano i stage

Witam, chciałbym używać capistrano wraz z dodatkiem multistage. Ustawiam:

set :stages, %w(production testing development) set :default_stage, "development" require "capistrano/ext/multistage"
Odpalam np: cap development deploy:restart, niestety zmienna stage nie jest ustawiona. Kolejne stejdże :slight_smile: różnią sie właściwie tylko bazą danych oraz suffixem stage, dlatego chciałbym móc użyć w kodzie np. czegoś takiego :

set :deploy_to, "#{dir}projects/mojprojekt-#{stage}"

zamiast tworzyć osobne configi dla każdego stage’a (stadium?) jak pokazano tutaj https://boxpanel.blueboxgrp.com/public/the_vault/index.php/Capistrano_Multi_Stage_Instructions

Jeszcze jedno pytanie, czy mógłby mi ktoś rozjaśnić co daje ustawienie tych zmiennych

role :app, application role :web, application role :db, application, :primary => true
Czy są to fizyczne adresy servera czy tez bazy danych ?
W tym momencie nie mam tego ustawionego, mam za to taki wpis

server "smart.megiteam.pl", :app, :web, :db, :primary => true

i łaczy się ok, rozwiązanie skopiowane stąd http://www.badurowie.org/2009/01/27/easy-as-a-piece-of-capistrano/

Swój cel chyba szybciej osiągniesz w taki sposób:
W config/deploy.rb dajesz

ENV['stage'] ||= 'staging'

i teraz wywołujesz:

cap deploy stage=testing

zmienna ENV[‘stage’] ma wartość testing
przy wywołaniu

cap deploy

będzie miała wartość domyślną staging

Co do drugiego pytania to najprościej zajrzeć do dokumentacji capistrano :slight_smile:

Role sluza do tego bys uruchamial pewne zadania tylko na odpowiednich maszynach. Przynajmniej tak mi się wydaje.

fastred: dzięki, działa
seban: właśnie na Twoim blogu w komentarzu napisałeś że dajesz tam localhost, to dzieki ustawieniu gateway to działa ? http://blog.sebastiannowak.net/2008/06/16/deploy-na-megiteam-2/

http://github.com/jamis/capistrano-ext

mam dokładnie wersje 1.2.1 zainstalowaną

wracajac do megiteam to deploy:setup działa ok, ale zwykły deploy ma jakieś problemy z dostępem, pomaga dodanie w deploy.rb

default_run_options[:pty] = true ssh_options[:forward_agent] = true
może sie komuś przyda

Artur:

[code]load ‘deploy’ if respond_to?(:namespace) # cap2 differentiator
Dir[‘vendor/plugins//recipes/.rb’].each { |plugin| load(plugin) }
load ‘config/deploy’

namespace :deploy do
desc “Restarts the application”
task :restart do
run “restart-app #{ application }”
end
end
seban@vk1008:~/apps/mratemymodel/current$ cat config/deploy.rb
set :application, “mratemymodel”
set :repository, “ssh://seban@sebastiannowak.net/home/seban/www/gits/mratemymodel”
set :deploy_to, “/home/seban/www/apps/#{application}”
set :scm, :git
set :user, “seban”
set :use_sudo, false

role :app, “sebastiannowak.net
role :web, “sebastiannowak.net
role :db, “sebastiannowak.net”, :primary => true[/code]
To u mnie dziala, w ubieglym tygodniu na takich ustawieniach wypychalem aplikacje na megiteam. Ale nie obejmuje to multistage.

dzięki, wrzuciłem jednak konfigi dla stageów do osobnych pików w /deploy, żeby móc odpalac np. tak: cap development deploy:restart.
Aha, bez linijki o której wspominałem wyżej

ssh_options[:forward_agent] = true

task restart działa ok, ale już pełny deploy zwraca

[xxxx.megiteam.pl] executing command ** [xxxx.megiteam.pl :: err] Permission denied, please try again. ** [xxxx.megiteam.pl :: err] Permission denied, please try again. ** [xxxx.megiteam.pl :: err] Permission denied (publickey,password). ** [xxxx.megiteam.pl :: err] fatal: The remote end hung up unexpectedly
Klucz jest w authorized_keys. Dziwne, ale grunt że działa.

Nie rozumiem tylko czemu jeśli ustawie np :app i :db różne to take restart próbuje odpalić na obu mimo że ten task ma :role => :app

Pytanie może bardziej związane z gitem niż Capistano. Czy są jakieś przeciwwskazania żeby wrzucać vendor/plugins do gita i stamtąd je później pobierać ? Czy może powinny być one instalowane recznie lub jakoś inaczej na produkcji i stage ?
Tutaj http://charlesmaxwood.com/deployment-with-capistrano/ pod koniec jest task dla gemów, jest coś podobnego dla pluginów ?

Jeśli nie będziesz trzymał pluginów w gicie, spowoduje to przede wszystkim, to że na produkcji i każdej maszynie deweloperskiej będziesz musiał instalować te pluginy, a dodatkowo możesz wystąpić, to że wszędzie zainstalujesz inną wersję pluginu. I któregoś dnia się okazuje, że na produkcji masz nowszą, inaczej działającą wersję pluginu, niż u siebie, albo nawet nie masz jakiegoś z nich. To są wady.
Zalet żadnych to nie ma, czyli katalog vendor jak najbardziej powinien być w gicie. Ogólnie poza takimi rzeczami jak logi, katalogi tymczasowe, zasoby uploadowane przez użytkowników czy pliki konfiguracyjne zależne od środowiska i maszyny, wszystko warto trzymać w systemie kontroli wersji.

Dzięki tjeden, tego mi było trzeba. Inne pytanie, mam np baze development która jest inna na localhoscie a inna na serverze. Znalazłem gdzieś taki task, w tym przykładzie dla produkcji, ale może ktoś ma lepsze pomysły

task :after_update_code, :roles => :app do run "cp #{release_path}/config/production.database.yml #{release_path}/config/database.yml" end

Tak jak pisze tjeden oczywiście pod żadnym pozorem nie trzymaj katalogu vendor w git! Nie ma nic gorszego niż checkout projektu na Maku i zonk bo w repo są gemy z native extensions na Linuksa. :>

Natomiast dobrym pomysłem jest podawanie konkretnego numer wersji gemu w environment.rb. Dodaj do tego task capistrano, który odpala na serwerze produkcyjnym ‘rake gems:install’ i już wszystko działa.

Jeśli jesteś odważny użyj Bundlera, który za Ciebie skonfiguruje wszystkie gemy i przy okazji rozwiąże parę problemów w stylu kura/jajko czyli co było pierwsze. Na razie nie jest to jednak zbyt stabilne rozwiązanie.

? :confused:

Mówimy o pluginach czy gemach? Artur pytał chyba o pluginy. Bo ja do katalogu vendor wrzucam pluginy i zawsze mi się wydawało(wydaje?), że nie ma osobnych wersji pluginów dla różnych systemów. Co innego z gemami, ale ich nigdy nie zamrażałem ani nie trzymałem w katalogu vendor, ani w gicie, tylko instalowałem osobno, najwygodniej właśnie w oparciu o rake gems:install, przy odpowiednio skonfigurowanym environment.rb. A bundler dla mnie jak na razie to jakieś nieporozumienie.

Braki, ale tjeden napisał, że vendor powinien być w gicie:

ale miał na myśli chyba faktycznie tylko pluginy a nie gemy :slight_smile:

Ja trzymam wszystkie gemy i pluginy z vendor w gicie poza tymi gemami, które wymagają kompilacji. Rozwiązanie nie jest idealne, bo trzeba pamiętać które wymagają kompilacji i je ręcznie zainstalować na produkcji. Do zalet tego rozwiązania w stosunku do instalowania wszystkich gem’ów po każdeym “cap deploy” na pewno należy zaliczyć to, że deploy jest o wiele szybszy bo nie wymaga za każdym razem instalowania wszystkich gemów.

Bundlerowi jeszcze nie przyglądałem się bliżej, mam nadzieję, że w końcu rozwiąże ten problem.

Przechodziłem przez temat zależności i wyrobiłem sobie pewne zdanie na ten temat. Miejsce na dysku jest tanie, tak? A więc pakuj do repo tyle ile jesteś w stanie. Pluginy, vendoruj gemy itp. Dlaczego narażać się na ryzyko instalacji gema/plugin w innej wersji u kolegi z zespołu, albo serwerze produkcyjnym lub testowym?

Gorąco polecam bundlera. To jeden z lepszych toolów (nie jest jeszcze idealny, czasem coś potrafi nie działać) z jakich ostatnio korzystałem. Nie wyobrażam sobie by inaczej określać zależności w aplikacjach rubinowych (config.gem to marna proteza).

Bundler jest świetny jednak nadal mocno rozwojowy i dziurawy. Może sprawiać kłopoty

ale miał na myśli chyba faktycznie tylko pluginy a nie gemy :)[/quote]
Ech. Nie doczytałem. Dla mnie plugin=gem i omijam te, które trzeba instalować do vendor - stąd nieporozumienie.

Nie lubię trzymania pluginów/gemów w katalogu aplikacji, spowalnia to pracę ack i quick open w TextMate.

Ale każdemu tyle pragmatyzmu ile u niego działa.

Uff, bo już myślałem, że jakąś herezję głoszę. :slight_smile:

Kolejne pytanie odnośnie Capistrano. Chciałbym się upewnić co do jednej rzeczy. Capistrano tworzy link /aplikacja/current który wskazuje na katalog z najnowszym deployem w /aplikacja/releases/ . Skąd serwer www gdy wchodzę na stronę będzie w takim razie pobierał pliki, z katalogu /aplikacja tak jak bez Capistrano, czy też sam użyje dowiązania current i pliki bedą z najnowszego deploymentu czy może powinienem przekierować serwer w panelu administracyjnym na link aplikacja/current ? Co jeśli ktoś zmieni jakiś plik ręcznie niekoniecznie na produkcji ale np. w aplikacja-stage/ ?

Serwer użyje tego ustawienia, które mu podasz w konfigu. Np. dla Apache + Passengera ustawia się z reguły DocumentRoot na /aplikacja/current/public

Po rolloucie symlink current jest ustawiany na ostatni release i serwer jest restartowany (serwer “widzi” nowy link current czyli ostatni deploy).