W końcu wziąłem się za dokończenie migracji widokówek na nowszą wersję railsów, tym razem podbiłem je do wersji 3.1.0. Udało mi się nawet ją skończyć i wdrożyć całość na serwerach Megiteam. Post ten opisywał będzie moje zmagania z automatyzacją instalacji aplikacji w następującej konfiguracji:

  • Ruby on Rails 3.1.0
  • Ruby 1.9.0 p290

RVM

Zacząłem od konfiguracji RVM na serwerach Megiteam. Procedura ta jest bardzo dobrze opisana w jednym z wpisów na ich blogu. Postępując zgodnie z wytycznymi udało mi się postawić środowisko razem z wszystkimi wymaganymi gemami. W moim przypadku instalację rvm uzupełniłem o alias dla ruby-1.9.2-p290 dzięki czemu mogę używać tego samego pliku .rvmrc zarówno na środowisku deweloperskim jak i produkcyjnym.

rvm use r192@postcard

Capistrano

W mojej konfiguracji zdecydowałem się na hostowanie kodu na githubie i instalowanie go na środowisko produkcyjne z tego właśnie repozytorium. Niesie to za sobą pewne konsekwencje, związane głównie z bezpieczeństwem. Nie chcę żeby w publicznie dostępnych danych znajdowała się konfiguracja produkcyjnej bazy danych czy informacja o nazwie konta na Megiteam.

Problem związny z nazwą konta na Megiteam w bardzo łatwy sposób można rozwiązać przy pomocy zmiennych charakterystycznych dla Capistrano:

set :user do
    Capistrano::CLI.ui.ask "Give me Megiteam username: "
end

role :app, "#{user}.megiteam.pl"
role :web, "#{user}.megiteam.pl"
role :db,  "sql.#{user}.megiteam.pl", primary: true

Po umieszczeniu takiego fragmentu kodu w pliku config/deploy.rb, capistrano przy wywołaniu polecenia cap pyta się o wartość zmiennej user.

Problem związany z konfiguracją bazy danych rozwiązałem dzięki dodatkowemu zadaniu, które uruchamiane jest automatycznie po deploy:update. Kod znajdujący się poniżej odpowiedzialny jest za kopiowanie pliku z konfiguracją bazy danych znajdującego się na serwerze produkcyjnym do katalogu aplikacji. Dodatkowo w tym kroku kopiowany jest także plik .environment charakterystyczny dla konfiguracji Megiteam zapewniający poprawne działanie rvm na środowisku produkcyjnym.

namespace :deploy do

    desc 'overriden restart specific for megiteam'
    task :restart do
        run 'restart-app widokowki_ror3'
    end

    desc 'copying essential files for production env'
    task :update_configuration, except: {no_relase: true} do
        run <<-CMD
            cp -vf #{db_config_location} #{release_path}/config/ &&
            cp -vf #{environment_settings_location} #{release_path}/
        CMD
    end

    after 'deploy:update', 'deploy:update_configuration'

end

Powyższy fragment kodu zawiera także zadanie odpowiedzialne za restartowanie naszej aplikacji.

Problemy

Podczas wykonywania zdalnych migracji pojawił sie problem z parsowaniem plików JSON, co skutecznie uniemożliwiało wykonanie migracji na serwerze produkcyjnym. Rozwiązanie tego problemu sprowadziło się do zasugerowania innego silnika do parsowania plików JSON, uzupełnienie boot.rb o takie linijki powinno pomóc:

require 'yaml'
YAML::ENGINE.yamler= 'syck'

Rozwiązanie tego problemu udało mi się znaleźć na stackoverflow.