Kyle Lieber.
algumas coisas pelas quais eu senti escrever.
Estratégia de versão do Maven.
Eu tenho tido muitas discussões com analistas da minha organização sobre como o software de versão usando Maven e I & rsquo; achar que há um equívoco comum sobre o que realmente significa SNAPSHOT. Eu estava procurando um bom blog para enviá-los que ajude a explicar o controle de versão em Maven, mas infelizmente tudo que eu encontrei apenas discute formatos de versão e não como usá-los como você está desenvolvendo um aplicativo. Então, eu decidi que eu tomaria uma facada nisso. Congratulo-me com quaisquer comentários e críticas construtivas que me ajudem a melhorar este documento, então fique à vontade.
Primeiro, um SNAPSHOT não é o mesmo que uma versão alpha / beta / etc. É uma palavra-chave especial que significa que é a versão mais recente do seu código. Isso significa que ele muda. Se você derrubou o someapp-1.0-SNAPSHOT ontem e então você tenta retirá-lo hoje, provavelmente não será o mesmo. Isso também significa que se você tiver um projeto dependente de uma versão do SNAPSHOT, o maven precisará verificar o repositório remoto para as mudanças sempre que você executar uma compilação.
A próxima coisa a entender é qual é a versão em Maven. Uma versão não significa que a versão esteja pronta para a produção. Isso significa que o desenvolvedor decidiu que ele está em um ponto em seu desenvolvimento que ele quer que o código seja bloqueado para que não seja perdido. Ele também pode querer distribuir esse código para alguém, talvez seja uma biblioteca, um desenvolvedor em outra equipe precisa começar seu próprio desenvolvimento de aplicativos ou talvez seja um aplicativo que será instalado em um ambiente de teste para testes. Então, isso significa que uma versão do maven pode ser um alfa, beta, candidato a liberação, patch, produção ou qualquer outra coisa que você deseja categorizar.
Faz sentido? Bem, talvez passar por um cenário de como eu lido com isso o ajudaria. Primeiro, olhe para a estratégia de versão que uso:
Estratégia de versão.
A sintaxe para esta estratégia é baseada no formato em Maven: The Complete Reference. As diferenças são I & rsquo; m rename & ldquo; incremental version & rdquo; para & ldquo; patch & rdquo; e quebra o opcional & ldquo; qualifier & rdquo; em & ldquo; type & rdquo; e uma & ldquo; tentativa & rdquo; simplesmente por clareza.
& lt; major & gt; - Este é um número que indica uma mudança significativa no aplicativo. Uma versão importante talvez seja uma reescrita completa da versão principal anterior e / ou quebra a compatibilidade com versões anteriores. & lt; minor & gt; - Este é um número que indica um pequeno conjunto de alterações da versão secundária anterior. Uma versão menor geralmente consiste em um conjunto uniforme de correções de bugs e novos recursos e deve sempre ser compatível com versões anteriores. & lt; patch & gt; - Este é um número que indica que foram corrigidos alguns erros que não podiam esperar até a próxima versão menor. Uma versão de patch só deve incluir correções de bugs e nunca incluir novos recursos. Também deve ser sempre compatível com versões anteriores. As correções de segurança são um exemplo de um patch típico. [& lt; type & gt; - & lt; tentativa & gt;] - Esta última parte é opcional e usada apenas para identificar que esta versão não é necessariamente estável. O tipo é uma palavra-chave e pode ser qualquer coisa, mas geralmente aderem a alpha, beta e RC. A tentativa é apenas um número para indicar qual tentativa desse tipo é essa. Então, por exemplo, beta-01, RC-02, RC-05, ect. Para uma versão estável, deixo essa parte, no entanto, eu vi outros projetos que gostam de usar a palavra-chave de RELEASE para indicar a versão estável (você deixa a tentativa, porque isso não faria sentido, use RC (lançamento candidato) para isso).
Exemplo Scenerio.
Então, agora, para o cenário. Deixe-nos dizer que eu estou trabalhando no aplicativo Foobar. Minha organização está esperando que eu entregue a versão 1.0 do foobar no final do trimestre. (Observe que eu digo 1,0, o que significa que eu só uso os dois primeiros números para se referir à versão. Isso ocorre porque a versão maior e menor são realmente as únicas versões em que qualquer pessoa se importará além do seu time de desenvolvimento. Além disso, não há caminho para eu saber qual será a versão final, mas eu sei que o maior e o menor permanecerão o mesmo.) Eu estou trabalhando em uma equipe ágil, então eu vou implantar tudo o que eu fiz no final de cada sprint para o meu ambiente de teste para que meus testadores possam validar tudo. Então, aqui é o que eu posso fazer:
Vou começar com a versão 1.0.0-SNAPSHOT no meu pom. xml no início do Sprint # 1. No final do Sprint # 1, vou usar o plugin maven-release para criar a versão foobar-1.0.0-RC-01 da aplicação Foobar. O plugin irá mudar a versão de 1.0.0-SNAPSHOT para 1.0.0-RC-01, marcar o código em scm com foobar-1.0.0-RC-01 e, finalmente, criar essa versão. Em seguida, o plugin irá atualizar o tronco para ser a próxima versão de desenvolvimento do aplicativo que iremos em 1.0.0-SNAPSHOT. Então eu vou implantar o foobar-1.0.0-RC-01 para o ambiente de teste. Este processo continuará para os próximos sprints até chegarmos a uma fase em que estamos a um ponto em que pensamos estar completo.
Então, deixe-nos dizer que estamos agora na Sprint # 5. Nós lançamos quatro versões de candidatura de lançamento do aplicativo, corrigindo erros e adicionando recursos ao longo do caminho. Agora nos sentimos foobar-1.0.0-RC-04 está pronto para uso em produção. Agora eu lanço o maven-release-plugin novamente para criar a versão foobar-1.0.0 do meu aplicativo. Mais uma vez, o plugin irá marcar a versão atual do código no scm com foobar-1.0.0 e, em seguida, construir essa versão. O plugin então atualizará o tronco para ser a próxima versão de desenvolvimento do aplicativo que desta vez eu escolho ser 1.1.0-INSTANTÂNEO.
Aviso, incremento a versão menor e não a versão do patch. Em um mundo perfeito, eu seria feito com a versão 1.0, mas é claro que isso não é um mundo perfeito e, provavelmente, I & rsquo; eu tenho que corrigir minha versão 1.0.0 em algum momento. Como eu não sei quando isso será, eu vou seguir com a vida e começar a trabalhar na próxima versão do aplicativo, 1.1.
Algumas semanas depois, minha equipe de QA me informa que um erro foi encontrado nos testes de lançamento que precisam ser corrigidos. O que vou fazer agora? I & rsquo; ve movido e tem novo 1.1 código no tronco que pode & rsquo; t entrar na versão 1.0. Sem preocupações, lembro que o plugin de lançamento marca cada um dos meus lançamentos para mim. Então, eu crio um ramo da tag foobar-1.0.0 e chama foobar-1.0.X. Em seguida, marquei o novo ramo e incremente a versão do patch para 1.0.1-SNAPSHOT. Este novo ramo é agora meu ramo de remendo. Eu corrigirei o bug relatado pela equipe de QA e use o plugin de lançamento para produzir a versão de patch foobar-1.0.1. Então, imediatamente depois de produzir foobar-1.0.1, mesclaremos as alterações 1.0.1 no tronco para que a correção esteja presente na versão 1.1 (que ainda não foi lançada).
Então respiro fundo e volto a trabalhar no 1.1. Se surgir outro erro, talvez, mesmo depois de sairmos à produção, vou continuar a voltar ao meu ramo de remendo foobar-1.0.X para fazer a correção e mesclar as mudanças de volta ao tronco.
Estratégia simplificada.
Eu não uso sempre a estratégia acima. Na verdade, muitas vezes eu uso o que eu chamaria de versão simplificada desta estratégia. Essencialmente, é a mesma coisa, exceto que eu removo o - & lt; type & gt; - & lt; tentativa & gt; completamente e em vez de um & lt; patch & gt; , Eu tenho um mais genérico & lt; incrementalVersion & gt; (assim como no livro maven). Então, parece assim:
Deixe o & rsquo; s voltar para o cenário de exemplo acima e compare a estratégia completa com esta estratégia simplificada:
Como você pode ver, a estratégia simplificada perde uma parte da verbosidade da estratégia completa que pode ser uma coisa boa e ruim. Não será óbvio se uma versão está pronta para a produção ou apenas um candidato a liberação. No entanto, isso significa que você não precisa testar o candidato de lançamento aceito duas vezes. Se você notou, a versão fornecida pela Sprint # 4 também é a versão de produção. Não há necessidade de reconstruí-lo apenas para remover o - RC-04.
Para uma equipe menor ou uma equipe que não tem realmente seus artefatos consumidos por muitas outras áreas, esta pode ser uma solução melhor porque há muito menos versões para gerenciar. Você só precisa se certificar de que está se comunicando claramente com sua equipe para que todos saibam o que está acontecendo.
Postagens recentes.
GitHub Repos.
Atualização do status. @klieber no GitHub.
Direitos autorais e cópia; 2018 Kyle Lieber - Licença - Desenvolvido pelo tema Hugo e Hugo-Octopress.
7 Compreendendo os números das versões Maven.
Em um ambiente Maven, é muito importante entender o uso de números de versão. Uma estratégia bem pensada pode simplificar muito sua carga de trabalho de gerenciamento de dependências. Este capítulo apresenta conceitos importantes sobre como os números de versão funcionam no Maven em geral e também alguns detalhes específicos de como os artefatos fornecidos pela Oracle usam números de versão e como você deve usá-los quando se refere a artefatos da Oracle.
Este capítulo inclui as seguintes seções:
7.1 Como os números das versões funcionam em Maven.
O esquema de versão do Maven usa os seguintes padrões:
Todas as versões com um qualificador são anteriores à mesma versão sem um qualificador (versão de lançamento).
1.2-beta-2 é mais antigo do que 1.2.
Versões idênticas com diferentes campos de qualificação são comparadas usando a comparação básica de cordas.
1.2-beta-2 é mais recente do que 1.2-alfa-6.
Se você não seguir os padrões de versão do Maven no seu esquema de versão do projeto, então, para comparação de versões, o Maven interpreta toda a versão como uma seqüência de caracteres simples. O Maven e seus plug-ins principais utilizam a comparação de versões para várias tarefas, o mais importante, o processo de lançamento.
Se você usar um esquema de versão não padronizado, a versão do Maven e os objetivos do plug-in de versão podem não render os resultados esperados. Como a comparação básica da string é realizada em versões não padronizadas, a comparação da versão calcula a ordem das versões incorretamente em alguns casos.
Por exemplo, Maven organiza a lista de versões da seguinte maneira:
A versão 1.0.9.3 deve vir antes de 1.0.10.1 e 1.0.10.2, mas o quarto campo inesperado (.3) forçou o Maven a avaliar a versão como uma string.
Um exemplo desse efeito no Maven é encontrado no plugin Maven Versions. O plug-in Maven Versions fornece metas para verificar suas dependências de projetos de moeda de maneiras diferentes. Um objetivo útil é as versões: dependency-updates-report. As versões: dependency-updates-report goal examina a hierarquia de dependência de um projeto e relata quais lançamentos mais recentes disponíveis. Quando você está coordenando uma versão grande, esse objetivo pode ajudá-lo a encontrar referências obsoletas na configuração de dependências. Se Maven identifica incorretamente uma versão mais recente, também é relatado incorretamente no plug-in. Dada a seqüência de exemplo anterior, se sua referência atual fosse 1.0.10.2, o plug-in relataria 1.0.9.3 como uma versão mais recente.
A resolução da versão também é muito importante se você pretende usar intervalos de versão em suas referências de dependência. Consulte a Seção 7.3 para obter informações sobre as mudanças de versão.
7.2 O Qualificador SNAPSHOT.
Maven trata o diferencial SNAPSHOT de forma diferente de todos os outros. Se um número de versão for seguido pelo - SNAPSHOT, Maven considera que a versão "ainda não liberada" da MajorVersion, MinorVersion ou IncrementalVersion associada.
Em um ambiente de integração contínua, a versão SNAPSHOT desempenha um papel vital em manter a integração integrada atualizada, minimizando a quantidade de reconstrução necessária para cada etapa de integração.
As referências de versão do SNAPSHOT permitem ao Maven buscar a instância implantada mais recentemente da dependência SNAPSHOT em um tempo de compilação dependente do projeto. Observe que o SNAPSHOT muda constantemente. Sempre que um agente implanta o artefato, ele é atualizado no repositório compartilhado. A dependência SNAPSHOT é reabastecida, na máquina de um desenvolvedor ou é atualizada em cada compilação. Isso garante que as dependências sejam atualizadas e integradas com as últimas alterações sem a necessidade de alterações na configuração de referência de dependência do projeto.
Geralmente, apenas o SNAPSHOT implementado mais recentemente, para uma versão específica de um artefato é mantido no repositório de artefatos. Embora o repositório possa ser configurado para manter um arquivo rolado com uma série das implementações mais recentes de um artefato dado, as instâncias antigas geralmente são usadas apenas para fins de solução de problemas e não desempenham um papel na integração.
Os servidores de compilação contínua que incluem a capacidade de definir e executar um trabalho com base em um projeto Maven, como Hudson, podem ser configurados para reconhecer quando um artefato SNAPSHOT é atualizado e, em seguida, reconstruir projetos que tenham uma dependência do artefato atualizado.
Por exemplo, uma configuração de compilação Hudson que mapeia para um modelo de objeto de projeto Maven possui uma dependência SNAPSHOT. Hudson verifica periodicamente o repositório de artefatos para as atualizações do SNAPSHOT. Quando detecta a atualização da dependência do projeto, ele desencadeia uma nova compilação do projeto para garantir que a integração seja realizada com a versão mais recente da dependência. Se outros projetos tiverem uma dependência desse projeto, eles também são reconstruídos com dependências atualizadas.
7.3 Referências do intervalo de versão.
O Maven permite que você especifique um intervalo de versões aceitáveis para serem usadas como dependências. A Tabela 7-1 mostra um intervalo de especificações de versão:
Tabela 7-1 Referências de alcance de versão.
Em geral, significa 1.0 ou uma versão posterior, se 1.0 não estiver disponível.
Vários plug-ins do Maven podem interpretar isso de forma diferente, por isso é mais seguro usar uma das outras opções mais específicas.
Vários conjuntos são separados por uma vírgula.
Isso exclui 1.1 se for conhecido não trabalhar em combinação com a biblioteca.
Quando Maven encontra múltiplas partidas para uma referência de versão, ela usa a versão mais parecida. Geralmente, as referências de versão devem ser tão específicas quanto necessário para que Maven seja livre para escolher uma nova versão de dependências quando apropriado, mas sabe quando uma versão específica deve ser usada. Isso permite que o Maven escolha a versão mais apropriada nos casos em que uma dependência é especificada em diferentes pontos do gráfico de dependência transitiva, com diferentes versões. Quando um conflito como esse ocorre, Maven escolhe a versão mais alta de todas as referências.
Dada a opção de usar os intervalos de versão, você pode se perguntar se ainda há utilidade ao usar as versões do SNAPSHOT. Embora você possa obter alguns dos mesmos resultados usando uma expressão de intervalo de versão, um SNAPSHOT funciona melhor em um sistema de compilação contínua pelas seguintes razões:
Os gerentes de repositório de artefatos Maven lidam com SNAPSHOTs de forma mais eficiente do que os próximos intervalos de versões. Como um único artefato pode ser implantado várias vezes em um dia, o número de instâncias únicas mantidas pelo repositório pode aumentar muito rapidamente.
As versões de lançamento sem SNAPSHOT devem ser mantidas indefinidamente. Se você está constantemente lançando uma nova versão e incrementando o número de compilação ou a versão, os requisitos de armazenamento podem rapidamente tornar-se impossíveis de gerenciar. Os gerentes de repositório são projetados para descartar INSTANTÂNEOS mais antigos para abrir espaço para novas instâncias, portanto a quantidade de armazenamento necessária permanece constante.
Os SNAPSHOTs também são reconhecidos pelo processo de lançamento de Maven e Maven, que oferece alguns benefícios ao executar uma versão de lançamento.
7.4 Compreendendo os números das versões Maven em artefatos fornecidos pela Oracle.
Os dois cenários importantes em que os números de versão Maven são usados nos artefatos fornecidos pela Oracle são os seguintes:
Nas coordenadas Maven do artefato, isto é, no projeto. Versão do POM do artefato.
Na seção de dependência de POMs para se referir a outros artefatos.
Esta seção fornece detalhes sobre como os números de versão são definidos para os artefatos da Oracle em ambos os cenários.
7.4.1 Números de versão nas coordenadas Maven.
O número de versão do artefato definido no arquivo POM é o mesmo que o número de versão do produto lançado, por exemplo 12.1.2.0.0, expresso usando cinco dígitos, conforme descrito a seguir:
x. x.x é o número da versão de lançamento, por exemplo, 12.1.2.
y é o número PatchSet, por exemplo, 0,1,2,3, & hellip; sem zeros avançados.
z é o número do Patch Bundle, por exemplo 0,1,2,3, & hellip; sem zeros avançados.
Os períodos e hifens são literais.
Os números de versão dos artefatos (conforme especificado em project. version no POM) usam um formato diferente dos intervalos de número de versão usados em dependências (conforme especificado em project. dependencies. dependency. version no POM).
O número da versão de versão dos componentes pertencentes à Oracle não muda por um patch único. O número da versão de versão muda com uma versão e sempre corresponde ao lançamento, mesmo que o componente não tenha sido alterado da versão anterior.
O PatchSet (quarta posição) muda quando você aplica um PatchSet. O Patch do Bundle (quinta posição) muda quando você aplica um Pacote Bundle, Atualização do Conjunto de Patch ou equivalente (o nome desse tipo de patch varia de produto para produto).
Seguem-se os exemplos de números de versão válidos:
7.4.2 Variações de número de versão em dependências.
Os dois cenários importantes onde as dependências em artefatos Maven fornecidos pela Oracle são especificados são os seguintes:
Dentro dos arquivos POM de artefatos que fazem parte do produto Oracle.
Dentro de arquivos POM que você inclui em seus próprios projetos.
O intervalo de números de versão deve ser especificado em ambos os cenários. Esta seção descreve como os intervalos de números de versão são especificados em artefatos fornecidos pela Oracle e quando você está declarando uma dependência em um artefato fornecido pela Oracle.
Ao especificar dependências em outros artefatos, a sintaxe correta mais específica deve ser usada para garantir que a definição não permita a utilização de uma versão incorreta ou inadequada da dependência.
x. x.x é o número da versão de lançamento, por exemplo, 12.1.2.
y. y.y é o próximo número de versão de lançamento possível, por exemplo, 12.1.3.
Suportes, períodos, comandos e parênteses são literais.
Um exemplo da maneira correta de especificar uma dependência é o seguinte:
Como mostra a Tabela 7-1, o exemplo anterior significa que a versão mais recente disponível é 12.1.2 ou superior, mas inferior a 12.1.3.
O esquema de número de versão usado por artefatos fornecidos pela Oracle garante a classificação correta de números de versão, por exemplo, o Maven resolverá as seguintes versões na ordem mostrada (do mais antigo ao mais novo):
12.1.2-0-0, 12.1.2-0-1, 12.1.2-0-2, 12.1.2-0-10, 12.1.2-1-0, 12.1.2-1-1, 12.1. 2-1-2, 12.1.2-1-10, 12.1.2-0-0, 12.1.3-0-0.
Se for necessário especificar uma dependência que dependa de um determinado PatchSet ou Bundle Patch, por exemplo, quando uma nova API é introduzida, você deve incluir o quarto ou o quarto e o quinto dígitos, respectivamente.
No comments:
Post a Comment