Partilhar via


Modernize o seu desenvolvimento de software com integração contínua

À medida que o código é desenvolvido, atualizado ou até mesmo removido, ter um método intuitivo e seguro para integrar essas alterações na ramificação principal do código permite que os desenvolvedores forneçam valor.

Como programador, pode fazer pequenas alterações ao código, enviá-las para um repositório de código e obter comentários quase instantâneos sobre a qualidade, a cobertura dos testes e os erros introduzidos. Este processo permite trabalhar mais rapidamente, com mais confiança e menos riscos.

A integração contínua (CI) é uma prática em que os sistemas de controle do código-fonte e os pipelines de implantação de software são integrados para fornecer mecanismos automatizados de compilação, teste e feedback para as equipes de desenvolvimento de software.

O processo de integração contínua começa quando um engenheiro cria um pedido de pull no GitHub para sinalizar ao sistema de CI que as alterações de código estão prontas para serem integradas. Idealmente, o processo de integração valida o código em relação a várias linhas de base e testes. Em seguida, fornece feedback ao engenheiro requerente sobre o estado desses testes.

Se as verificações de linha de base e os testes forem bem-sucedidos, o processo de integração produz e prepara ativos que implantarão o software atualizado. Estes ativos incluem código compilado e imagens de contentores.

A integração contínua pode ajudá-lo a fornecer software de alta qualidade mais rapidamente, executando as seguintes ações:

  • Execute testes automatizados em relação ao código para permitir a deteção precoce de alterações interruptivas.
  • Execute a análise do código para garantir as normas, a qualidade e a configuração do código.
  • Execute verificações de conformidade e segurança para garantir que o software não tenha vulnerabilidades conhecidas.
  • Execute testes de aceitação ou funcionais para garantir que o software funciona como esperado.
  • Forneça comentários rápidos sobre os problemas detetados.
  • Se for caso disso, produza ativos ou pacotes implementáveis que incluam o código atualizado.

Automatizar a integração contínua através de pipelines

Para alcançar a integração contínua, use soluções de software para gerenciar, integrar e automatizar o processo. Uma prática comum é usar um pipeline de integração contínua.

Um pipeline de integração contínua envolve um software (geralmente hospedado na nuvem) que fornece:

  • Uma plataforma para executar testes automatizados.
  • Verificações de conformidade.
  • Elaboração de relatórios.
  • Todos os outros componentes que compõem o processo de integração contínua.

Na maioria dos casos, o software de pipeline está ligado ao controlo de versão, de modo que, quando são criados pull requests ou o software é integrado numa ramificação específica, o pipeline de integração contínua é executado. A integração do controlo de origens também oferece a oportunidade de enviar comentários à CI diretamente nos pedidos de pull.

Muitas soluções, como o Azure Pipelines ou o GitHub Actions, fornecem as capacidades de pipelines de integração contínua.

Integre pipelines com controle de origem

A integração do seu pipeline de integração contínua com o seu sistema de controlo de origens é fundamental para permitir contribuições de código rápidas e de gestão personalizada.

O pipeline de CI é executado num pedido de pull recém-criado. O pipeline inclui todos os testes, avaliações de segurança e outras verificações. Os resultados dos testes de CI aparecem diretamente no pedido de pull para permitir comentários quase em tempo real sobre a qualidade.

Outra prática popular é a criação de pequenos relatórios ou emblemas que podem ser apresentados no controlo da origem para tornar visíveis os estados de construção atuais.

A imagem seguinte mostra a integração entre o GitHub e um pipeline do Azure DevOps. Neste exemplo, a criação de uma solicitação pull aciona um pipeline do Azure DevOps. O estado do pipeline aparece no pedido de pull.

Captura de tela de um selo de status do Azure DevOps em um repositório GitHub.

Incorporar testes automatizados

Um elemento chave da integração contínua é a criação e os testes contínuos de código à medida que os programadores fazem contribuições de código. Testar pull requests à medida que são criados dá um feedback rápido de que o commit não introduziu alterações que causem problemas. A vantagem é que os testes no pipeline de integração contínua podem ser os mesmos testes que são executados durante o desenvolvimento orientado por testes.

O trecho de código a seguir mostra uma etapa de teste de um pipeline de DevOps do Azure. A etapa tem duas tarefas:

  • A primeira tarefa usa uma estrutura de teste Python popular para executar testes de CI. Esses testes residem no controle do código-fonte ao lado do código Python. Os resultados do teste vão para um arquivo chamado test-results.xml.
  • A segunda tarefa consome os resultados do teste e os publica no pipeline do Azure DevOps como um relatório integrado.
- script: |
    pip3 install pytest
    pytest azure-vote/azure-vote/tests/ --junitxml=junit/test-results.xml
    continueOnError: true

- task: PublishTestResults@2
    displayName: 'Publish Test Results'
    inputs:
    testResultsFormat: 'JUnit'
    testResultsFiles: '**/test-results.xml'
    failTaskOnFailedTests: true
    testRunTitle: 'Python $(python.version)'

