Política de SCM  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Oi,

Estou definindo uma nova política de SCM e me baseando um pouco na experiência passada e em boas práticas que encontrei. Alguém conhece bons documentos de SCM? Pode comentar a prática adotada na sua empresa apra discutirmos?

Basicamente estou adotando regras simples de um branch por release, tags a vontade.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Mauricio Linhares
Moderador
[Avatar]

Membro desde: 09/01/2005 23:28:22
Mensagens: 3717
Localização: João Pessoa, Paraíba - Brasil
Offline

Será que não seria melhor uma tag por release não?

Acho que branchs são coisas pra se utilizar apenas em caso de experimentação ou mudanças muito grandes na estrutura do projeto.

Meu blog sobre desenvolvimento | My Last.fm | @mauriciojr

Screencast de Introdução a linguagem Objective-C
[WWW]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Eu estava pensando inicialmente em tags por relase e branches quando efetivamente for feita alguma manutenção, mas não vi muita utilidade em não gerar logo um branch.

O problema em apenas taggear é que você *vai* ter que dar manutenção no release antes da próxima versão ser lançada e se você não mantêm branches sua base de código se mistura.

Tipo:

Head---TAG_V1-------------------TAG_V2--->

Se eu preciso alterar algo em V1 para manutenção enquanto está sendo desenvolvido V2 eu não consigo fazer uma nova versão (1.1) sem ter tudo que foi desenvolvido até então para V2, o que não é desejável.

Com vários branches:


(a tentativa de desenho ficou horrível)
Eu tenho acesso ao código de V1 sem interferir no head enquanto V2 é desenvolvido.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
oyama
Virtual Machine Man

Membro desde: 19/04/2005 10:11:09
Mensagens: 572
Offline

O problema de trabalhar com 1 branch para cada versão é quando a coisa for convergir (merge).

