Obter através da App Store Leia esta publicação em nosso aplicativo!
Uma boa estratégia para implementar um sistema de versão.
Eu tenho lutado com o software de versão por um tempo agora. Eu não estou falando sobre uma convenção de nomenclatura, estou falando sobre como realmente aplicar uma versão em um sistema de compilação até o final de uma versão.
Eu geralmente uso major. minor. maintenance - [release type], ou seja, 1.0.2-rc1.
O problema é gerenciar o número da versão. Eu tentei muitas maneiras (colando-o em um arquivo de compilação, um arquivo de propriedades, um banco de dados, etc., etc.), mas não encontrei nada que realmente funcione bem.
Pergunto-me se alguém tem boas ideias sobre isso. Além disso, perguntando-se como as pessoas lidam com a liberação de uma versão. ou seja, se eu liberar / implantar a versão 1.0.0-rc1, os erros encontrados nesta versão, então, faça o login no 1.0.0 (a próxima versão de produção).
A Microsoft usa & lt; major & gt;. & Lt; minor & gt;. & Lt; patch & gt; - & lt; build number & gt; (ou uma variação).
Eu gosto de usar & lt; major & gt;. & Lt; minor & gt;. & Lt; buildnumber & gt;
Onde eu estou trabalhando, usamos o sistema Maven: artefato [-major-menor-revisão] [- INSTANTÂNEO] que nos permite desenvolver versões "em andamento" que mudam em um momento de aviso (SNAPSHOT) e aqueles que foram lançados formalmente . Alguns exemplos são:
-services-1.0.0-SNAPSHOT. jar - web-2.3.11.war crm-2.5.0.ear.
Se tiver SNAPSHOT nele, não passou o conjunto completo de testes ou é apenas uma experiência de desenvolvedor. Se não tiver o SNAPSHOT, é um candidato à liberação. Nós mantemos um repositório de candidatos de lançamento e o mais recente é enviado para implantação uma vez que os testadores estão felizes com ele.
Tudo isso pode ser gerenciado com algumas entradas simples em um arquivo de compilação sob o Maven. Veja o tutorial Maven2.
Este é provavelmente um post morto agora, mas vou adicionar meus dois centavos de qualquer maneira. Eu sou de opinião que os números de compilação deveriam significar algo para todos os que vêem isso. Então eu pessoalmente acho que esta é uma boa maneira de nomear versões:
major. minor. patch. revision - e. 1.1.4.2342.
Os números principais / menores são bastante auto-explicativos. Mas, na perspectiva do terceiro número, ainda precisa significar algo para o cliente. Lancei esta nova versão para você, Sr. Cliente, mas não valia a pena um novo número menor, já que acabamos de corrigir alguns erros. Então aumentamos o número do patch.
O 4º número geralmente significa absolutamente nada para o cliente, então você também pode torná-lo útil para você e para qualquer outra pessoa da sua empresa que o veja. Então, para nós, esse número é o número de revisão SVN. Ele nos diz exatamente qual revisão foi responsável por essa versão para que possamos retirá-la a qualquer momento para recriá-la. O código de ramificação obviamente obtém isso também, mas não para 100% de certeza.
Além disso, outra vantagem com um número de versão totalmente numérico é que ele se integra facilmente em quase todos os sistemas de compilação contínua.
De qualquer forma, são meus dois centavos.
+1 na solução Jira / Bamboo. A única informação adicional sobre a compilação que eu incluíria (para meus propósitos) é a versão do Subversion, embora a operação de marcação seja 80% do que eu quero.
A manutenção manual das informações de versão / versão é uma dor real. Deixar o JIRA dirigi-lo é uma ótima idéia.
Na pergunta final, sobre onde os erros / defeitos são registrados e liberando uma versão:
O defeito / Problema é registrado contra o lançamento onde ele aparece. Um defeito no 1.0.0-rc1 é registrado contra 1.0.0-rc1 A JIRA (ou talvez adicionamos) um campo 'Fix-For' que teria a versão planejada, neste caso 1.0.0 Se o defeito / problema for suficientemente grave, pode ser necessário adicionar outra versão 'rc'. O lançamento é feito quando não há defeitos / problemas críticos pendentes eo cliente (ou gerenciamento) concorda que quaisquer problemas remanescentes podem ser diferidos.
A beleza de gerenciar isso através do JIRA é que a adição de lançamentos, geração de logs de mudanças, etc. é automatizada bastante bem.
Nós também usamos & lt; major & gt;. & Lt; minor & gt;. & Lt; buildnumber & gt; e nós gerenciamos isso com CruiseControl / () no nosso servidor de compilação. E use Wix e CruiseControl Config para gerenciar os principais números menores - ainda assim incrementar esses com a mão - mas o número da compilação acontece automaticamente quando no servidor de compilação. Você poderia configurar uma regra de um incremento de maior / menor automaticamente também. Eu acredito - nós simplesmente gostamos de fazer isso manualmente para que seja preciso um pensamento consciente por um dev quando é hora de nomear um nível de lançamento particular.
Major e Menor são definidos por nós, incrementando-os manualmente como acharmos adequados.
BuildDateNumber é o número de meses desde o início do projeto multiplicado por 100, mais o número do dia do mês atual.
DailyBuildNumber é incrementado para cada compilação após a meia-noite a cada dia, começando em zero.
Por exemplo. 4ª versão da versão 5.2 em 10 de julho, onde o projeto começou 1 de janeiro desse ano, teria o número da versão.
Isso é tudo calculado para nós pela tarefa Versão em Nant.
Isso mantém os números de versão únicos e também nos permite calcular rapidamente quando uma instalação foi criada.
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; 2016 Kyle Lieber - Licença - Desenvolvido pelo tema Hugo e Hugo-Octopress.
No comments:
Post a Comment