Introdução
O controle de versão é um aspecto crítico do desenvolvimento de software e do gerenciamento de pacotes. À medida que o software evolui, o controle de versão adequado garante que as dependências sejam controladas com precisão, as alterações sejam comunicadas efetivamente e os sistemas permaneçam estáveis.
Por que o controle de versão importa
Alterações de software ao longo do tempo. Os requisitos para o software não permanecem os mesmos.
Evolução do software:
- Crescimento da funcionalidade: A funcionalidade que ele oferece e seu uso aumentarão, alterarão e se adaptarão com base nos comentários.
- Evolução da plataforma: A hospedagem de um aplicativo também pode evoluir, com novos sistemas operacionais, novas estruturas e versões.
- Correções: A implementação original pode conter falhas e bugs.
- Alteração contínua: Seja qual for o motivo da mudança, é improvável que o software esteja estável e não precise mudar.
Impacto na dependência:
Como o software que você cria usa dependências em outros componentes, o mesmo vale para os componentes e pacotes que você cria ou usa durante a criação do software.
O controle de versão correto torna-se essencial para manter uma base de código para acompanhar qual parte do software está sendo usada no momento.
Controle de versão e gerenciamento de dependência
O controle de versão também é relevante para o gerenciamento de dependências, pois se relaciona com as versões dos pacotes e os componentes dentro.
Acompanhamento de dependências:
Cada dependência é identificada por seu nome e versão. Ele permite manter o controle dos pacotes exatos que estão sendo usados.
- Identificação exclusiva: Nome + versão identifica exclusivamente um pacote.
- Ciclo de vida independente: Cada um dos pacotes tem seu ciclo de vida e taxa de alteração.
- Controle de versão: Habilita o controle preciso sobre quais versões de pacote são usadas.
Benefícios do controle de versão adequado:
- Builds reproduzíveis: Certifique-se de que os builds produzam resultados consistentes.
- Resolução de dependência: Os gerenciadores de pacotes podem resolver as versões corretas.
- Avaliação de impacto: Entenda o escopo das alterações em novas versões.
- Funcionalidade de reversão: Reverta para versões anteriores quando surgirem problemas.
Pacotes imutáveis
À medida que os pacotes obtêm novas versões, sua base de código pode escolher quando usar uma nova versão dos pacotes consumidos.
Especificação de versão
Ele faz isso especificando a versão específica do pacote necessário. Isso implica que os próprios pacotes sempre devem ter uma nova versão quando forem alterados.
Por que a imutabilidade importa:
Sempre que um pacote é publicado em um feed, ele não deve mais ser permitido de ser alterado. Se alterado, haveria o risco de introduzir mudanças que possam quebrar o código.
Princípio principal:
Em essência, um pacote publicado é imutável.
Regras de imutabilidade do pacote
Não é permitido substituir ou atualizar uma versão existente de um pacote. A maioria dos feeds de pacotes não permite operações que alterariam uma versão atual.
Impacto da imutabilidade:
- Fiabilidade: Os consumidores podem confiar que uma versão não muda inesperadamente.
- Consistência: Todos os consumidores obtêm o mesmo pacote para uma determinada versão.
- Segurança: Impede a modificação mal-intencionada das versões existentes.
- Capacidade de auditoria: O histórico de versão permanece intacto e rastreável.
Progressão de versão
Independentemente do tamanho da alteração, um pacote só pode ser atualizado introduzindo uma nova versão.
A nova versão deve indicar o tipo de alteração e o impacto que ela pode ter.
A numeração de versão indica:
- Escopo das alterações: Atualizações principais, secundárias ou de patch.
- Compatibilidade: Alterações que quebram versus alterações que não quebram.
- Nível de qualidade: Pré-lançamento versus versão estável.
- Intenção: O que a atualização se destina a realizar.
Visão geral do módulo
Este módulo explica estratégias de controle de versão para empacotamento, práticas recomendadas para controle de versão e promoção de pacotes.
Tópicos abordados:
- Fundamentos do versionamento de artefatos: Compreensão de tipos de versão e esquemas.
- Controle de versão semântico: Adotando o SemVer 2.0 para comunicação consistente.
- Visualizações do Azure Artifacts: Usando as visualizações @Local, @Prerelease, e @Release.
- Promoção de pacotes: Transferência de pacotes entre níveis de qualidade.
- Controle de versão automatizado: Envio de pacotes via push em pipelines de CI/CD.
- Práticas recomendadas: Implementando estratégias de controle de versão eficazes.
Objetivos de aprendizagem
Depois de concluir este módulo, os alunos e profissionais podem:
- Entenda a importância do controle de versão: Reconheça por que o controle de versão adequado é fundamental para o gerenciamento de dependências e a estabilidade do software.
- Implementar estratégias de controle de versão: Crie e aplique esquemas de numeração de versão efetivos para pacotes.
- Use versionamento semântico: Aplique princípios de versionamento semântico (SemVer 2.0) para comunicar versões de forma consistente.
- Gerenciar a qualidade do pacote: Use exibições do Azure Artifacts para separar pacotes por nível de qualidade.
- Promover pacotes: Mova pacotes por meio de gateways de qualidade, do pré-lançamento para a produção.
- Automatizar o versionamento: Envie pacotes pelas pipelines de build com números de versão apropriados.
- Aplique as práticas recomendadas: Siga os padrões do setor para controle de versão e gerenciamento de pacotes.
Pré-requisitos
- Compreensão do DevOps: Compreensão básica do que é o DevOps e seus conceitos.
- Conhecimento do controle de versão: A familiaridade com os princípios de controle de versão é útil, mas não é necessária.
- Experiência de entrega de software: Benéfico para ter experiência em uma organização que fornece software.
- Acesso ao Azure DevOps: Você precisa criar uma Organização do Azure DevOps e um Projeto de Equipe para alguns exercícios. Se você ainda não o tiver, confira:
- Noções básicas de gerenciamento de pacotes: Noções básicas sobre pacotes, feeds e gerenciamento de dependência de módulos anteriores.