O que significa "construção automatizada"?

15

Estou tentando adicionar a integração contínua a um projeto.

Segundo a Wikipedia , uma parte importante do IC são as compilações automatizadas. No entanto, estou confuso sobre o que, exatamente, isso significa, pois o IC e os artigos de automação de construção parecem discordar.

Pontos específicos de confusão: o que "construção automatizada" significa no contexto de:

  • um projeto usando uma linguagem interpretada, como Python ou Perl?
  • construindo a partir da fonte na máquina do usuário final?
  • um aplicativo que possui dependências que não podem ser simplesmente pré-compiladas e distribuídas, como um banco de dados em um RDBMS local na máquina do usuário?

fonte
2
Eu marquei ambos buildse buildporque não sabia qual usar.

Respostas:

14

Você está certo ao observar que, para algumas tecnologias, uma etapa de compilação não é necessária. No entanto, recomendo que você tenha uma visão mais ampla ao interpretar o termo "automação de construção". Pense em "compilar" como incluindo os dois principais componentes a seguir:

  • O processo para artefatos de origem de transformação (código, esquema do banco de dados, documentação etc.) implementado em um usuário final.
  • A aplicação de medidas de garantia de qualidade durante a referida transformação

A automação, então, refere-se simplesmente a tornar automática - se não todas - todas essas operações (ou seja, não requer intervenção manual). Isso pode incluir várias etapas, dependendo da sua tecnologia:

Etapas de transformação:

  • Compilação
  • Linking
  • Embalagem
  • Desdobramento, desenvolvimento
  • Migração de dados
  • Cópia de segurança
  • Notificação

Etapas de garantia de qualidade:

  • Avisos / erros do compilador
  • Testes unitários
  • Testes de integração
  • Testes do sistema
  • Autenticação de implantação

Hoje em dia, boas ferramentas de IC permitem lidar com todas essas preocupações. Inicialmente, a maioria das lojas está interessada em automatizar a compilação de seus códigos, já que essa é a primeira - e mais visível - fonte de problemas no desenvolvimento de software convencional.

Stephen Gross
fonte
21

Uma compilação automatizada é uma descrição de um processo que deve cobrir os seguintes princípios básicos:

  1. Obter o código mais recente do controle de origem
  2. Compile o código mais recente no executável
  3. Execute testes (testes de unidade, testes de sistema, testes de integração) no código compilado
  4. Implante o executável concluído em um local conhecido para implantação.
  5. Publique os resultados da construção.
    5.1 Compilação bem-sucedida, sucesso no teste de unidade

É um processo hands-off, que deve ser executado com zero intervenção manual.

Sheldon Warkentin
fonte
3
Como foi solicitado explicitamente, você pode mencionar que as etapas que não se aplicam são opcionais. Por exemplo, se o seu aplicativo é um monte de scripts python, a etapa 2 pode não ser nada ou pode ser algo tão simples quanto compactar o código em um único arquivo. É perfeitamente aceitável não ter uma etapa de compilação.
Bryan Oakley
@BryanOakley Isso é justo. O equivalente a não ter uma compilação de scripts pode garantir que todas as suas dependências, se houver alguma, sejam reunidas adequadamente neste momento. Por exemplo, quaisquer bibliotecas de terceiros adicionais exigidas pelo seu script Python devem ser incluídas para que sejam incluídas em todas as etapas a seguir. Isso também é desnecessário, suponho, se for sabido que o destino e a máquina de compilação sempre têm todas as bibliotecas necessárias.
Sheldon Warkentin
2

Na minha opinião, uma compilação automatizada é algo que

  • acontece automaticamente, de acordo com uma programação ou com cada confirmação no controle de origem
  • cria um conjunto de artefatos que podem ser implantados simplesmente em qualquer servidor

O objetivo é ter um processo de implantação que possa ser repetido - leia: testado - para que, no momento da implantação na produção, você tenha um certo grau de certeza de que as coisas não vão dar errado. Quanto menos interação humana nos processos de compilação e implantação, mais segura será sua versão.

Se você tiver um idioma não compilado, ainda poderá criar um site e compactá-lo para criar um único artefato.

Uma boa ferramenta de IC permitirá que você escreva muitas tarefas no processo de criação, incluindo a execução de testes de unidade. Ele também manterá registros de suas compilações bem-sucedidas e malsucedidas, cobertura de teste etc. Mas nada disso faz parte do que eu definiria como uma compilação automatizada. (ou seja, um bom processo de criação automatizado possui essas coisas, mas um processo ruim não deixa de ser chamado de "construção automatizada" porque falta essas coisas.)

