A par8o acelera builds de CI em Rails em 8x com os Semaphore Boosters

  • ⛔️️ Os testes estavam levando 2 horas ou mais
  • ⛔️ Configurar testes paralelos manualmente era tedioso e demorado
  • ✅ CI 8x mais rápido com os Semaphore Boosters
  • ✅ CI paralelo totalmente automatizado

Experimente o Semaphore

O desafio

Em determinado momento, executar os testes em laptops de desenvolvimento começou a levar 2 horas ou mais para os desenvolvedores da par8o. À medida que mais testes eram adicionados, o tempo aumentava ainda mais. A par8o começou a usar o recurso de jobs paralelos do Semaphore para distribuir os testes entre múltiplos builders. O objetivo era ter feedback dos testes para uma branch em menos de uma hora. Usando jobs paralelos, conseguiram rodar todos os testes em cerca de 50 minutos.

Embora tivessem alcançado a meta, a equipe queria um feedback de teste ainda mais rápido para evitar a alternância de contexto de volta a uma branch se o build falhasse 50 minutos depois. A equipe estava esperançosa de que, ao longo do tempo, ao paralelizar os testes manualmente, conseguissem reduzir o tempo de build para cerca de 25 minutos.

Em determinado momento, conseguiram fazer todos os testes rodarem em cerca de 30 minutos. No entanto, organizar manualmente os testes em pastas era tedioso, pois nomear as pastas de uma maneira que fizesse sentido para outros desenvolvedores era difícil. Eles precisavam mesclar a branch contendo a nova organização de pastas em todas as outras branches em desenvolvimento. Finalmente, adicionavam um novo job no Semaphore para executar os testes nas novas pastas. Havia também o risco de adicionar uma nova pasta de testes sem adicionar o job correspondente, resultando em um build que não executava todos os testes. Se uma nova pasta fosse adicionada para tentar evitar isso, acabavam com um teste falhando com erro.

Portanto, mesmo que o tempo de teste tenha sido drasticamente reduzido, configurar manualmente os testes paralelos era tedioso e demorado. Entram os Semaphore Boosters.

A solução

Enquanto a equipe da par8o usava o Semaphore, ela interagiu com o suporte para solicitar novos recursos ou atualizações de pacotes usados pelos builders. Em determinado momento, o suporte do Semaphore ofereceu uma solução para reduzir o tempo de build, que estava em média de 50 minutos.

A solução foi o Semaphore Boosters — uma gem Ruby que registra os tempos de teste para um determinado arquivo e, usando essas informações, divide os testes em múltiplos comandos com base em quantos jobs você deseja executar. O objetivo é que cada job leve aproximadamente o mesmo tempo para ser concluído. O Semaphore atualmente oferece suporte a Boosters para testes RSpec e Cucumber.

A estratégia de paralelização manual funcionava, mas era frágil e exigia reorganização periódica dos arquivos de teste, à medida que um job começava a levar muito tempo para ser concluído. Os testes mais lentos da par8o eram os testes de navegador do RSpec, e como os Boosters estão disponíveis para RSpec, decidiram experimentá-los.

Os resultados

Após adicionar os Boosters, o tempo de build da par8o para toda a suíte de testes média caiu para cerca de 13 minutos. Os Boosters permitem que os desenvolvedores da par8o obtenham resultados mais rapidamente e economizem o tempo que antes era gasto movendo arquivos para distribuir testes entre os builders.

Receber feedback mais rápido dos testes diminuiu a necessidade de os desenvolvedores mudarem de tarefa enquanto aguardam os resultados. Se o build falhar, eles podem fazer as correções necessárias mais rapidamente, enquanto as mudanças ainda estão frescas em sua mente. Isso economiza tempo e energia mental, permitindo que os desenvolvedores se concentrem em concluir a tarefa inicial.

Com muito pouco esforço, a equipe da par8o conseguiu paralelizar os testes de navegador do RSpec, reduzindo o tempo de execução de mais de 2 horas para 13 minutos. Se você está usando RSpec ou Cucumber para seus testes, experimente os Boosters.

Setor

Saúde

Equipe de engenharia

10 pessoas

Stack Tecnológico

Ruby on Rails

Angular

MiniTest

RSpec

Star us on GitHub