Upgrade to Pro — share decks privately, control downloads, hide ads and more …

A Hora do Pesadelo: Migração Rails 1 → 4

A Hora do Pesadelo: Migração Rails 1 → 4

Relato de uma migração maluca que fiz, de Rails 1.2.6 para 4.2.0 em um sistema legado monstro.

Estatísticas: 150 models, 1 humano (eu!), 6h/dia, 5 meses, 300 commits.

Palestra apresentada em 2015-08-08 no 1º Tech Day do GURU-PR, realizado na empresa Ebanx, em Curitiba: http://www.gurupr.org/eventos/1-tech-day-do-guru-pr

Aurelio Jargas

August 08, 2015
Tweet

More Decks by Aurelio Jargas

Other Decks in Programming

Transcript

  1. A Hora do Pesadelo: Migração Rails 1 -> 4
    http://aurelio.net

    View Slide

  2. Antes Depois
    Rails 1.2.6 2007
    Ruby 1.8.7 2008
    Debian 6 2011
    Rails 4.2.0 2014
    Ruby 2.1.5 2014
    Debian 7 2013
    150 models, 1 humano, 6h/dia, 5 meses, 300 commits.

    View Slide

  3. Por que atualizar?
    Documentação inexistente
    Plugins deprecated
    Reinventar a roda
    Difícil implementar novas funcionalidades
    Performance

    View Slide

  4. Algumas peculiaridades do sistema
    Duas databases PostgreSQL (cadastral e geo)
    Mapas (Mapserver, Ortofotos ECW)
    Webservices SOAP (cliente e servidor)
    Geração de PDF, CSV
    Fotos no banco de dados
    Banco de dados com PK composta :-(

    View Slide

  5. Rails, “pero no mucho”
    Não usa rotas (somente a catch-all)
    Não usa migration
    Quase-MVC
    Às vezes usa queries SQL manuais
    Às vezes segue a nomenclatura padrão
    Zero testes

    View Slide

  6. A dúvida cruel
    1→4
    ou
    1→2→3→4

    View Slide

  7. https://twitter.com/aribeiro/status/601757792492507136

    View Slide

  8. Tática de upgrade
    Versão do Rails? 4.2.0
    Versão do Ruby? 2.2 2.1.5
    Como reorganizar arquivos e pastas? merge
    Como documentar mudanças? issues, commit
    Como fazer o merge no final? cherry-pick

    View Slide

  9. Tática de aprendizado
    1. Estudar Rails 4
    2. Estudar mudanças entre versões do Rails
    3. Protótipo funcional
    4. Mergulhar no código

    View Slide

  10. Boas práticas
    Documentar muito bem cada problema.
    Cada commit só tem um tipo de alteração.
    Fazer alterações em batch.
    Manter os mesmos plugins, quando possível.
    Manter bugs conhecidos e código mal-feito.

    View Slide

  11. Mantra
    Não altere o funcionamento do sistema
    Não altere o funcionamento do sistema
    Não altere o funcionamento do sistema
    Não altere o funcionamento do sistema
    Não altere o funcionamento do sistema
    Não altere o funcionamento do sistema

    View Slide

  12. Mantra II
    Não “arrume” o código
    Não “arrume” o código
    Não “arrume” o código
    Não “arrume” o código
    Não “arrume” o código
    Não “arrume” o código

    View Slide

  13. Milestones
    Instalar o ambiente
    Carregar o Rails server
    Carregar uma tela do sistema
    Completar uma edição de dados

    View Slide

  14. Mudanças, mudanças, mudanças...
    Model.find(:all, :conditions) → Model.where(…)
    Model.find(:first) → Model.first
    Model.find_all_by_foo(x) → Model.where(foo: x)
    Rails.root: string → Pathname
    <%= csrf_meta_tags %>
    Iconv → "".encode()
    irb → pry
    concat(foo, binding) → concat(foo)
    @attributes['foo'] → read_attribute(:foo)
    ActiveSupport::TimeWithZone
    form_tag()…end_form_tag→ form_tag() do…end
    *.rhtml → *.html.erb
    *.rxml → *.xml.builder
    "".html_safe
    vendor/plugins → Gemfile
    config/initializers/*
    rotas, nova sintaxe
    RAILS_ROOT → Rails.root
    RAILS_ENV → Rails.env
    set_primary_key → self.primary_key
    Config → RbConfig
    application.rb → application_controller.rb

    View Slide

  15. Prototype → jQuery
    ActionMailer::Base, nova sintaxe
    @params → params
    visual_effect(:foo, ...) → new Effect.Foo(...)
    PrototypeHelper
    ScriptaculousHelper
    JavaScriptHelper
    ftools → fileutils
    File.copy() → FileUtils.copy()
    script/server → rails s
    ...
    Mais mudanças...
    @content_for_layout → yield
    Form via GET, vazios: nil → ""
    form_remote_tag()→ form_tag(remote: true) + jQuery
    regex: ^…$ → \A…\Z
    FastCGI
    Strong Parameters
    Asset Pipeline
    save_without_validation → save(:validate => false)
    <%= form_tag
    rescue_action
    Webservices: SOAP → REST

    View Slide

  16. Mergulhando mais fundo
    Bug no Rails 4.2.0 com PostgreSQL PR #17680
    Recompilar Ruby 2.1.5 com --enable-shared
    Compilar Mapserver e Mapscript

    View Slide

  17. Pedras no caminho
    .html_safe
    Queries do ActiveRecord
    Segurança (strong params, XXS, CSRF)
    Webservices SOAP (savon, wash_out)

    View Slide

  18. --help
    guides.rubyonrails.org
    railsdiff.org
    apidock.com
    stackoverflow.com
    Blogs da comunidade Rails

    View Slide

  19. Arrependimentos
    Debian 6 → 7
    Migração de SO é outro pesadelo, não misture.
    ã → ã
    Não me aguentei e mudei em todas as views.
    Depois sofri no final para fazer o merge.
    Guilty Dog

    View Slide

  20. Conclusão
    Dá muito trabalho.
    Há documentação abundante.
    Vá com calma, seja metódico, documente.
    Cá entre nós, fuja se possível ;-)

    View Slide

  21. Bons sonhos...

    View Slide