Cześć, czy korzystacie z repozytoriów SVN lokalnych, czy zdalnych?
Jeżeli lokalnie, to w jaki sposób deployujecie kod RoR na serwer produkcyjny? Pytam z ciekawości, bo nie mam z tym doświadczenia, a niedługo trzeba będzie zacząć…
Cześć, czy korzystacie z repozytoriów SVN lokalnych, czy zdalnych?
Jeżeli lokalnie, to w jaki sposób deployujecie kod RoR na serwer produkcyjny? Pytam z ciekawości, bo nie mam z tym doświadczenia, a niedługo trzeba będzie zacząć…
O, ktoś jeszcze korzysta z SVN?
A co do pytania: postaw zdalne repozytorium, nie warto się gimnastykować (efekt będzie wątpliwy, a zdalne repo się kiedyś przyda).
I potem zwyczajnie checkout i updaty na serwerze produkcyjnym… A nie używasz do tego rake’a, np. dodatkowo do kompresji plików css, obfuskacji kodu javascript?
Najlepiej użyć Capistrano (http://www.capify.org/) gdzie zdefiniujesz sobie jakie chcesz wykonać czynności przy deploymencie.
Dzięki, poczytam, chociaż na pierwszy rzut oka wygląda tak samo jak rake, który przychodzi razem z RoR.
Za dwa tygodnie przeczytasz tego posta i złapiesz się za głowę
Ok, trochę pracy i póki co rake i mam w defaultowych svn.rake:
REPO_PATH = "https://foo.bar/svn/"
namespace :svn do
desc "Create new tag from trunk"
task :tag, :comment, :major, :minor do |t, args|
latest_tag = IO.popen("svn ls #{REPO_PATH}tags").readlines.last.chomp("/\n").split('_')
major = args.major
if major.nil?
major = latest_tag[0].delete 'v'
printf "Assuming same major version: #{major}\n"
end
minor = args.minor
if minor.nil?
minor = latest_tag[1]
printf "Assuming same minor version: #{minor}\n"
end
date_part = "#{Time.now.strftime("%Y").last}#{Time.now.strftime("%m%d")}"
build = latest_tag.last.to_i + 1
printf "Build number: #{build}\n"
new_tag = "v#{major}_#{minor}_#{date_part}_#{build}"
svn_cmd = "svn copy #{REPO_PATH}trunk #{REPO_PATH}tags/#{new_tag} -m \"Creating tag: #{new_tag} #{args.comment}\""
printf "Executing: #{svn_cmd}\n"
system(svn_cmd)
end
desc "Deploy application from latest tag"
task :deploy do
list = IO.popen("svn ls #{REPO_PATH}tags")
latest_tag = list.readlines.last.chomp
printf "Exporting tag: #{latest_tag}\n"
system("svn export #{REPO_PATH}tags/#{latest_tag}")
end
Zakładam konwencję nazewnictwa tagów taką jak Microsoft vMAJOR_MINOR_DATE_BUILDNUMBER
Pierwszy task służy do skopiowania trunka do nowego taga o automatycznie wygenerowanej nazwie/numerze.
Drugi task służy do exportu najnowszego tagu do aktualnego katalogu…
Domyślam się, że można to zrobić lepiej… dużo lepiej… Podpowiedzcie proszę co można tutaj zoptymalizować! Gdzie w konfiguracji aplikacji przechowywać zmienną REPO_PATH?
Przykładowe poprawne nazwy tagów to:
/tags/v0_9_90611_5
/tags/v0_9_90612_7
/tags/v1_0_90618_9
Tak: użyć Capistrano
Ja tu widzę 2 różne rzeczy. Koleżanka napisała task do wydawania nowego releasa i zastosowanie do tego rake jest prawidłowe, z kolei capistrano umożliwiłoby jej faktyczne odpalenie nowej wersji aplikacji na serwerze.
Mam jeszcze jedno pytanie w tym temacie.
Mam klasę, w której udało mi się napisać metodę pobierająca na jakichś tam zasadach nazwę najnowszego taga z repozytorium.
Metoda Svn::get_latest_tag_name() gdzie parametrem wejściowym jest adres repozytorium SVN. Gdzie umieścić tą klasę, że wszystkie taski, ze wszystkich projektów mogły ją includować?
Gdzie powino się umieszczać własne klasy:
RAILS_ROOT/lib
lub zrobić plugin (najlepsze rozwiązanie)
Zrobić gema
RAILS_ROOT/lib
lub zrobić plugin (najlepsze rozwiązanie)[/quote]
Dlaczego plugina? Plugin to z kolei coś co nie jest unikalne dla jednej aplikacji, ale jest unikalne dla railsów i je w jakiś sposób rozszerza.
Radarek +1
Poza tym, pluginy są passe. Teraz się gemy robi.
Ok, poczytam o robieniu Gemów… I pytanie w związku z tematem.
Co powinno być zrobione po dodaniu Gema w środowisku deweloperskim, żeby działało po skomitowaniu środowisko produkcyjne i środowiska deweloperskie innych programistów?
Gdzie i jak rozpowszechnić info, że do projektu został zainstalowany nowy gem? Gdzie i jak poinformować innych jaki to gem?
Zajrzyj do config/environment.rb . Znajdziesz tam zakomentowane wpisy config.gem “nazwa_gema”
Poczytaj też o taskach:
rake -T gems