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

E583bca48acb877efd4a29229bf7927f?s=128

Aurelio Jargas

August 08, 2015
Tweet

Transcript

  1. 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.
  2. 3.

    Por que atualizar? Documentação inexistente Plugins deprecated Reinventar a roda

    Difícil implementar novas funcionalidades Performance
  3. 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 :-(
  4. 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
  5. 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
  6. 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
  7. 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.
  8. 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
  9. 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
  10. 13.

    Milestones Instalar o ambiente Carregar o Rails server Carregar uma

    tela do sistema Completar uma edição de dados
  11. 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
  12. 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
  13. 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
  14. 19.

    Arrependimentos Debian 6 → 7 Migração de SO é outro

    pesadelo, não misture. &atilde; → ã Não me aguentei e mudei em todas as views. Depois sofri no final para fazer o merge. Guilty Dog
  15. 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 ;-)