[OT] Deployment aplikacji RoR

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? :smiley:

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ę :wink:

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

@Tomash: zawsze to okazja do poznania rake :slight_smile:

@zmaliszewska: The Absolute Moron’s Guide to Capistrano

Tak: użyć Capistrano :smiley:

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:

  • unikalne dla projektu (aplikacji)
  • globalne - dla wszystkich projektów

RAILS_ROOT/lib
lub zrobić plugin (najlepsze rozwiązanie)

Zrobić gema :slight_smile:

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