A imagem a seguir mostra os resultados do teste que aparecem no portal do Azure DevOps.

Captura de ecrã dos testes de pipeline do Azure DevOps no portal do Azure DevOps.

Testes falhados

Os testes com falhas devem bloquear temporariamente uma implementação e conduzir a uma análise mais profunda do que aconteceu. Os testes com falhas também devem levar a um aperfeiçoamento dos testes ou a uma melhoria da alteração que causou a falha dos testes.

Publicar status de compilação

Muitos desenvolvedores mostram que a qualidade do código é alta exibindo um selo de status em seu repositório. A imagem a seguir mostra um selo do Azure Pipelines exibido no arquivo readme de um projeto de código aberto no GitHub.

Captura de ecrã de um emblema do Azure Pipelines num arquivo README no GitHub.

Otimize os tempos de construção

Para executar compilações mais rápidas, você pode:

  • Escolha agentes que atendam aos seus requisitos de desempenho: acelere suas compilações selecionando as máquinas de compilação certas. Máquinas rápidas podem fazer a diferença entre horas e minutos. Se seus pipelines estiverem no Azure Pipelines, você poderá executar seus trabalhos usando um agente hospedado pela Microsoft. Quando você usa agentes hospedados pela Microsoft, a manutenção e as atualizações são cuidadas para você. Para obter mais informações, consulte Agentes hospedados pela Microsoft.

  • Otimize o local do servidor de compilação: quando você está criando seu código, os dados são enviados através do fio. As entradas para as construções são obtidas a partir de um repositório de controle de versão e do repositório de artefatos. A saída do processo de compilação precisa ser copiada, incluindo os artefatos compilados, relatórios de teste, resultados de cobertura de código e símbolos de depuração. É importante que essas ações de cópia sejam executadas rapidamente. Se você usar seu próprio servidor de compilação, certifique-se de que o servidor de compilação esteja localizado perto das fontes e de um local de destino. Carregamentos e descargas rápidas podem reduzir o tempo geral de compilação.

  • Dimensionar servidores de compilação: um único servidor de compilação pode ser suficiente para um produto pequeno. À medida que o tamanho e o escopo do produto e o número de equipes trabalhando no produto aumentam, um único servidor pode não ser suficiente. Expanda a sua infraestrutura horizontalmente por várias máquinas quando alcançar o limite. Para obter mais informações, consulte Criar e gerenciar pools de agentes.

  • Otimize a compilação:

    • Adicione trabalhos paralelos para acelerar o processo de compilação. Para obter mais informações, consulte Configurar e pagar por trabalhos paralelos.

    • Habilite execuções paralelas do conjunto de testes, que geralmente economizam uma grande quantidade de tempo, especialmente ao executar testes de integração e interface do usuário. Para obter mais informações, consulte Executar testes em paralelo para qualquer executor de teste.

    • Utilize a noção de um multiplicador, de modo que possas dimensionar as tuas compilações em vários agentes de compilação. Para obter mais informações, consulte Especificação de tarefas no seu pipeline.

    • Considere mover a integração, a interface do usuário e os testes de fumaça para um pipeline de liberação. A mudança para um pipeline de liberação melhora a velocidade de compilação e a velocidade do loop de feedback de compilação.

    • Publique os artefatos de compilação em uma solução de gerenciamento de pacotes, como NuGet ou Maven. A publicação em uma solução de gerenciamento de pacotes permite que você reutilize seu artefato de compilação com mais facilidade.

Implemente tipos de compilação para se adequar aos seus fluxos de trabalho

Sua organização pode optar por criar vários tipos diferentes de compilações para otimizar os tempos de compilação. As compilações possíveis incluem:

  • Compilação de integração contínua (CI): O objetivo desta compilação é garantir que o código seja compilado e que os testes de unidade sejam executados. Esta compilação é ativada a cada commit. Ele serve como o coração do projeto e fornece feedback de qualidade para a equipe im_imagestely. Para obter mais informações, consulte Especificar eventos que acionam pipelines.

  • Construção noturna: O objetivo de uma compilação noturna não é apenas compilar o código, mas também garantir que quaisquer conjuntos de testes maiores que sejam ineficientes sejam executados em uma cadência regular para cada compilação. Normalmente, esses testes incluem integração, interface do usuário ou testes de fumaça. Para obter mais informações, consulte Configurar agendas para pipelines.

  • Release build: Além de compilar e executar testes, essa compilação também compila a documentação da API, relatórios de conformidade, assinatura de código e outras etapas que não são necessárias toda vez que o código é criado. Esta compilação fornece a cópia dourada que é direcionada ao pipeline de lançamento para a posterior implantação no ambiente de produção.

Os tipos de construções necessários para a sua organização dependem de fatores como a maturidade da sua equipa e organização, o tipo de produto em que está a trabalhar e a sua estratégia de implementação.

Saiba como criar um pipeline de integração contínua usando o GitHub ou o Azure DevOps:

Saiba como exibir selos em seus repositórios: