refspec
no tempo git fetch
acelera a etapa de clone por um fator de 100.
O grupo de Produtividade de Engenharia é responsável por apoiar os engenheiros que criam e implantam software no Pinterest. Nossa equipe oferece suporte a uma variedade de serviços de infraestrutura e frequentemente trabalha em grandes projetos - migrando todos os softwares para o Bazel , criando uma plataforma de entrega contínua chamada Hermez . Eles também suportam mono-repositórios , onde enviam várias centenas de commits todos os dias, e isso não é tudo de suas tarefas.
Trabalhamos muito para tornar o desenvolvimento e a entrega de software no Pinterest rápida e indolor. Recentemente, a vida mostrou mais uma vez o grande impacto que mesmo o menor detalhe pode ter. Encontramos um pequeno detalhe no Git que reduziu drasticamente os tempos de construção em nossos pipelines de integração contínua. Para entender como essa pequena mudança teve um impacto tão grande, precisamos compartilhar algumas informações sobre nossos monorepositórios e pipelines.
Monorepositórios e transportadores
Temos seis repositórios principais no Pinterest: Pinboard, Optimus, Cosmos, Magnus, iOS e Android. Todos esses são mono-repositórios com uma ampla gama de serviços específicos de idioma. Pinboard é o maior repositório único mantido desde a fundação da empresa. Ele tem mais de 350 mil commits e 20 GB de tamanho quando totalmente clonado.
A clonagem de um repositório mono com muito código e uma longa história leva muito tempo e, em nossos pipelines de integração contínua, temos que fazer isso com muita frequência durante o dia. Só no Pinboard, nos dias de semana fazemos mais de 60 mil itens.
git pull
... A maioria dos scripts de configuração de pipeline do Jenkins (escritos em Groovy) começa com a etapa Checkout, onde clonamos o repositório, que será construído e testado em etapas posteriores. Aqui está a aparência de um estágio típico de Checkout:

Se você usar o Git CLI diretamente:

``
Mesmo com clonagem incompleta / superficial, sem extrair nenhuma tag e apenas para os últimos 50 commits, a operação ainda não foi tão rápida quanto poderia. Isso ocorre porque não definimos o parâmetro refspec . Observe que a ausência deste parâmetro significa o comando para recuperar todos os refspecs: + refs / heads / *: refs / remotes / origin / * . No caso do Pinboard, mais de 2.500 agências são processadas.
Simplesmente adicionando a opção refspec e especificando em quais links estamos interessados (em nosso caso, apenas do master), você pode limitar o escopo do processamento para o branch desejado e economizar muito tempo. Aqui está o que parece em nosso pipeline:

uma mudança simples de uma linha reduziu o tempo de clonagem em 100 vezes e, como resultado, reduziu significativamente o tempo de construção. O tempo de clonagem para o maior repositório Pinboard foi reduzido de 40 minutos para 30 segundos. Isso mostra que às vezes até o menor esforço faz uma grande diferença.