Sugiro que os testes de integração / regressão sejam executados como parte do processo de implantação, em vez do processo de compilação (embora, se você tiver um ambiente conveniente, possa implantar em cada compilação).

pdr
fonte
Também pode ser útil ter uma compilação agendada e permitir que os desenvolvedores iniciem uma compilação automatizada com uma ação (se são duas ações, não é realmente automatizada, não é?) No nosso caso, a compilação para alguns sistemas é muito muito tempo para o kickoff de cada commit, por isso é dentro do cronograma e a pedido.
David Thornley
@DavidThornley: Sim. Isso é útil. A maioria das ferramentas de IC permite iniciar uma compilação fora do cronograma definido. Mas, novamente, ele não deixa de ser uma compilação automatizada porque esta opção não existe. Deixaria de ser uma construção automatizada se um desenvolvedor sempre tivesse que acioná-la.
Pd
1
a project using an interpreted language, such as Python or Perl?

No caso de linguagens interpretadas, as coisas podem falhar. Algumas linguagens interpenetradas possuem compiladores, mas, na maioria das vezes, provavelmente não há muita necessidade de usá-las. Nesse caso, geralmente apenas procurava o código em busca de erros de sintaxe e análise no lugar da compilação ou passava direto para a execução dos testes no código.

construindo a partir da fonte na máquina do usuário final?

Para mim, isso significa que você pode fornecer um único comando que os usuários finais podem executar para obter a versão mais recente do programa, compilá-lo, configurar e implantar conforme necessário.

um aplicativo que possui dependências que não podem ser simplesmente pré-compiladas e distribuídas, como um banco de dados em um RDBMS local na máquina do usuário?

Eles se enquadram na parte de teste da integração contínua, pois é possível destruir e reconstruir automaticamente os bancos de dados para garantir que os scripts estejam corretos e que o programa seja testado corretamente.

rjzii
fonte
1

O que você está discutindo na sua pergunta são, na verdade, três conceitos diferentes:

A integração contínua em seu núcleo está fazendo pequenas alterações e frequentemente sincronizando essas alterações com a "verdade global". Em vez de fazer um checkout e mantê-lo por uma semana, um desenvolvedor deve trabalhar em tarefas que podem ser concluídas em um dia para que seu código nunca fique muito fora de sincronia com o repositório principal.

Para conseguir isso sem causar problemas à equipe (por exemplo, verificar a fonte que não cria ou quebra a funcionalidade existente). O desenvolvedor deve verificar se seu código não "quebra a compilação". Se feito manualmente, isso adiciona uma sobrecarga adicional ao processo de desenvolvimento (pense em um projeto que leva muito tempo para ser construído e / ou possui muitas interdependências em que uma alteração em uma linha de código pode afetar o aplicativo de maneiras inesperadas).

Para mitigar essa situação, usamos outras técnicas para remover essa sobrecarga.

Usamos compilações automatizadas para efetuar o check-out da fonte e, opcionalmente, executando testes automatizados que verificam se o aplicativo funciona como deveria (essa etapa é tão útil quanto a suíte de testes).

Uma outra etapa de entrega contínua soluciona seu problema com o banco de dados e outras preocupações. A idéia aqui é fornecer algum nível de versão para o banco de dados e outros fatores do ambiente, para que possamos confirmar o mais rápido possível que o aplicativo funciona em um ambiente o mais próximo possível da produção .

Michael Brown
fonte
1
Grandes pontos ... é uma pena que a maioria das pessoas não leia até o final do tópico e vote.
Hotshot309 01/10/12
0

"Compilação automatizada" significa que você pode passar do controle de origem para um pacote expedível com uma ação (agendável) (geralmente um script de shell ou arquivo em lotes).

O que exatamente constitui uma construção, nesse contexto, depende muito do que exatamente você está enviando, como é entregue e quais etapas são necessárias para as várias partes da sua pilha de desenvolvimento, mas, em qualquer caso, você começa com o que está no controle de origem e você acaba com um produto que pode ser entregue (ou uma mensagem de erro e um gerente de projeto irritado).

Para um projeto Python simples, uma compilação automatizada pode consistir em apenas duas etapas - verificar as fontes e copiar arquivos relevantes para os diretórios corretos. Para projetos mais complexos, pode envolver coisas como:

  • compilando, vinculando
  • executando testes automatizados
  • criando pacotes de instalação
  • instalando
  • modificando banco de dados
  • criando backups (caso você precise reverter)
tdammers
fonte