Qual é o objetivo de uma máquina de construção dedicada?

75

Devido a várias circunstâncias que levaram a uma implantação ruim no último ciclo de construção, fiz uma campanha em nosso escritório para realizar todas as implantações futuras com uma máquina de construção dedicada, e meu chefe aceitou esta proposta.

No entanto, em vez de usar uma máquina real em nosso escritório, estamos tendo que compartilhar uma única máquina com vários outros grupos - e o aborrecimento de ter que deixar meu escritório com todas as informações necessárias e depois descer um lance de escadas para outro escritório, apenas para executar uma compilação simples, está me fazendo pensar por que propus isso em primeiro lugar.

A idéia de ter uma máquina de compilação separada era, originalmente, separar meu próprio código gravado localmente do código de vários outros desenvolvedores e separar os arquivos seqüestrados que eu tinha na minha máquina da implantação. Foi também para resolver uma preocupação crescente que tive com nosso sistema de gerenciamento de arquivos ClearCase, que muitas vezes se recusa a me permitir implementar certas atividades de compilação, a menos que eu também inclua outra atividade da qual 'tenha dependências'.

Agora que estou realmente avançando nesse processo, estou pensando se não entendi completamente o propósito de usar uma máquina de compilação - e como estamos usando essa máquina apenas para implantação de código em nossos ambientes de teste, preparação e produção, e não para nossas implantações pessoais de teste de desenvolvedor, não tenho certeza se isso serve a algum objetivo.

Então, qual é o motivo real do uso de uma máquina de construção e eu cheguei perto de usá-la corretamente?

Zibbobz
fonte
166
"o aborrecimento de ter que sair do meu escritório com todas as informações necessárias e depois descer um lance de escadas para outro escritório apenas para executar uma construção simples [...]" O que você quer dizer exatamente? Você acessa fisicamente essa máquina para criar uma compilação?
18717 Vincent Vincentard
13
O verdadeiro WTF é o Clearcase, pior do que todas as alternativas modernas de código aberto. Que idioma (s) é esse projeto e qual o tamanho / complexidade da compilação?
Pjc50 04/03/19
7
Você está usando ferramentas? Git / SVN e Jenkins / Team City / Octopus / TFS, etc? Ou você está apenas efetuando login em outro computador, carregando o Visual Studio ou o que tem ... copiando projeto, carregando, compilando ... Você está usando ferramentas profissionais ou manualmente?
WernerCD
84
Minha máquina de construção está em algum lugar da Carolina do Sul e eu estou em Seattle. Garanto-lhe que não desço nenhuma escada para usá-lo. Eu acho que a última vez que tive acesso físico a uma máquina de construção foi quando eu era o estagiário encarregado de construir máquinas para compiladores da Microsoft em 1994, quando eles se encaixavam em um pequeno armário; agora eles são um data center inteiro em algum lugar. Coloque a máquina na sua rede; melhor ainda, coloque-o na nuvem e faça com que outra pessoa cuide dele.
precisa

Respostas:

138

Normalmente você não teria apenas uma máquina de construção dedicada, mas também executaria um servidor de construção nessa máquina dedicada. Uma máquina de construção dedicada apenas oferece a vantagem de nunca bloquear o trabalho de um desenvolvedor e implantar a partir de uma máquina centralizada.

Um servidor de compilação oferece muito mais. Um servidor de build permite IC (integração contínua), o que significa que ele será criado automaticamente a cada push no seu VCS (como o git), podendo até executar testes de unidade se você os tiver e permitir "implantação com um clique". Os servidores de compilação podem notificá-lo por email se as compilações ou testes falharem. Eles oferecem dados históricos e tendências sobre o que aconteceu.

Geralmente, os servidores de compilação podem ser acessados ​​por vários usuários ou equipes, usando um GUI da Web que é executado em um navegador.

No mundo Java, um dos servidores de compilação mais usados ​​é o Jenkins. O Jenkins também funciona perfeitamente com compilações em C ++ (já que você parece usar essas duas linguagens). Jenkins se autodenomina servidor de automação, pois pode executar todos os tipos de tarefas que não precisam estar relacionadas à programação e construção.

Traubenfuchs
fonte
3
Na verdade, não toquei em c ++ desde a faculdade, mas posso entender a utilidade. Embora, neste caso, acho que o que realmente estamos fazendo possa estar muito longe do objetivo pretendido.
Zibbobz
21
Para algumas linguagens (C ++ em particular), ter uma caixa dedicada com mais poder de processamento também pode ser útil, pois é uma compilação relativamente lenta.
Enderland 3/03
31
Integração Contínua significa mais do que apenas ter um servidor de compilação - também significa que todos integram as alterações uns dos outros com a maior frequência possível, para evitar problemas de mesclagem do "big bang". Caso contrário, local.
Rob Crawford
Embora eu goste do poder que um exemplo dá ao argumento apresentado aqui, ainda acho que o último parágrafo é totalmente desnecessário nesta resposta.
Pierre Arlaud
3
"Uma máquina de construção dedicada apenas oferece a vantagem de nunca bloquear o trabalho de um desenvolvedor e implantar a partir de uma máquina centralizada". Não é totalmente verdade. O solicitante apontou que é muito fácil ter um ambiente impuro em uma máquina de desenvolvedores. Todas as bibliotecas incluídas e outras variáveis ​​de ambiente podem alterar o resultado da compilação. Uma máquina dedicada deve ter um ambiente bem documentado para facilitar a recreação da construção.
TafT
107

