2012-04-18 34 views
30

Rozważam możliwość użycia Capistrano jako ogólnego rozwiązania do wdrażania. Przez "rodzajowy" mam na myśli nie-szyny. Nie jestem zadowolony z jakości dokumentacji, którą znam, ale nie patrzę na te, które zakładają, że wdrażasz szyny. Więc spróbuję coś zhackować na podstawie kilku przykładów, ale jest kilka problemów, z jakimi mam do czynienia od samego początku.Przekazywanie parametrów do Capistrano

Mój problem polega na tym, że cap deploy nie ma wystarczających informacji, aby cokolwiek zrobić. Co ważne, brakuje znacznika dla wersji, którą chcę wdrożyć, i ta ma do przekazania w linii poleceń.

Innym problemem jest to, jak określić moje repozytorium git. Nasz serwer git jest dostępny przez SSH na koncie użytkownika, ale nie wiem, jak zmienić deploy.rb, aby użyć identyfikatora użytkownika jako części adresu URL scm.

Jak mogę to zrobić?

Przykład

I Aby wdrożyć wynik pierwszej Sprint drugiej wersji. To oznaczono w repozytorium git jako r2s1. Załóżmy też, że użytkownik "johndoe" dostaje zadanie wdrożenia systemu. Aby uzyskać dostęp do repozytorium, musi użyć adresu URL: [email protected]:app. Tak więc zdalny adres URL repozytorium zależy od identyfikatora użytkownika.

Linie poleceń, aby uzyskać żądane pliki byłoby takie:

git clone [email protected]:app 
cd app 
git checkout r2s1 
+0

Hej, mam nadzieję, że nie zignorujesz naszych odpowiedzi. Skomentuj je przynajmniej proszę. :) – deadrunk

Odpowiedz

46

Has Jarrad powiedział, capistrano -ash to dobry podstawowy zestaw modułów pomocniczych do wdrażania innych typów projektów, choć nie jest to wymagane na koniec dnia. Jest to po prostu język skryptowy i większość zadań jest wykonywana za pomocą poleceń systemowych, a kończy się prawie jak skrypt powłoki.

Aby przekazać parametry, można ustawić flagę -s po uruchomieniu cap, aby dać parę kluczy. Najpierw utwórz takie zadanie.

desc "Parameter Testing" 
task :parameter do 
    puts "Parameter test #{branch} #{tag}" 
end 

Następnie uruchom swoje zadanie w ten sposób.

cap test:parameter -s branch=master -s tag=1.0.0 

Za ostatnią część. Poleciłbym ustawić dostęp bez haseł za pomocą kluczy ssh do twojego serwera. Ale jeśli chcesz wziąć to od bieżącego zalogowanego użytkownika.Możesz zrobić coś takiego.

desc "Parameter Testing" 
task :parameter do 
    system("whoami", user) 
    puts "Parameter test #{user} #{branch} #{tag}" 
end 

UPDATE: Poprawki do pracy z najnowszymi wersjami Kapistrana. Tablica konfiguracji nie jest już dostępna.

Globalne parametry: Zobacz komentarze Użyj zestawu: branch, fetch (: branch, 'a-default-value'), aby używać parametrów globalnie. (I przekazują je zamiast -S zamiast.)

+0

To wszystko w porządku, ale jak mam powiedzieć Capistrano, jaki tag powinien sprawdzić? –

+1

Korzystanie z parametru -s. Tak więc miałbym taki wiersz polecenia, aby wdrożyć konkretny tag. tag cap produkcyjnej wdrożyć -s = 2.1.3 Jeśli wykorzystanie capistano-popiołu, po prostu trzeba zrobić zestaw: gałąź, # {konfiguracja [: tag]} To powinno kasy tag ustaw na linii poleceń –

+2

To już nie działa. Zgodnie z https://groups.google.com/forum/?fromgroups=#!topic/capistrano/1nFQPWf9EIo i innymi miejscami "konfiguracja" została uznana za przestarzałą: 'niezdefiniowana lokalna zmienna lub metoda 'konfiguracji' dla # (NameError) '. Teraz możesz po prostu użyć nazw zmiennych. Jak to działało zaledwie kilka miesięcy temu? – jordanpg

0

Wyjazd capistrano-ash dla biblioteki, która pomaga z nie-szyn wdrożenia. Używam go do wdrożenia aplikacji PyroCMS i działa świetnie.

Oto urywek z mojego Capfile dla tego projektu:

# deploy from git repo 
set :repository, "[email protected]:mygitrepo.git" 
# tells cap to use git 
set :scm, :git 

Nie jestem pewien, czy rozumiem ostatnie dwie części pytania. Podaj więcej szczegółów i chętnie pomogę.

