Semaphore reduz pela metade o tempo do push até o deployment para os builds pesados da Channable

  • ⛔️ Builds em Haskell de 30 minutos
  • ⛔️ Agentes de build com baixa capacidade
  • ⛔️ Perda de aceleração na paralelização
  • ⛔️ Produtividade perdida com troca de contexto
  • ⛔️ Espera por clones do Git
  • ✅ Builds em Haskell em 10 minutos ⬇️ 3x
  • ✅ Agentes de build poderosos
  • ✅ Mais compilação em paralelo
  • ✅ Menos interrupções no fluxo de trabalho
  • ✅ Cache local do Git

O desafio

O fluxo de trabalho da equipe da Channable só permite merges na branch master após o sistema de CI verificar o commit de merge. Se outro merge para a master acontecer nesse meio tempo, os resultados dos builds dos outros commits de merge são invalidados. “Longos períodos de espera no CI são frustrantes”, explica Robert Kreuzer, cofundador e CTO. “Se demora muito, você acaba indo fazer outra coisa, e quando se lembra de verificar seu build, alguém já fez um merge na master, então você precisa começar de novo.” Além disso, tempos de build longos levam a mais troca de contexto, então, para o bem da produtividade, a equipe estava ansiosa para acelerar o pipeline de CI/CD.

A Channable estava enfrentando alguns problemas específicos com sua solução de CI existente, o Travis. Primeiro, os períodos de espera para os jobs começarem eram longos, e não havia visibilidade sobre o que estava causando o atraso. Em segundo lugar, o pipeline da Channable inclui a compilação de código Haskell para binários nativos, o que é intensivo em CPU. A equipe descobriu que os builds nas máquinas do Travis eram muito mais lentos do que em suas próprias estações de trabalho.

A espera excessiva e os tempos de execução do pipeline se tornaram um foco ainda mais evidente no contexto de problemas em produção. Desde o push de um hotfix até o deployment, o processo podia facilmente levar 20 minutos, o que, como Robert destaca, “é muito tempo para um bug crítico ficar em produção.”

No geral, a Channable precisava que sua nova solução de CI/CD:

  • ✔️ Reduzir o tempo de espera para builds na fila
  • ✔️ Máquinas de build mais rápidas para compilações intensivas em CPU
  • ✔️ Cache local rápido para operações de Git que consomem muita largura de banda

A solução

A equipe da Channable avaliou uma série de soluções, incluindo AppVeyor, Azure DevOps, BitBucket Pipelines, CircleCI, Cirrus, CodeShip, Concourse, GitLab CI e SourceHut builds. A disponibilidade de máquinas de build multicore e o cache flexível e fácil de usar destacaram-se como diferenciais a favor do Semaphore.

“O maior impacto para nós foi a disponibilidade de VMs maiores com múltiplos núcleos”, diz Robert. “Especialmente a compilação em Haskell e nossa suíte de testes se beneficiaram muito do paralelismo adicional.” O Semaphore oferece três tipos de máquinas Linux. Cada job em um pipeline roda em um agente de build separado. Para a etapa de compilação em Haskell, que consome muita CPU, a Channable escolheu a variante mais poderosa, com 8 núcleos, para maximizar a velocidade.

Outras melhorias em relação à solução anterior vieram através do caching. O primeiro tipo de cache que impulsionou o desempenho foi o cache local do Git no Semaphore. Esse cache reduziu consideravelmente o tempo gasto clonando repositórios Git. O segundo tipo de cache usado no fluxo de trabalho acelerou o pipeline da Channable e reduziu o tráfego de download. O Semaphore fornece um cache para cada projeto. Esse cache está disponível em cada job do pipeline.

O fluxo de trabalho da Channable armazena dependências que mudam com pouca frequência após o primeiro build bem-sucedido de cada dia. O cache está disponível em todos os jobs nativamente, o que facilitou a configuração do build. “O cache do Semaphore foi ainda melhor do que esperávamos,” conclui Robert, “muito rápido e fácil de usar.”

Channable Pipeline

Os resultados

O Semaphore coloca os jobs em fila para serem executados em um pool de até 50 máquinas de build por organização, um aumento de dez vezes em relação ao plano mais poderoso anunciado pelo Travis. Com mais agentes para rodar os jobs e agentes mais poderosos para os jobs maiores, a nova solução de CI/CD trouxe os resultados esperados. Como Robert resume, “o ganho geral de desempenho em comparação com o Travis teve o resultado esperado: reduzimos aproximadamente pela metade o tempo do push até o resultado.” Grande parte dessa economia veio dos agentes de build de alto desempenho usados para a compilação intensiva em CPU do Haskell. O tempo para uma reconstrução completa dos binários nativos (com todas as dependências no cache) caiu de 30 minutos no Travis para cerca de 10 minutos com o Semaphore.

No geral, a equipe obteve as melhorias de produtividade e tempo que buscava. “O tempo para entregar (desde o merge de um PR até o pacote ser implantado) diminuiu devido aos tempos de espera mais curtos,” relata o CTO, “tornando os deployments menos disruptivos para o fluxo de trabalho geral.”

Setor

eCommerce

Tamanho da empresa

100-200 funcionários

Equipe de engenharia

35 pessoas

Stack Tecnológico

Python

Haskell

Nix

JavaScript

Star us on GitHub