Agenda Gerência de Configuração de Software Vamos entender o Problema? Quais os problemas? Gerência de Configuração Marcos Dósea dosea@ufs.br Entender os problemas... Quais os problemas? Problema 1) Duplicidade de Trabalho Problema 2) Trabalhos sobrepostos Problema 3) Perda de trabalho Problema 4) Histórico de Mudanças Problema 5) Versão inconsistente P1) Duplicidade de Trabalho O mesmo trabalho é realizado por mais de um desenvolvedor. Ex: Classe GerenciaCalculosCusto Torna-se mais difícil de controlar quando a solução é armazenada de forma distinta. Ex: pastas calculos e pasta custo Quem foi o maluco que mandou vocês realizarem o trabalho? P2) Trabalhos Sobrepostos Usando um repositório compartilhado é gravada apenas as alterações do último desenvolvedor. Ex: Classe GerenciaCalculosCusto Problema pode ser maior quando a implementação correta é sobreposta pela implementação errada. 1
P3) Perda de Trabalho Imagine agora se houve implementações diferentes entre dois desenvolvedores. Um dos trabalhos será perdido. Terá o trabalho garantindo apenas aquele que salvar por último os seus trabalhos. P4) Histórico de Mudanças Quem implementou o método errado? Quem foi o responsável por dar 20% de desconto no preço de atacado? Quem foi o responsável por dar 10% de desconto no preço de atacado? Quem foi o maluco que ordenou que vocês fizessem isso? Quero que retorne com a implementação anterior da classe! P5) Versão Inconsistente Como resolver esses problemas? A evolução das classes deixa a sistema insconsistente até que uma nova bateria de testes seja realizada. E se ocorrer um erro grave? Como recuperar a última versão estável do sistema e realizar uma correção urgente, sem atrapalhar a evolução do sistema? Solução Trivial Solução Trivial Repositório Compartilhado Desenvolvedor A Desenvolvedor B Programa de A A1 A2 A3 Componente Compartilhado Programa de B B1 B2 B3 2
A Solução Gerência de Configuração É a arte de identificar, organizar e controlar mudanças no software que está sendo construído. O objetivo é maximizar a produtividade pela minimização de erros (Pressman, 2002). Gerência de Configuração Onde a GCM será utilizada? É o desenvolvimento e uso de padrões e procedimentos para o gerenciamento de sistemas de software em desenvolvimento. Define como registrar mudanças e relacioná-las a diferentes versões do sistema (Sommerville, 2007). Modelo de Negócio Requisitos Artefatos de Gerenciamento Modelos Análise Processo de Desenvolvimento de Software Testes Modelos Projeto Código Fonte Onde a GCM será utilizada? Por que GCM? Modelo de Negócio Requisitos Artefatos de Gerenciamento Modelos Análise Processo de Desenvolvimento Mudanças de Software Testes Modelos Projeto Código Fonte Evolução do software => MUDANÇAS 75% do custo total do ciclo de vida do software é com manutenção. 20% do tempo para consertar erros. 80% do tempo para modificações nos requisitos: Requisitos funcionais Regras de negócio Reengenharia da aplicação. 3
Gerência de Configuração Gerência do Configuração no MPS.Br Considerada muitas vezes como etapa do gerenciamento de qualidade: Sistema liberado é verificado pela equipe de GQ. Essencial usar padrões para certificação da qualidade. Ex: Padrão para Plano de GC seguindo a norma IEEE 828-1998. Gerência de Configuração Gerenciamento de Mudanças Gerenciamento de Versões Gerenciamento de Builds Gerência de Configuração Gerenciamento de Mudanças P1) Duplicidade de Trabalho Gerenciamento de Versões Gerenciamento de Builds Gerenciamento de Mudanças Controla o processo de solicitação de mudanças, análise de custo e benefício das mudanças, aprovação e rastreabilidade de quais componentes foram alterados. Gerenciamento de Mudanças Change Request Form (CRF) Exemplo: 4
Algumas Ferramentas Redmine Redmine Bugzilla Jira Trac IBM Rational ClearQuest Bugzilla Processo de Gerenciamento de Mudanças Exemplo Estados de uma Solicitação de Mudança Exemplo Vamos solicitar uma Mudança? http://code.google.com/p/projeto-es-ufs/ 5
Atividade de Sala Crie uma mudança para seu parceiro: Defeito reportado pelo desenvolvedor Defeito reportado pelo usuário Nova funcionalidade Simule o atendimento dessas mudanças. Gerência de Configuração Gerenciamento de Mudanças Gerenciamento de Versões Gerenciamento de Builds Gerenciamento de Versões Processo de identificar e manter a rastreabilidade das versões de um sistema, objetivando recuperar, quando solicitado, uma versão que implementa um determinando conjunto de funcionalidades. O Repositório É a base para utilização de um sistema de controle de versão. Cada cliente possui uma cópia de trabalho do repositório. Alguns Repositórios CVS Subversion (SVN) Mercurial IBM Rational ClearCase Microsoft Visual Source Safe. VisualSVN Server O Repositório 6
VisualSVN Server O Repositório Explorar as configurações do VisualSVN Gerenciamento de Versões Passo 1) Definir o Repositório Local (físico e lógico) onde os itens de um sistema são guardados Pode conter diversas versões do sistema Utiliza mecanismos de controle de acesso Definir o Repositório Layout do Repositório trunk: linha principal do desenvolvimento branches: cópias divergentes da linha base do desenvolvimento. tags: fotografias de versões estáveis do sistema. Repositório Repositório Definir o Repositório Exemplo: code.google.com com SVN Definir o Repositório Exemplo: Visual SVN 7
Definir o Repositório Exemplo: Visual SVN Definir o Repositório Exemplo: Visual SVN Defina um repositório do seu grupo Utilize a função browse do TortoiseSVN para acessar os arquivos do repositório criado pelo colega. Gerência de Configuração Gerenciamento de Mudanças Gerenciamento de Versões Gerenciamento de Builds Gerenciamento de Versões Processo de identificar e manter a rastreabilidade das versões de um sistema, objetivando recuperar, quando solicitado, uma versão que implementa um determinando conjunto de funcionalidades. O Repositório É a base para utilização de um sistema de controle de versão. Cada cliente possui uma cópia de trabalho do repositório. 8
Conceitos Básicos Item de Configuração Conjunto de itens de hardware/software vistos como uma entidade única para fins de gerência de configuração. Conceitos Básicos Configuração do Software Toda informação produzida como parte do processo de desenvolvimento de software. Dados Código Fonte Dados Documentos Código Fonte Documentos Como Operar com o Repositório? Check-in e Check-out Passo 2) Executar Operações do Cliente Ckeck-in - Merge Ckeck-out - Marcar Tag Lock - Branches Desenvolvedor Repositório Como Operar com o Repositório? Operação 1) Check-out Recupera a (última) versão de um item de configuração guardada no repositório. Escrita: obtém o lock do item e cria uma cópia para edição no cliente. Leitura: cria uma cópia apenas para leitura no cliente. Check-out Como Operar com o Repositório? Operação 2) Check-in Ação de inserir/atualizar um item de configuração no repositório Verifica o lock do item de configuração, e caso seja possível, incrementa a versão do item. Check-in cliente Repositório cliente Repositório 9
Gerenciamento de Versões Operação 2) Check-in Cada check-in no repositório cria uma nova revisão (baseline) do mesmo. Faça o Check-out do seu repositório. Qual a revisão que você está trabalhando? Crie 1 arquivo na pasta trunk e faça o checkin. Faça check-out e visualize a revisão. Crie agora mais dois novos arquivo na pasta trunk e faça o check-in. Visualize agora as revisões dos três arquivos criados. Baselines Revisão é um tipo de baseline item fluxo de desenvolvimento Como Operar com o Repositório? Operação 3) Lock Resolve a Atualização Simultânea Garante que apenas o usuário que detém o lock pode alterar o arquivo Problema: serializa o trabalho dos desenvolvedores tempo Como Operar com o Repositório? Operação 4) Merge Unificação de diferentes versões de um mesmo item de configuração Integração dos itens de configuração de um branch com os itens de configuração do fluxo principal Mesmo com o uso de ferramentas, em vários casos há necessidade de intervenção humana Repositório Tradicional Relembrando o problema... 10
Soluções dos Repositórios Política Pessimista (Lock-Modify-Unlock) Política Otimista (Copy-Modify-Merge) Política Pessimista Enfatiza o check-out reservado Bloqueia o(s) item(ns) de configuração Inibe o paralelismo Política Pessimista Usando o TortoiseSVN Atividade de Sala Faça o bloqueio de um arquivo armazenado no repositório. Solicite ao seu colega que tente alterar esse arquivo e depois gravar no repositório. Ele conseguiu? Não esqueça de desbloquear o arquivo. Política Pessimista Problemas Pode causar problemas administrativos, quando um lock não é liberado. Pode causar serialização de trabalho desnecessária, por exemplo, editar o mesmo arquivo mas em locais diferentes. Causa um falso senso de segurança, por exemplos, arquivos dependentes que são editados por desenvolvedores distintos podem não trabalhar juntos. 11
Soluções dos Repositórios Política Pessimista (Lock-Modify-Unlock) Política Otimista (Copy-Modify-Merge) Política Otimista Assume que a quantidade de conflitos é naturalmente baixa. É mais fácil e produtivo tratar cada conflito individualmente. Um conflito ocorre quando a mesma linha ou região do arquivo é modificada. A junção (merge) é automática na maioria dos casos e manual quando ocorrem conflitos. Política Otimista Crie um arquivo com um texto qualquer na linha 1 e 3. Grave o arquivo no repositório. Altere o arquivo e insira um texto na linha 5 e ao mesmo tempo peça a seu colega para baixar o arquivo do repositório e colocar um texto na linha 4 Tentem gravar o arquivo no repositório. O que aconteceu? Baixem a nova versão do arquivo. Agora insira textos diferentes na linha 2, cada um na sua cópia de trabalho. Tentem gravar o arquivo. O que aconteceu? Qual política utilizar? Política Pessimista Artefatos não textuais (imagem, vídeo, etc) Artefatos onde a junção manual é complexa. Política Otimista Nas demais situações. 12
Ciclo de Trabalho Típico 1) Atualizar cópia de trabalho 2) Realizar as mudanças 3) Revisar as mudanças 4) Consertar os erros 5) Resolver Conflitos 6) Publicar mudanças (commit) Usando o sistema de controle de versão implemente as classes passadas na primeira aula. Política Pessimista Política Otimista Ciclo de Trabalho Típico 1) Atualizar cópia de trabalho 2) Realizar as mudanças 3) Revisar as mudanças 4) Consertar os erros 5) Resolver Conflitos 6) Publicar mudanças (commit) Criem o arquivo GerenciadorAluno.java Crie os métodos: void inserir(aluno a); void consultar(aluno a); Ao mesmo tempo peça ao colega para criar os métodos: void remover(string matricula) void alterar(aluno a) Gravem no repositório. 13
Excluindo e Renomeando Exclusão com o TortoiseSVN A exclusão de um arquivo/pasta da cópia de trabalho não implica na exclusão do mesmo no repositório. O mesmo acontece para renomeação. O SVN possui um comando delete e rename que devem ser executados no arquivo. Em seguida deve ser feita a gravação (commit) no repositório. Renomear com o TortoiseSVN Dever de Sala Faça a exclusão de um arquivo do repositório. Renomeie um arquivo do repositório. Ignorando Arquivos Ignorando com o TortoiseSVN Alguns arquivos podem ser marcados para serem ignorados pelo sistema de versionamento. Isso é comum para arquivos de compilação ou arquivos temporários. 14
Dever de Sala Baselines Crie um arquivo na cópia de trabalho Marque esse arquivo para ser ignorado pelo sistema de versionamento. Baselines São marcos no versionamento dos artefatos. Representam conjuntos de itens de configuração que foram formalmente aprovados. Baselines são marcadas a partir de revisões do repositório. Uma baseline é identificada através de uma tag. Baselines Versão do Sistema: É uma instância do sistema que difere, de alguma maneira, de outras instâncias. Release do Sistema: Versão do sistema distribuída aos clientes. Gerenciamento de Versões Tags no TortoiseSVN Operação 5) Marcar Tag São rótulos associados a um snapshot do repositório num determinado momento. Um tag referencia um ou mais arquivos em um ou mais diretórios Usadas normalmente para denominar uma versão do projeto ou release. Sistema de Biblioteca 1.0 1.1 2.0 15
Tags no TortoiseSVN Marque uma tag da versão atual do projeto. Faça novas alterações na mainline. Marque uma nova tag do projeto. Branches É uma linha de desenvolvimento independente de outras linhas mas que compartilha um histórico. Deve ser criado quando múltiplas necessidades precisam ser atendidas. Branches Fazer um branche é simplesmente criar uma cópia de uma revisão. Apesar de manter o histórico o branche pode evoluir de forma indepentente. Gerenciamento de Versões Braches no TortoiseSVN Operação 6) Criar Branch Criação de um fluxo alternativo para atualização de versões de itens de configuração Devem existir regras bem definidas para criação de branches Por que e quando devem ser criados? Quais os passos? Quando retornar ao fluxo principal? 16
Braches no TortoiseSVN Atividade de Sala Crie um branche da sua linha de desenvolvimento principal. Reintegrando um Branche Reintegrando Branches É possível reintegrar branches à sua linha principal através de uma operação de merge. Pode ser necessário quando uma grande alteração não deve atrapalhar a linha principal do desenvolvimento. Reintegrando Branches Reintegrando Branches 17
Atualizando um Branche Atualizando Branches Para que as modificações de um branche não fiquem muito distantes da linha principal pode-se fazer sua atualização. A atualização de um branche também é feita através da operação de merge. Atualiazando Branches Atualiazando Branches Criar um novo branche a partir do trunk. Criar um novo arquivo no trunk. Criar um novo arquivo no branche. Alterar um mesmo arquivo existente no trunk e no branche criado. Atualizar o branche a partir do trunk. Reintegrar o branche ao trunk. Referências Sommerville, Ian. Engenharia de Software. 8a edição. Addison Wesley. Pressman R. Engenharia de Software. 6a edição. McGraw-Hill. Cristine Dantas. Gerência de Configuração de Software. Revista de Engenharia de Software. Edição 2. Disponível no link. Acesso em Março 2011. 18