EDIT po przykład podano:

set :repository, "#{scm_user}@gitsrv.domain:app" 

Następnie każda osoba z priveledges zapłonnika można dodać następujące lokalnej ~/.caprc pliku:

set :scm_user, 'someuser' 
+0

OK, przykład podano. Zauważ, że nie mogę ustawić repozytorium na stałą wartość, tak jak to robisz we fragmencie. –

+0

Domowe '.caprc' są miłe, ale nie mogą być obowiązkowe. Chcę przekazać parametry w wierszu poleceń. –

9

Proponuję użyć zmiennych ENV.

Coś tak (polecenia):

$ GIT_REPO="[email protected]:app" GIT_BRANCH="r2s1" cap testing 

Cap config:

#deploy.rb: 
task :testing, :roles => :app do 
    puts ENV['GIT_REPO'] 
    puts ENV['GIT_BRANCH'] 
end 

i spojrzeć na https://github.com/capistrano/capistrano/wiki/2.x-Multistage-Extension mogą być takie podejście będzie przydatna dla Ciebie.

+1

Zauważyłem, że używanie zmiennych środowiskowych jest" w "z rzeczami Ruby, ale myślę, że są bardzo niewygodne. Na przykład, potrzebowałbym trzech oddzielnych poleceń w systemie Windows z sugestią, którą przedstawisz, z których każda podlega drobnym błędom literowym i kiepskim sprzężeniem zwrotnym, jeśli popełnisz literówkę. –

+0

Zgadzam się z ostatnim komentarzem, wolę wiersz polecenia z -s lub -S var = value, a następnie coś takiego jak 'if variables.include? (: Var) ... else ... koniec' – Federico

3

Jak już pokazał Jamie, możesz przekazywać parametry do zadań z flagą -s. Chcę Ci pokazać, w jaki sposób możesz dodatkowo użyć wartości domyślnej.

Jeśli chcesz pracować z wartościami domyślnymi, trzeba użyć fetch zamiast ||= lub sprawdzanie nil:

namespace :logs do 
    task :tail do 
    file = fetch(:file, 'production') # sets 'production' as default value 
    puts "I would use #{file}.log now" 
    end 
end 

Można też uruchomić to zadanie (używa wartości domyślnej production dla file)

$ cap logs:tail 

lub (używa wartości cron do file

$ cap logs:tail -s file=cron 
6

Aktualizacja. Jeśli chodzi o przekazywanie parametrów tylko do zadania Capistrano 3.

Wiem, że to pytanie jest dość stare, ale wciąż wyskakuje na pierwszym miejscu w Google podczas wyszukiwania parametrów przekazywania do zadania Capistrano. Niestety, niepowtarzalny odpowiedź udzielana przez Jamie Sutherland jest nieważne z Kapistrana 3. Przed trać czasu próbuje ją poza wynikami być jak poniżej:

cap test:parameter -s branch=master 

wyjść:

cap aborted! 
OptionParser::AmbiguousOption: ambiguous option: -s 
OptionParser::InvalidOption: invalid option: s 

i

cap test:parameter -S branch=master 

wyjścia:

invalid option: -S 

Poprawne odpowiedzi na Kapistrana 3 świadczone przez @senz i Brad Dwyer można znaleźć klikając w ten link Złoto: Capistrano 3 pulling command line arguments

Dla kompletności zobacz poniższy kod, aby dowiedzieć się o dwóch opcji masz.

1-te opcja:

Można iteracyjne zadania z klucza i wartości, jak to zrobić z regularnych skrótów:

desc "This task accepts optional parameters" 

task :task_with_params, :first_param, :second_param do |task_name, parameter| 
    run_locally do 
    puts "Task name: #{task_name}" 
    puts "First parameter: #{parameter[:first_param]}" 
    puts "Second parameter: #{parameter[:second_param]}" 
    end 
end 

Upewnij się, nie ma przestrzeni między parametrami gdy dzwonisz cap:

cap production task_with_params[one,two] 

2-ty opcja:

Podczas nazywamy każde zadanie można przypisać zmienne środowiskowe i następnie połączyć je z kodem:

set :first_param, ENV['first_env'] || 'first default' 
set :second_param, ENV['second_env'] || 'second default' 

desc "This task accepts optional parameters" 
task :task_with_env_params do 
    run_locally do 
    puts "First parameter: #{fetch(:first_param)}" 
    puts "Second parameter: #{fetch(:second_param)}" 
    end 
end 

Aby przypisać zmienne środowiskowe, korek połączenia jak poniżej:

cap production task_with_env_params first_env=one second_env=two 

nadzieję, że uratuje masz trochę czasu.

Powiązane problemy