Já passamos por este tipo de discussão na nossa empresa e o ideal for definir mais de uma politica, dependendo do tipo de projeto:
  • Default: usar apenas o HEAD e tags para gerar as versões. Excepcionalmente, abre-se um branch para lançar uma versão de manutenção no caso de não pode usar o proprio HEAD para isto (já foram comiitadas modificações que não foram testadas ou não podem ir na versão anterior). A modificação aplicada no branch deve "rapidamente" ser aplicada na linha de desenvolvimento da próxima versão. Esta política supõem que não há manutenção em versões passadas, apenas na versão em produção (stable).

  • Várias versões para manutenção: ai seria o caso de ter um branch para cada versão. Teria que existir politicas de convergencia de código (por tempo ou por feature) para que a versão mais recente também tenha a modificação do branch aplicada. Isto pode ser extremamente complexo dependendo do software de controle de versão utilizado. O CVS tem poucos recursos para uma boa administração disto. Dependendo do tamanho da equipe, vale a pena "burocratizar" o processo, criando mecanismos de controle próprio (criar scipts que verificam permissões de commits e depenencias de versões).


  • Eu tinha um artigo publicado na Dr. Dobb's a muito tempo que explanava sobre a utilização do CVS para SCM. Se eu achar o artigo eu posto aqui.

    Espero ter ajudado.
    pcalcado
    Moderador
    [Avatar]

    Membro desde: 08/03/2004 17:19:35
    Mensagens: 5174
    Localização: Sydney - Australia
    Offline

    Hm.. eu não consigo pensar em como um projeto com mais de um release consiga sobreviver à primeira opção.

    A política de merge é simples: completou a tarefa (provavelmente um bugfix) em um branch faz merge em todos os que também são afetados imediatamente. A tarefa só está concluída após os merges.

    Fazer merge é chato e trabalhoso mas se você contar que não fazer é mortal, então não tem jeito.

    Phillip Calçado "Shoes"
    http://fragmental.tw/
    http://blog.fragmental.com.br/
    "It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
    [Email] [WWW] [Yahoo!] [MSN]
    Fabricio Cozer Martins
    GUJ Ranger
    [Avatar]

    Membro desde: 08/05/2004 10:22:03
    Mensagens: 935
    Localização: Salvador/Brasil
    Offline

    o chato é fazer merge de hora em hora, no mais tá blza

    Fabrício Cozer Martins
    Analista de Sistemas
    Bacharel em Ciência da Computação da UFBa
    Sun Certified Programmer for Java 2 Platform 1.4
    Sun Certified Web Component Developer for J2EE 1.4
    [MSN] [ICQ]
    oyama
    Virtual Machine Man

    Membro desde: 19/04/2005 10:11:09
    Mensagens: 572
    Offline

    pcalcado wrote:Hm.. eu não consigo pensar em como um projeto com mais de um release consiga sobreviver à primeira opção.


    Aqui nós conseguimos sobreviver com esta politica na maioria dos projetos
    Boas praticas para isto dar certo:
  • Periodos relativamente curtos entre uma versão/release e outra. Trabalhamos com um periodo de 3 meses.

  • Os clientes terem uma política de ter sempre a versão mais recente em produção. Sei que isto é extremamente difícil, mas usando a política de se deu pau e não está com a última versão, então tem que migrar para a versão mais recente para ter a correção.


  • pcalcado wrote:
    A política de merge é simples: completou a tarefa (provavelmente um bugfix) em um branch faz merge em todos os que também são afetados imediatamente. A tarefa só está concluída após os merges.

    Fazer merge é chato e trabalhoso mas se você contar que não fazer é mortal, então não tem jeito.


    Tentamos isto em um projeto, mas deu muito stress. A maioria dos programadores não realizava a tarefa corretamente e não tinhamos uma boa ferramenta para gerenciarmos isto. Bem, no nosso caso, a experiencia não foi boa.
    pcalcado
    Moderador
    [Avatar]

    Membro desde: 08/03/2004 17:19:35
    Mensagens: 5174
    Localização: Sydney - Australia
    Offline

    oyama wrote:
  • Os clientes terem uma política de ter sempre a versão mais recente em produção. Sei que isto é extremamente difícil, mas usando a política de se deu pau e não está com a última versão, então tem que migrar para a versão mais recente para ter a correção.



  • Isso me lembra um projeto há alguns anos-luz atrás. Tivemos que descompilar os binários apra provar que o sistema em produção não estava na última versão enviada. Passamos então a colocar como uma String no fonte o número da versão, um comando 'strings' do Unix resolvia.

    De qualquer modo, isto não é viável no meu cenário, geralmente o cliente está com uma versão em produção, ahcam um bug. Enquanto aquela está em produção, temos que homologar uma versão com bugfix, isso tudo enquanto no Head estão desenvolvendo a nova versão.


    oyama wrote:
    Tentamos isto em um projeto, mas deu muito stress. A maioria dos programadores não realizava a tarefa corretamente e não tinhamos uma boa ferramenta para gerenciarmos isto. Bem, no nosso caso, a experiencia não foi boa.


    Na última empresa que trabalhei isso era integrado com o processo. Havia um mergeblamer integrado ao Subversion que mandava emails diários com o que não foi integrado, funcionava muito razoavelmente. Além disso, a política do 'se não integrou não fechou a task' motiva porque a pessoa não pode dizer pro gerente que acabou até fazê-lo.

    Claro que no calor da batalha contra um bug as coisas acabam sendo ingonardas mas o mergeblamer sempre lembra ao gerente de configurações que tem gente em dívida.

    Phillip Calçado "Shoes"
    http://fragmental.tw/
    http://blog.fragmental.com.br/
    "It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
    [Email] [WWW] [Yahoo!] [MSN]
    Luca
    Moderador
    [Avatar]

    Membro desde: 06/09/2002 14:30:10
    Mensagens: 5810
    Localização: São Paulo/SP ou Paraty/RJ
    Offline

    Olá

    Para aqueles que como eu acompanham este tópico e boiaram no tal de Merge & Blame que o Phillip falou, aqui um link do no forum do subversion que achei interessante:

    http://svn.haxx.se/users/archive-2004-07/0098.shtml

    Algumas respostas:
    http://svn.haxx.se/users/archive-2004-07/0101.shtml
    http://svn.haxx.se/users/archive-2004-07/0105.shtml

    Philip, qual SCM que está usando? Ainda usa o Perforce?

    []s
    Luca


    Dare Obasanjo (Program Manager at Microsoft)
    "The folks I know from across the industry who have to build large scale Web services on the Web today at Google, Yahoo!, Facebook, Windows Live, Amazon, etc are using RESTful Web services. The only times I encounter someone with good things to say about WS-* is if it is their job to pimp these technologies or they have already "invested" in WS-* and want to defend that investment."


    CEP, JMS, JMX e coisas afins (ou não)
    http://lucabastos.blogspot.com/
    [Email] [WWW]
    pcalcado
    Moderador
    [Avatar]

    Membro desde: 08/03/2004 17:19:35
    Mensagens: 5174
    Localização: Sydney - Australia
    Offline

    Luca wrote:
    Philip, qual SCM que está usando? Ainda usa o Perforce?


    Nada, passei para Subversion em outro projeto e acabo de mudar para uma empresa que já tem CVS para dois projetos anteriores.

    Se dependesse de mim os projetos novos iam pro Subversion mas isso é uma negociação um pouco complexa

    Phillip Calçado "Shoes"
    http://fragmental.tw/
    http://blog.fragmental.com.br/
    "It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
    [Email] [WWW] [Yahoo!] [MSN]
    juzepeleteiro
    Virtual Machine Man

    Membro desde: 19/07/2005 16:01:40
    Mensagens: 583
    Localização: Rio de Janeiro
    Offline

    Só um comentário, tags são estáticas, você não pode modificar uma versão tag. Para isso você têm que criar uma branch aparti dessa tag.

    Exemplo de repositório (usando subversion):



    /trunk é sempre a versão que está sendo produzida (major release, no exemplo seria a 2.0).

    Em branches está, quando necessário, alguma versão que já foi lançada (cópia aparti do /tags) para bugfixes e/ou alguma evolutiva quando necessário. Quando essa versão for finalizada, ela recebera um novo número (no exemplo se houve só correção de bugs 1.1.2, se houve mudança de funcionalidade 1.2) e então é movida para tags.

    O shelves é o espaço que cada participante do projeto tem para seu uso, seja para experimentar alguma coisa, para testar alguma ideia... Dessa forma você inibe o uso de "versões locais" e oferece backup, versionamente e tudo que um scm oferece.

    Eu recomendo o livro " Pragmatic Version Control".

    Outras coisas legais em um SCM é o uso correto das tags de versão, (@version $Id$ no meu caso) e um sistema de alerta.

    Se você usa MSN no trabalho pode configurar o seu SCM para mandar um alerta a cada commit, se não usa (como eu) e o seu SCM gera um RSS com as mudanças (no caso do Subversion, através do WebSVN) instale um programa na maquina de cada desenvolvedor que dar aqueles alerta tipo "Novo Email" só que baseado em RSS. Funciona bem.

    Existem varios desses sistemas de alerta, mas um que está para sair e me parece beeeem legal é o www.touchstonegadget.com

    http://ofert.as - Cupons de desconto
    [Email] [WWW] [MSN]
    cv
    Moderador
    [Avatar]

    Membro desde: 04/04/2003 00:32:12
    Mensagens: 7842
    Localização: São Paulo, SP
    Offline

    Politica de SCM da maioria dos projetos onde eu trabalho aqui na ThoughtWorks eh sempre mais ou menos a mesma: se precisa fazer branch, ta na hora de voltar pra lousa e pensar melhor no assunto e em como estruturar o trabalho.

    Alguns projetos fazem uma tag por iteracao, outros quando um story card eh completado (e passou por aprovacao do cliente). Eu prefiro tag-por-release, mas acabei nunca nem tendo que usar tags, entao tudo bem
    [Email] [WWW] [Yahoo!] [MSN] [ICQ]
    Fabricio Cozer Martins
    GUJ Ranger
    [Avatar]

    Membro desde: 08/05/2004 10:22:03
    Mensagens: 935
    Localização: Salvador/Brasil
    Offline

    cv wrote:Politica de SCM da maioria dos projetos onde eu trabalho aqui na ThoughtWorks eh sempre mais ou menos a mesma: se precisa fazer branch, ta na hora de voltar pra lousa e pensar melhor no assunto e em como estruturar o trabalho.

    Olá ,
    porque você acha que branch não são legais ? Estou tendo essa mesma impressão

    Fabrício Cozer Martins
    Analista de Sistemas
    Bacharel em Ciência da Computação da UFBa
    Sun Certified Programmer for Java 2 Platform 1.4
    Sun Certified Web Component Developer for J2EE 1.4
    [MSN] [ICQ]
    s4nchez
    Virtual Machine Man
    [Avatar]

    Membro desde: 05/06/2006 11:35:55
    Mensagens: 674
    Localização: London, UK
    Offline

    Também sou da visão de que branch é exceção, e não regra.

    Hoje em dia minha equipe segue a seguinte política:

    -Tags sempre que for fechar uma iteração ou release (seguindo um padrão de nomenclatura pré-definido)
    -Tags sempre que o programador não estiver confiante com a alteração que vai fazer e quer criar um "ponto de restauração" no repositório. (incentivamos essa prática pois sentimos que dá maior segurança)
    -Branches quando é preciso corrigir um erro do sistema que já está em produção. Neste caso cria-se o branch na tag do release em questão, faz-se as correções, cria-se uma nova tag de release, publica-se o resultado e faz-se um merge do repositório.


    Ivan Sanchez | coding dojo | blog | twitter
    [WWW]
    s4nchez
    Virtual Machine Man
    [Avatar]

    Membro desde: 05/06/2006 11:35:55
    Mensagens: 674
    Localização: London, UK
    Offline

    pcalcado wrote:

    Isso me lembra um projeto há alguns anos-luz atrás. Tivemos que descompilar os binários apra provar que o sistema em produção não estava na última versão enviada. Passamos então a colocar como uma String no fonte o número da versão, um comando 'strings' do Unix resolvia.



    Resolvemos este problema (e outros) utilizando um arquivo changelog.txt

    Ivan Sanchez | coding dojo | blog | twitter
    [WWW]
     
    Índice dos Fóruns » Arquitetura de Sistemas
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team