Estamos a meio de Dezembro, o que significa que uma nova versão do Ruby será lançada em apenas alguns dias. Mesmo que não pretenda actualizar as suas aplicações Rails para a versão mais recente no primeiro dia, nunca é má altura para começar a planear a sua próxima actualização.
Porquê actualizar Ruby?
Cada ano, a equipa central do Ruby introduz novas funcionalidades para fazer avançar a linguagem. Por vezes, estas são novas construções de programação para tornar a sua vida como programador mais fácil. Outras vezes, estas alterações resultam em ganhos de desempenho e fiabilidade geral. Não é óptimo quando um pequeno trabalho de actualização pode tornar a sua aplicação Rails mais rápida, ou quando uma nova funcionalidade da linguagem simplifica uma abordagem anteriormente complexa a uma ou duas linhas simples de código?
Lançamento de Ruby ao longo do ano também fornece importantes actualizações de segurança para a linguagem, que se infiltram nas suas aplicações e nas pessoas que as utilizam. Assegurar que todas as camadas da sua aplicação são seguras é tão importante como evitar a injecção de SQL e as vulnerabilidades de scripts cruzados no local. Acompanhar as versões Ruby suportadas é fundamental.
E por vezes, a sua mão é forçada por uma dependência, ou uma dependência dessa dependência. Talvez tenha estado lá – quer integrar uma biblioteca de terceiros na sua aplicação, mas não pode, porque requer um Ruby mais recente do que o que está actualmente em execução. Despende o seu tempo a forking e back-porting da biblioteca para suportar a sua base de códigos mais antiga, ou actualiza a sua base de códigos para aproveitar o actual ecossistema Ruby?
Quando actualizar Ruby
Novas versões principais (por exemplo, 2.2, 2.3, e 2.4) são tradicionalmente lançadas a 25 de Dezembro de cada ano. Olhando para as últimas versões principais de Ruby, pode-se esperar apoio de segurança para um dado Ruby durante cerca de três anos após o seu lançamento inicial. Se puder, faça a actualização do seu Ruby antes que essa janela de suporte expire.
Even em projectos conservadores, estou confortável a actualizar para uma dada versão do Ruby cerca de um ano após o seu lançamento inicial. Isso dá tempo para correcções de bugs a essa versão, bem como para os autores de gemas fazerem quaisquer actualizações necessárias para suportar um Ruby mais recente.
Quando não actualizar o Ruby
Uma palavra de conselho: Não actualize as versões Ruby ao mesmo tempo que uma actualização da versão Rails! Mesmo que a versão do Rails que está a actualizar requeira uma certa versão Ruby, actualize e liberte a sua versão Ruby primeiro – depois faça a actualização do Rails. Está apto a tornar a sua actualização global muito mais difícil se tentar fazer tudo ao mesmo tempo, versus em passos.
Tive sorte a actualizar várias versões ao mesmo tempo – por exemplo, de Ruby 2.1 para Ruby 2.4, mas outras tentativas para o fazer causaram-me problemas, como passar de Ruby 1.8 para Ruby 2.0. Em caso de dúvida, dividir a actualização em pedaços mais pequenos. Quase sempre encontro actualizações incrementais para ir mais facilmente do que as abordagens por atacado.
Ponta-te pronto
Antes de fazer qualquer actualização, é uma boa ideia ler sobre o que há de novo – características, correcções, depreciações, e coisas que simplesmente já não funcionam de todo. As versões prévias do Rubies começam a sair com meses de antecedência, e muitos blogueiros dedicam tempo a explorar o que há de novo – por isso procure o que há de novo no Ruby x.y para ter uma noção do que os seus colegas Rubyistas estão a encontrar. O feed de notícias no site oficial Ruby também publica anúncios de cada lançamento, juntamente com o que há de novo neles.
E, como qualquer actualização, vai querer um conjunto de testes o mais completo possível para a sua aplicação – mesmo que o seu próprio código de aplicação não exija muitas alterações para estar em conformidade com o novo Ruby, as suas dependências podem ter passado por alterações mais profundas. Ou talvez tenham problemas com a nova versão Ruby. Demore um pouco de tempo a rever a sua situação de teste. Use o SimpleCov para ajudar a identificar áreas que são leves na cobertura. Tente preencher as lacunas, ou pelo menos testar manualmente essas áreas um pouco mais do que o habitual. (E se precisar de ajuda para começar a testar, conheço um livro bastante bom sobre o assunto, wink wink.)
Como actualizar Ruby
Para começar, instale o Ruby alvo na sua configuração de desenvolvimento, usando o seu gestor de versão Ruby de escolha (ou através de uma imagem Docker, se for essa a sua coisa). Ver instruções para RVM, rbenv, e chruby para detalhes.
Agora é uma boa altura para especificar também a nova versão Ruby no seu .ruby-version
ficheiro, e/ou no seu Gemfile
(preferido por Heroku). Seja como for, é provável que esteja a substituir um valor antigo por um novo. Verifique a alteração recarregando o directório:
Next, instale o Rails e as outras dependências da sua aplicação no novo ambiente Ruby:
É aqui que as coisas podem ficar complicadas, especialmente se estiver a incluir qualquer versão gem que não suporte o novo Ruby. Abordei esta duas formas diferentes em projectos de actualização. Em alguns casos, actualizei gemas individuais até que todas as dependências possam ser instaladas. Com as novas versões do Bundler, o modo de actualização conservador, que impede que as dependências partilhadas também sejam actualizadas, funcionou bem para mim.
Nalguns casos, pode acabar por precisar de usar o modo conservador, depois actualizando gemas individuais para abordar outras alterações. Por exemplo, quando actualizei uma aplicação para Ruby 2.4 no início deste ano, tive de actualizar separadamente a gema do formulário_simples para tratar de uma depreciação.
Com tudo instalado, está pronto para executar o seu conjunto de teste! Primeiro, certifique-se de que arranca, depois preste atenção a falhas e avisos de depreciação. Se ler no novo Ruby para o qual está a actualizar, então as falhas e avisos devem parecer familiares, e esperemos que tenha um caminho claro para os abordar. Não ignore os avisos de desvalorização! Os avisos de hoje são os fracassos de amanhã. Tome o tempo necessário para limpar agora, enquanto está na espessura de uma actualização Ruby.
Com um conjunto de testes de aprovação, livre de avisos de depreciação, gosto de executar a aplicação localmente, e ligar a consola Rails, e verificar se existem outros avisos de depreciação no registo de desenvolvimento. Isto é especialmente importante se o SimpleCov encontrou lacunas na sua cobertura de teste. Se notar novos avisos (ou falhas) que não foram revelados nos seus testes existentes, faça o seu melhor para adicionar cobertura agora.
Congratulações, a sua aplicação é actualizada para um Ruby mais recente, suportado! Os seus próximos passos irão variar, dependendo de como e onde a sua aplicação for implantada no mundo. Os fornecedores de plataforma como serviço, como Heroku, e as implantações baseadas em contentores tornam isto relativamente simples. Se tiver os seus próprios servidores, provavelmente terá um pouco mais de trabalho a fazer, como instalar Ruby, Rails, e outras dependências nos servidores em questão. Isso está fora do âmbito deste artigo.
Após ser feito, no entanto, pode dormir um pouco mais facilmente, sabendo que a sua aplicação Rails está a utilizar um Ruby moderno. Obrigado por ler!