Além da resposta de Traubenfuchs, você sugeriu outro motivo para uma máquina de construção em sua pergunta.

Só porque o software é construído na sua máquina, isso não significa que ele será desenvolvido na outra pessoa. Você pode confiar em alguns arquivos aleatórios que estão na sua máquina (e talvez nem estejam sob controle de versão). Você pode estar contando com algum aplicativo ou biblioteca esquecida chamada de um script de construção obscuro.

Se você possui uma máquina de compilação dedicada, deve saber o que está instalado nela. Isso deve estar bem documentado. Se houver a necessidade de reconstruir o software, talvez anos depois, só será necessário criar uma nova máquina de compilação com o material documentado instalado.

Simon B
fonte
37
+ 1 A quantidade de vezes que algo funciona na máquina de um desenvolvedor, e não o resto da equipe de ...
user2259716 3/17
45
Este. O principal objetivo de construir em outra máquina é ter construções reproduzíveis ; principalmente eliminando coisas não comprometidas, variáveis ​​de ambiente díspares, etc ... da equação.
Matthieu M.
9
Estenda isso: use uma nova imagem de contêiner limpa a partir da qual você inicia cada compilação. Em seguida, faça com que um script de auto-inicialização configure o sistema. Isso realmente garante construções reproduzíveis.
Matthias Kuhn
9
@MatthiasKuhn: verdadeiramente (byte a byte) reproduzível constrói exigem muito mais, cf: reproducible-builds.org wiki.debian.org/ReproducibleBuilds
ninjalj
1
Além disso, apenas porque a versão Linux do produto cria e passa nos testes na área de trabalho do Linux não significa que a versão do Windows ou a versão do Mac serão compiladas.
Solomon Slow
53

O principal motivo para ter uma máquina de compilação dedicada é obter compilações consistentes, independentemente de quem está fazendo a compilação. As estações de trabalho do desenvolvedor raramente são (lidas: nunca) idênticas. É difícil saber que cada compilação está usando as mesmas versões exatas de dependências e compiladores, etc. Um dos piores problemas com compilações de estações de trabalho de desenvolvimento é que os desenvolvedores podem compilar a partir de código que não está verificado no controle de versão.

Não está claro qual plataforma / idioma (s) você está usando, mas idealmente você deve ter um servidor de construção que extraia diretamente do controle de origem. Ou seja, quando uma construção é necessária, ela recupera a fonte de uma determinada versão do repositório e a compila automaticamente. Isso requer o uso de ferramentas de construção automatizadas para criar um script para a construção. Se você não tiver isso, esse deve ser o passo 1.

Lembre-se de que não há nada de errado em construir localmente para o desenvolvimento. Definitivamente, você deve estar trabalhando localmente executando testes de unidade, análise de qualidade de código e aprimorando scripts de construção. Caso contrário, você estará perdendo muito tempo. A saída do servidor de construção é para qualquer coisa que você queira mover potencialmente para produção. Todas as atividades de controle de qualidade, como testes de integração e aceitação, devem ser realizadas apenas com construções do servidor de construção.

JimmyJames
fonte
Além disso, resistência adicional a vírus.
217 Joshua Joshua
@ Josué O que lhe dá essa idéia?
Jpmc26 5/03
14
@ jpmc26: A máquina de compilação obtém muito menos software instalado, precisa de menos pontos de acesso remoto e ninguém está abrindo navegadores da Web para sites aleatórios na Internet.
Joshua
19

As outras respostas observaram corretamente que você deve automatizar a compilação, o que significa que não é necessário ir para outro escritório. No entanto, deixe-me propor um certo número de etapas que você pode executar para melhorar seu processo de criação:

  • Primeiramente, configure o acesso remoto ao servidor de compilação! Se você criar manualmente digitando o comando "make", isso significa que você não precisará mais caminhar para outro escritório para digitar "make", basta fazer o SSH no servidor de criação e digitar "make". Se você ainda não usa o make ou um sistema de compilação semelhante, use esse sistema de compilação.
  • Em segundo lugar, instale um ambiente de integração contínua que extraia automaticamente as alterações mais recentes do sistema de controle de versão (você possui um sistema de controle de versão, certo? Caso contrário, isso seria uma etapa adicional) e as constrói. Eu recomendo Jenkins. Configure o Jenkins para executar também seus testes de unidade e testes de integração no nível do sistema (você tem os dois, certo? Caso contrário, crie-os a partir de testes de unidade e, depois, terminando em testes de integração no nível do sistema).
  • Em terceiro lugar, se você achar problemático o compartilhamento da mesma máquina com outras equipes (como se você tiver opiniões diferentes sobre qual sistema operacional e qual versão e flexibilidade você deve usar), considere usar a virtualização. Um bom servidor hoje pode executar um grande número de máquinas virtuais. Talvez você possa configurar uma máquina de 32 bits e uma de 64 bits para saber que a construção funciona nas duas arquiteturas.
  • Por fim, isso pode não ser necessário: se você precisar absolutamente de uma máquina dedicada, como se o desempenho do seu aplicativo for de grande importância e outras compilações / execuções de teste em execução ao mesmo tempo afetarem demais os resultados, instale um servidor de hardware dedicado somente você usa. No entanto, em servidores recentes que podem ter até 40 núcleos de CPU virtual ou até mais, é relativamente simples criar algumas máquinas virtuais que não compartilham acesso aos mesmos núcleos de CPU.

