Estudo de caso · Stack

Como o GitLab mantém um monólito gigante em Rails à vista de todos

O GitLab é uma plataforma de núcleo aberto que junta controle de código, CI/CD e segurança num app só, e o GitLab.com é a maior instalação dele. A base é um monólito em Ruby on Rails escolhido de propósito por ser previsível, com PostgreSQL, Redis e Sidekiq, mais serviços em Go nos trechos que precisam de velocidade, rodando no Google Cloud e em Kubernetes.
Copiar stackgitlab.com Plataforma DevSecOps para código, CI/CD e segurança · Estados Unidos · fundada em 2011

A stack da GitLab

Abrir no montador

Linguagem

Biblioteca de interface

  • Vue.jsdocs.gitlab.com

    Partes interativas da interface, encaixadas nas páginas HAML do Rails.

Hospedagem

  • Google Cloudabout.gitlab.com

    Nuvem onde o GitLab.com roda desde a saída do Azure em 2018.

    Por quê: O Azure não dava ao GitLab.com a confiabilidade necessária, e o Google Cloud oferecia mais desempenho e estabilidade, Kubernetes e preço.

  • Kubernetesabout.gitlab.com

    Roda os serviços sem estado do GitLab.com no Google Kubernetes Engine com o Helm chart oficial.

    Por quê: As máquinas virtuais demoravam para escalar e receber deploys, e o Kubernetes prometia escala, deploys e uso de máquina melhores.

Banco de dados

  • PostgreSQLdocs.gitlab.com

    Guarda os metadados do app e as informações dos usuários.

Login

  • Devisegitlab.com

    Biblioteca do Rails por trás do login dos usuários.

Busca de dados

  • Redisdocs.gitlab.com

    Guarda sessões, cache temporário e as filas de tarefas em segundo plano.

  • Sidekiqdocs.gitlab.com

    Processa as tarefas em segundo plano tiradas da fila no Redis.

    Por quê: As tarefas em segundo plano deixam cada requisição responder mais rápido.

  • GraphQLdocs.gitlab.com

    API padrão para os dados do front-end, consumida com Apollo.

Framework de servidor

  • Ruby on Railsabout.gitlab.com

    Framework do monólito central do GitLab.

    Por quê: O ecossistema de gems e as convenções fortes ajudam um código enorme e aberto a ficar consistente e fácil de navegar para quem chega.

  • Goabout.gitlab.com

    Linguagem do Gitaly, o serviço que cuida de todas as chamadas Git, e de outros trechos que precisam de desempenho.

    Por quê: O Ruby favorece quem programa, não a produção, então os trechos mais pesados e de espera por disco e rede foram para Go.

  • Pumadocs.gitlab.com

    Servidor que roda o app Rails para as páginas web e a API.

Arquivos

  • Google Cloud Storageabout.gitlab.com

    Armazenamento de objetos para artefatos de CI, logs de jobs, anexos e arquivos LFS.

Busca

Erros

Como montaram

Rails de propósito, com soluções sem firula

O cofundador Dmitriy Zaporozhets escolheu Rails mesmo programando mais em PHP na época, em parte porque o GitHub era feito nele. O CEO Sid Sijbrandij defendeu a escolha depois: o ecossistema de gems dá ao time muita coisa pronta para aproveitar, e as convenções do Rails dizem a todos onde cada código deve ficar.

Esse último ponto pesa na missão do GitLab de que qualquer pessoa pode contribuir. Quem chega consegue se achar num código enorme porque ele segue o caminho padrão do Rails, e o time prefere soluções simples a truques espertos.

Fontes:about.gitlab.com

Go onde o Ruby fica lento

O Sijbrandij foi direto: o Ruby foi feito para facilitar a vida de quem programa, não para rodar em produção. Por isso os trechos mais acessados, ou os que passam o tempo esperando disco e rede, foram reescritos em Go.

O maior resultado é o Gitaly, um serviço em Go que cuida de todas as chamadas Git do GitLab. Ele nasceu para acabar com a dependência de NFS no armazenamento do Git, e o objetivo declarado é escalar esse armazenamento horizontalmente com tolerância a falhas, principalmente no GitLab.com. Hoje todo o código do app chega aos repositórios por ele.

Fontes:about.gitlab.com gitlab.com docs.gitlab.com

Do Azure para o Google Cloud em 2018

O GitLab.com rodava no Azure e não estava pronto para trabalho crítico. Em 2018 o time levou tudo para o Google Cloud, citando o desempenho e a estabilidade de que precisava, além de Kubernetes e preço. Eles usaram a própria replicação Geo do GitLab para copiar os dados e passaram cerca de 200 TB de artefatos de CI, anexos e arquivos LFS para o Google Cloud Storage.

Os números melhoraram rápido. A disponibilidade foi de 99,61% antes da mudança para 99,93% em abril de 2019, e os erros diários caíram de uma média de 8,2 para cerca de um.

Fontes:about.gitlab.com

Mudando para Kubernetes, um serviço por vez

As máquinas virtuais demoravam para escalar e para receber deploys, então em agosto de 2019 o GitLab.com começou a migrar para o Google Kubernetes Engine, a começar pelo Container Registry. Depois vieram web, API, tráfego Git e as tarefas do Sidekiq, tudo rodando com o mesmo Helm chart oficial que os clientes usam.

O que guarda estado ficou nas máquinas virtuais: PostgreSQL, Redis, GitLab Pages e Gitaly. Um ano depois, o time contou que os deploys ficaram bem mais rápidos e seguros, mas o tráfego de rede entre zonas virou um custo novo para vigiar.

Fontes:about.gitlab.com

Ilhas de Vue em páginas HAML

O front-end é misto: o Rails monta páginas em HAML, e apps em Vue.js são encaixados nelas onde a tela precisa de interação. O guia de front-end pede para manter poucos apps Vue por página.

Para buscar dados, o padrão é GraphQL com Apollo, e o REST fica para páginas HAML simples e código antigo. O Vuex foi descontinuado em favor do Pinia ou de componentes que guardam o próprio estado.

Fontes:docs.gitlab.com

Também detectado no site

Achado na página inicial com as regras abertas do Wappalyzer (HTML, scripts e cabeçalhos). Mostra o que roda no navegador, não o backend inteiro.

  • Cloudflare
  • Dreamdata
  • GitLab
  • HSTS
  • HTTP/3
  • Marketo
  • Nuxt.js
  • OneTrust
  • Optimizely