Hei me otetaan käyttöön.

Lokakuu 11, 2009

Käyttöönottoon tuntuu aina liittyvän kaksi asiaa, mahdollisimman hiljainen ajankohta ja odottamattomat yllätykset. Mahdollisimman hiljainen ajankohta tarkoittaa yleensä Suomessa sunnuntai iltaa, etenkin viimeinen riipaisulle eli dns:ien päivitykselle hyvä hetkin tuntuu olevan sunnuntaina kello 19:00 jälkeen. Silloin tapahtuu harvoin mitään tuottavaa. Odottamattomat yllätykset taas voivat olla positiivisia tai negatiivisia. Negatiiviset liittyvät yleensä siihen että jokin ei toimikkaan odotetulla tavalla ja koska on viikonloppu niin ketään ei saa kiinni, eikä näin ollen asiaan eteenpäin tai korjattua. Yleensä tätä negatiivista kokemusta seuraa positiivinen kun plaan B toimii mukavasti. Niin se taisi mennä tälläkin kertaa. Tuntemukset oton jälkeen ovat odottavat, sitä jää jotenkin aina henkisesti odottamaaan ensimmäistä “tässä on virhe” ilmoitus. Niin nyt kannattaa vierailla http://www.tkrekry.fi ja löytää se ensimmäinen “tässä on virhe” ilmoituksen aihe.

Viikonlopun kokemukset

  • Heroku – näytti jälleen hampaansa
  • Ruby gems + shared hosting – aiheuttaa aina odottamattomia ongelmia
  • Iso kiitos P.Rannikolle

Huom! Esimerkki toimii vain *nix alustoilla koska Capistrano ei tue virallisesti muita.

Capistranon asennus:
Riippuen *nix:stä ja Ruby:n asennuksesta riippuen tarvitset sudo/su oikeuksia.

[sudo] gem install capistrano

Rails projektin alustus:
Capistrano luo config/deploy.rb tiedoston.

cd /rails/projektin/juuri/
capify .
[add] writing `./Capfile'
[add] writing `./config/deploy.rb'
[done] capified!

./config/deploy.rb


# Minimaalinen esimerkki
# Sovelluksen nimi
set :application, "sample-app"
# Osoite jossa lähdekoodi majailee
set :repository,  "git@github.com:sample-app.git"
# Versionhallinta sovellus - tässä esimerkikssä git
set :scm, :git
# Palvelimen asennuskansio
set :deploy_to, "/home/example/public_html/#{application}"

# Asetetaan oletus moodi
set(:env, 'staging') unless exists?(:env)

if env == 'production'
  # Otetaan oikea branch
  set :branch,      "production"
  # Virallinen tuotantoympäristö
  puts "********* DEPLOYING TO PRODUTION *********"
  # Web-palvelin
  role  :web,         "domain.fi"
  # Sovelluspalvelin
  role  :app,         "domain.fi"
  # Tietokantapalvelin
  role  :db,          "domain.fi", :primary => true
  # Juuri kansio
  set   :base_folder, "/var/www/production/www"
  set   :user,        "production_user"
  # Kansio johon asennus tehdään
  set   :deploy_to,   "#{base_folder}/#{application}"
  set   :use_sudo,    false
  set   :spinner,     false
  set   :reaper,      false

  # Tehdää asennus kopioimalla ensin omalle koneelle ja siitä siirretään palvelimelle
  # näin vältytään usein ssh avaimien haalimisesta git:ä käytettäessä
  # voisi käyttää myös ssh_forward:ia, mutta näin aloittavalle helpompi
  set   :deploy_via,  :copy
  set   :compression, :zip
  set   :rails_env,   "production"

  elsif env == 'staging'
  # Otetaan oikea branch
  set :branch,      "staging"
  puts "********* DEPLOYING TO STAGING *********"
  # Web-palvelin
  role  :web,         "staging.domain.fi"
  # Sovelluspalvelin
  role  :app,         "staging.domain.fi"
  # Tietokantapalvelin
  role  :db,          "staging.domain.fi", :primary => true
  # Juuri kansio
  set   :base_folder, "/home/developer/www"
  set   :user,        "developer"
  # Kansio johon asennus tehdään
  set   :deploy_to,   "#{base_folder}/#{application}"
  set   :use_sudo,    false
  set   :spinner,     false
  set   :reaper,      false

  # Tehdää asennus kopioimalla ensin omalle koneelle ja siitä siirretään palvelimelle
  # näin vältytään usein ssh avaimien haalimisesta git:ä käytettäessä
  # voisi käyttää myös ssh_forward:ia, mutta näin aloittavalle helpompi
  set   :deploy_via,  :copy
  set   :compression, :zip
  set   :rails_env,   "production"
  end

Staging eli esittelyn vaiheen käyttöönotto:


# Valmistellaan ympäristö eli luodaan tarvittavia kansioita yms.
cap deploy:setup -S env=staging

# Tehdään ensimmäinen käyttöönotto
cap deploy:cold -S env=staging

# Ajetaan migraatiot
cap deploy:migrate -S env=staging


# Uuden releasen vieminen
cap deploy -S env=staging

# Lisää komentoja saat esille
cap -T

Lisää reseptejä löytyy  http://github.com/jaakkos/my-deploy-stuff/tree/master

Yksi web-sovelluksen kehityksen haastavimmista osista on käyttöönotto. Kaikille on varmaan tuttua tilanne jossa deadline tulee vastaan ja käyttöönotossa ilmeneekin omituisia ongelmia, jotka aiheuttavat vähintään ylipitkiä työpäiviä tai jopa viivästyttävät koko projektia.

Käyttöönotto harjoittelu pitäisi aloittaa samalla hetkellä kun ensimmäinen iteraatio on pyörähtänyt. Projektin aluksi tärkeätä varata mahdollisimman samankaltainen ympäristö jollainen tuleva tuotanto tulee olemaan ja tehdä käyttöönotosta samanlainen käytäntö kuin testien ajamisestakin. Testituotantoympäristö on helppo rakentaa esimerkiksi virtuaalikoneeseen http://www.virtualbox.org/tai käyttää http://aws.amazon.com/ec2/ Kumpaankin on hyvä tehdä valmiita pohjia erilaisista kohde kokoon panoista joita voi sitten uudelleen käyttää.

Muutama esimerkki työkaluista (päivätöissä käytän capistranoa)

Perustehtäviä joita käyttöönottotyökalulla voi hoitaa:
  1. Valmistella ympäristö ennen ensimmäistä releasia aka cold deploy
  2. Hakea ja kääntää jos tarpeellista lähdekoodi versionhallinnasta
  3. Ajaa testit ennen kuin uusi release tehdään
  4. Ajaa tarvittavat tietokanta migraatiot
  5. Luoda tarvittavat tai linkittää tarpeelliset kansiot ja huolehtia oikeuksista sekä muista pienistä asioista.
  6. Mahdollistaa helpon siirtymisen eri release versioiden välillä, mikäli ilmenee ongelmia
  7. Käynnistää tai sammuttaa prosesseja
  8. Hoitaa liutaa muita “pieniä” tehtäviä, kuten konfiguraatio muutoksia yms.
Millaisia kokemuksia sinulla on näistä työkaluista?
ps. Esittelen seuraavassa merkinnässä käytännön esimerkin kautta Ruby On Rails projektin käyttöönottoa Capistranon avulla http://jaakko.suutarla.com/2009/08/ruby-on-rails-…n-kayttoonott/.