Eu consideraria uma máquina compartilhada muito melhor do que compilações manuais. Meu projeto atual usa uma máquina virtual agora, mas devido à necessidade de testes de desempenho de integração no nível do sistema, estamos nos mudando para um servidor dedicado com 40 núcleos de CPU virtual, dos quais os testes de desempenho exigem 17.

juhist
fonte
16

... em vez de usar uma máquina real em nosso escritório, precisamos compartilhar uma única máquina com vários outros grupos ...

Você diz isso como se fosse uma coisa ruim.

Agora você tem um servidor de compilação comum pelo qual todas as suas compilações - a sua e a de outras equipes - são construídas. Consistência da compilação? Verifica.

... o incômodo de ter que sair do meu escritório com todas as informações necessárias e depois descer um lance de escadas para outro escritório apenas para executar uma compilação simples está me fazendo pensar por que propus isso em primeiro lugar.

Você ainda está executando a compilação manualmente e isso não é bom.

Você precisa de um processo do servidor para o qual você envia / solicita filas para que as compilações sejam feitas em seu nome e solicita que esse processo envie de volta o (s) resultado (s).

Phill W.
fonte
5
"Você diz isso como se fosse uma coisa ruim." Pode ser que eles tenham liberdade para instalar o que quiserem. Se eles estão remotamente acessando ou acessando fisicamente, não vejo como isso poderia ser evitado.
jpmc26
7
"Você diz isso como uma coisa ruim. Agora você tem um servidor de compilação comum no qual todas as suas compilações - a sua e as outras equipes - são construídas. Consistência da compilação? Verifique". Esse é o completo oposto de uma construção consistente! Se qualquer outra equipe decidir atualizar seu compilador ou qualquer outra ferramenta, você está subitamente lidando com um ambiente de compilação completamente diferente. Esse é o pior cenário possível (além de não ter uma máquina de compilação, para começar).
Voo
1
Concordou em querer ter um processo automático para criar novas construções, mas ao mesmo tempo você também deseja virtualizar seus agentes de construção para garantir que seu ambiente de construção esteja sob seu próprio controle. As VMs são uma ferramenta incrível para os desenvolvedores e você deve aproveitar ao máximo.
Voo
@ Voo Não é o pior cenário, é o cenário do meio. O que o solicitante atualmente possui é o pior cenário possível. (Observe também que se você nunca reproduzir constrói, atualizações do compilador aleatórios não são muito de um problema)
user253751
@immibis Você leu a parte em parênteses logo após a parte que citou? É o pior cenário se um servidor de compilação estiver envolvido. O problema com os bugs não reproduzíveis é que você não pode realmente executar Hotfixes se todo o ambiente de compilação mudou nesse meio tempo. Isso não é um grande problema se você tiver apenas uma única versão lançada que é mantida próxima ao tronco, mas em todos os outros casos é muito ruim.
Voo
1

Além de outras respostas relevantes, também parece que você está executando suas construções diretamente na máquina em questão.

Para um sistema de construção confiável, especialmente ao compartilhar a máquina de construção com outros usuários, é normal executar suas construções em uma máquina virtual. Isso garante que outros usuários não possam alterar o comportamento de suas compilações instalando suas próprias versões de aplicativos ou bibliotecas das quais seu código depende. Uma grande vantagem disso é que é possível fazer backup facilmente da VM e também pode ser clonada facilmente em qualquer outro PC (incluindo sua própria máquina de desenvolvimento).

Graham
fonte
1

Ele fornece um local neutro e centralizado para executar compilações, independentemente das configurações de biblioteca IDE, SO, de desenvolvedores individuais.

Com uma máquina de compilação dedicada, é possível reconstruí-la sempre que houver um envio de código ao repositório. Quando alguém quebra a compilação, o processo pode enviar imediatamente um alerta para que o problema possa ser corrigido imediatamente.

Além de tornar tudo mais repetitivo e confiável e garantir que o repositório não esteja cheio de lixo quebrado com problemas de dependência ocultos, isso facilita a vida dos desenvolvedores porque tudo o que eles precisam fazer para que a construção funcione em sua máquina é copiar o que quer que seja está sendo feito na máquina de construção.

Jim W
fonte
4
este não parece oferecer nada substancial sobre os pontos feitos e explicado em antes 6 respostas
mosquito