Archive for the ‘gerência de configuração de software’ Category

Curso online de Gerência de Configuração de Software com Redmine e Subversion

No Comments »

Estão abertas as inscrições para a próxima turma do novo curso online de Gerência de Configuração de Software com Redmine e Subversion. As aulas serão baseadas em vídeo-conferência e acontecerão das 19 às 21 hs de segunda a sexta, entre os dias 27/02 e 09/03.

O curso aborda o uso das ferramentas para atender às necessidades de Gerência de Configuração de Software. São mais de 60 exercícios práticos guiados por um processo que define um fluxo de trabalho correto de operação das ferramentas. O programa completo se encontra na página do curso. Faça sua reserva online agora mesmo!


Curso online de Gerência de Configuração de Software com Trac e Subversion

1 Comment »

Começa no dia 30 de janeiro a mais nova turma do curso online de GCS com Trac e Subversion. O curso será baseado em vídeo-conferência, com aulas de segunda a sexta, das 19 às 21hs, em total de 20 horas.

Cada aluno terá um repositório próprio do Trac/Subversion, apostila e também recebe uma máquina virtual pré-configurada pronta para uso no projeto de sua equipe.

Veja mais informações na página do curso.

Faça já sua reserva! Aproveite os descontos para duas ou mais inscrições.


Pronus lança Máquina Virtual com Servidor de Aplicação Voltado para Gerência de Configuração de Software

2 Comments »

A Pronus acaba de lançar duas máquinas virtuais prontas para uso, denominadas de PronusBox, contendo servidores de aplicação direcionados à Gerência de Configuração de Software (GCS). Cada PronusBox possui uma ferramenta de controle de mudança e de controle de versão previamente instaladas e configuradas para operarem de modo integrado, conforme diretrizes específicas de GCS.

A primeira PronusBox contém o Trac como controle de mudança e o Subversion como controle de versão. A segunda PronusBox disponível usa o Redmine para controle de mudança e o Subversion e o Mercurial como opções de controle de versão centralizado e distribuído respectivamente.

A proposta é cobrar por cada máquina uma fração do valor em horas técnicas que seriam usadas para a instalação e configuração de um servidor a partir do zero. Com uma estimativa bastante otimista de 60 horas técnicas para a preparação de um servidor equivalente, o preço de cada PronusBox varia entre R$ 300 e R$ 350.  Como promoção de lançamento, neste mês de janeiro, oferecemos um desconto de 28,5% por cada PronusBox. Aproveite!


Servidor de aplicação através de uma máquina virtual (parte 2)

1 Comment »

No artigo anterior, apresentei o caso em que “Roberval” — um típico integrante de uma equipe de administração de redes — executou a tarefa de instalar um servidor de aplicação com Redmine e Mercurial para a equipe de desenvolvimento. Demorou vários dias para terminar e mesmo assim, ainda ficou faltando alguns ajustes.

O desfecho poderia ter sido outro, mais  simples e rápido. O começo seria igual, com Roberval recebendo a incumbência de instalar o servidor com Redmine e Mercurial. Porém, ao invés de preparar um servidor, prefere procurar uma solução pronta. Como os servidores da empresa já usam virtualização, então o ideal seria uma máquina virtual pré-configurada com as aplicações desejadas que pudesse ser baixada, instalada sem maiores dificuldades.

Uma procura rápida no Google com os termos “máquina virtual redmine mercurial” mostra um resultado bastante interessante logo na primeira opção. A especificação da PronusBox (a máquina virtual encontrada) descreve em detalhes a configuração existente e alguns procedimentos administrativos como criação de projetos e backup. Não há dúvida: é essa mesma.

O passo seguinte é conseguir a verba para aquisição.  Como o pedido de instalação já havia sido aprovado, a verba para aquisição da máquina virtual foi liberada sem maiores dificuldades. Além do mais, o preço é irrisório.

O que demorou mais tempo foi baixar os 750 MiB da máquina virtual. Depois disso, conforme esperado, a instalação foi simples e o serviço estava no ar. Ao invés de duas semanas preparando um servidor, tudo pronto em menos de um dia! Chefe contente e  desenvolvedores satisfeitos.

 


Preparação de um servidor de aplicação versus máquinas virtuais com servidores de aplicação prontos para uso (parte 1)

2 Comments »

A virtualização de servidores traz algumas vantagens bastante interessantes:

  1. Otimização dos recursos disponíveis. O mesmo servidor físico pode ser multiplicado em vários servidores virtuais, economizando equipamento e energia.
  2. Independência de plataforma. Uma máquina virtual pode conter um sistema operacional diferente da máquina hospedeira.
  3. Flexibilização através de Máquinas Virtuais. Podem ser instaladas, trocadas, congeladas, salvas e até mesmo adquiridas prontas para uso com facilidade.

A aquisição de uma máquina virtual com um servidor de aplicação costuma ser extremamente viável. Afinal, preparar um servidor de aplicação é trabalhoso e complicado. Entender as aplicações desejadas, descobrir as dependências, pesquisar e testar alternativas de configuração e analisar os resultados é bastante demorado, chegando facilmente a semanas de trabalho.

Uma caso possível (baseado em fatos reais):

“Robervaldo faz parte da equipe de administração de redes de uma empresa. Em uma segunda-feira qualquer, chega ao serviço e recebe a notícia que precisa preparar um servidor com o Redmine e o Mercurial (pra ontem, claro). Sem fazer a menor ideia do que sejam essas aplicações, só lhe resta recorrer ao Google. Descobre que Redmine é uma aplicação web para gerenciamento de projetos feita em Ruby on Rails e que Mercurial é uma ferramenta de controle distribuído de versão. O próximo passo é instalar.

Quase tão ruim quanto não achar nenhuma solução é achar dezenas delas. No site do Redmine existem várias e várias sugestões de como fazer a instalação em diversos sistemas operacionais e versões. Nenhuma dessas receitas é ‘oficial’, feita por membros do projeto; são todas feitas por colaboradores externos com diferentes graus de conhecimento da ferramenta. Algumas receitas estão claramente desatualizadas, mas continuam listadas no site. Outras recomendam passos e pacotes diferentes para instalação. Qual é a melhor maneira? O jeito é experimentar.

Robervaldo instala a versão mais nova do Ruby, mais a versão X do pacote tal e assim por diante. Mas opa! O Redmine na versão Y não funciona com o pacote tal na versão X nem com o Ruby mais atual! E agora? Desinstala tudo e começa de novo? A instalação bagunçou outros aplicativos que estavam instalados antes? Formata, ué.

Tem de escolher um tipo de banco de dados. Mas qual? Postgres? MySql? Sqlite3? Uni-duni-tê…

Passados três dias, depois de aprender que o teste de instalação deve ser feito em uma máquina virtual, usando snapshots, o Redmine parece estar funcionando. A próxima instalação é a do Mercurial.

Parece mais fácil. Poucas opções. Exe ou msi? Precisa ou não do TortoiseHg? Qual Python 2.X? Salamê-minguê…

Ah… não é só instalar, tem de publicar os repositórios pela rede. HTTP? SSH? NFS? Sorvete-colorê…

Uma semana se passou e o chefe em cima, cobrando. Robervaldo anda pelo corredor e os desenvolvedores que esperam o servidor olham torto. A demora deixa todo mundo tão irritado que nem a mulher do café o cumprimenta mais.

Mais dois dias. Acabou? Quase. Falta juntar o Redmine com o Mercurial. Robervaldo encontra um artigo promissor sobre integração dos dois. Epa! De 2009??? Funciona ainda? Outro link para autenticação do Apache pelo MySql. Também de 2009??? Mas e agora, Roberval, se você usou Postgres? Planos par ao fim de semana são cancelados…

Mais três dias e tudo entregue. Fim da história!?!

Epílogo: Duas horas tranquilas depois da entrega do servidor e o telefone toca. Coisa boa não deve ser:

- Roberval, o pessoal quer que o Redmine crie automaticamente os repositórios, precisa também fazer um script de backup e, aproveitando, dá uma olhada em como fazer blá blá blá…”

Mas tudo isso poderia ser mais simples. No próximo artigo, vamos abordar como a aquisição de uma máquina virtual economiza dinheiro e tempo, além de fornecer um servidor tecnicamente mais bem preparado.


Garantindo a amarração de uma revisão a um ticket/tarefa através do script de pre-commit do Subversion

3 Comments »

As duas ferramentas principais para a Gerência de Configuração de Software (GCS) são o controle de mudança e o controle de versão. Resumidamente, uma ferramenta de controle de mudança registra solicitações de mudança no projeto através de tickets ou tarefas. O controle de versão registra a evolução dos arquivos do projeto. Ferramentas populares de controle de mudança são o Trac e o Redmine; de controle de versão,  Subversion, Mercurial e Git.

As ferramentas de controle de mudança até possuem funcionalidades que exibem o histórico e o conteúdo das revisões contidas no controle de versão. Entretanto, para a GCS, o que é realmente necessário é uma amarração entre o pedido de mudança e a revisão em que está implementada e vice-versa, permitindo rastrear a solicitação até sua implementação e o caminho contrário.

No controle de versão, essa ligação é feita no momento da consolidação (commit) através da mensagem de log, onde se registra um padrão tal como “resolve #173″, que indica o ticket finalizado. Do lado do controle de mudança, a amarração correspondente é feita adicionando um comentário ao ticket/tarefa com um padrão parecido —”implementado em [238]” por exemplo —, e depois mudando o estado do ticket/tarefa para ‘fechado’ (ou outro estado, conforme o ciclo de vida definido).

O registro na mensagem de log da consolidação é manual, mas o comentário adicional no ticket pode ser feito automaticamente. No Redmine, por exemplo, ao encontrar o padrão específico na mensagem de log de uma revisão, o ticket associado é fechado imediatamente.

O problema do registro manual na mensagem de consolidação é que um desenvolvedor desatento ou despreparado pode simplesmente não usar o padrão definido. O ideal é que haja algum tipo de validação que pelo menos exija a amarração a um ticket, mas outras checagens podem ser feitas, tais como se o ticket realmente existe, está aberto e pertencente ao autor do commit. No Subversion, essas validações podem ser feitas através de um script de pre-commit.

O script de pre-commit abaixo faz uma validação mínima, exigindo que o padrão referenciando um único ticket ou tarefa exista em toda mensagem de consolidação:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (c) 2011 Pronus Engenharia de Software
# Copyright (c) André Felipe Dias
# Licensed under the MIT license:
# http://www.opensource.org/licenses/mit-license.php
# ----------------------------------------------------------------------------------

import re
import sys
from  subprocess import Popen, PIPE

repos_path = sys.argv[1]
transaction = sys.argv[2]
svnlook = '/usr/bin/svnlook'
log = Popen(
           (svnlook, 'log', '-t', transaction, repos_path),
           stdout=PIPE, stderr=PIPE,
           stdin=PIPE
           ).communicate()[0].lower().strip()
padrao = re.findall('(?:ref|refs|resolve|implementa)\s+(#[0-9]+)', log)
tickets = re.findall('#\d+', log)
if not padrao:
    sys.exit(''' Padrao nao encontrado. Sao mensagens de log validas:
 ref #123
 resolve #123
 implementa #123''')
elif len(tickets) > 1:
    sys.exit('So deve haver referencia a um ticket/tarefa por consolidacao')
sys.exit(0)

Nos links abaixo, há outros exemplos de scripts de commit que podem servir de inspiração para validações mais avançadas:

  1. http://trac.edgewall.org/browser/trunk/contrib
  2. http://svn.apache.org/repos/asf/subversion/trunk/contrib/hook-scripts/

Controle de versão distribuído é diferente, mas nem tanto

7 Comments »

Não há dúvidas de que o controle de versão distribuído (Distributed Version Control System – DVCS) veio não só pra ficar, mas também para tomar o lugar das ferramentas de controle de versão centralizado. As etapas têm sido as mesmas de quando apareceu o Subversion com a proposta de substituir o CVS: 1. desconfiança, 2. curiosidade, 3. interesse, 4. aceitação.

Quem está tendo o primeiro contato com o DVCS geralmente cai na fase 1 (desconfiança). Não conhece como funciona e, por isso, desconfia. Afinal, se funciona do jeito que está (mesmo que não muito bem), pra que mudar?

O pessoal da fase 2 (curiosidade) já leu algo a respeito e está intrigado com as vantagens que “dizem” que o DVCS tem. Mas ainda falta um empurrãozinho para pelo menos tentar experimentar um DVCS pra ver como é.

O objetivo deste artigo é apresentar um experimento simples e rápido mostrando que o modo de trabalho de um DVCS, especificamente o Mercurial, não muda tanto assim do usado no Subversion. Espera-se com isso, levar o leitor mais perto da fase 3: interesse.

O experimento simulará dois usuários trabalhando no mesmo projeto, executando algumas operações bem comuns e básicas de controle de versão através do Mercurial, comparando sempre com o mesmo passo feito pelo Subversion.

Para aproveitar melhor o experimento, é necessário:

  1. saber os conceitos básicos do controle de versão distribuído;
  2. instalar o Mercurial ou o TortoiseHg na sua máquina;
  3. já ter usado o Subversion e ter ele ou o TortoiseSvn instalado na máquina;

Observação: O experimento será apresentado com operações pela linha de comando por questão de espaço e comodidade. O experimento pode ser feito também através das interfaces gráficas TortoiseHg e TortoiseSVN, que possuem os mesmos comandos usados no roteiro.

1. Preparando os Repositórios

Quando se sabe que no DVCS cada desenvolvedor tem um repositório e que um repositório pode se conectar com qualquer outro, logo se imagina que o modelo distribuído é uma anarquia. Na verdade, qualquer desenvolvimento sem regras vira uma bagunça. No modelo distribuído, os repositórios podem ser arranjados em várias topologias e a topologia cliente-servidor é uma delas.

Vamos criar 3 repositórios: um oficial, um para um user 1, e outro para o user 2, sendo esses dois últimos para simular os dois desenvolvedores. A convenção estabelece que não haverá comunicação direta entre o repositório dos desenvolvedores 1 e 2. Apenas através do repositório oficial, exatamente como acontece no modelo centralizado.

O acesso ao repositório oficial, tanto do Mercurial, quanto do Subversion, será feito por acesso local para manter o roteiro simples. No exemplo, será usado o diretório /tmp (que é o diretório temporário do linux) para manter todos os repositórios. Escolha um diretório que melhor lhe convier.

Mercurial Subversion
hg init /tmp/oficial svnadmin create /tmp/oficial
hg clone /tmp/oficial /tmp/user1
hg clone /tmp/oficial /tmp/user2
svn checkout file:///tmp/oficial /tmp/user1
svn checkout file:///tmp/oficial /tmp/user2

2. Publicação Inicial

O próximo passo é fazer uma primeira publicação no repositório. Use um arquivo chamado numeros.txt que deverá ser criado no diretório do repositório/cópia de trabalho com o seguinte conteúdo:

um
dois
três
Mercurial Subversion
user1 hg add numeros.txt svn add numeros.txt
hg status svn status
hg commit -m “primeiro commit” -u user1 svn commit -m “primeiro commit” –username user1
hg push

O Mercurial teve um passo adicional para enviar ao repositório oficial o que foi feito no repositório local.

3. Vendo o histórico do projeto?

Mercurial Subversion
user1 # é necessário atualizar a cópia de trabalho antes para ficar na última revisão
svn update
hg log

changeset: 0:aa3f592139e5
tag: tip
user: user1
date: Sun Apr 18 15:31:40 2010 -0300
summary: primeiro commit

svn log

—————————————————————
r1 | user1 | 2010-04-18 15:30:13 -0300 (Dom, 18 Abr 2010) | 1 line
primeiro commit
—————————————————————

Note que o Mercurial também fornece uma numeração sequencial além da identificação da revisão por hash. Esta numeração é válida apenas para o repositório local e foi criada por comodidade, para facilitar a referência a uma revisão em comandos locais, ao invés de se usar o identificador hash.

4. Atualização do Repositório do Usuário 2

O usuário 2 está com seu repositório desatualizado em relação ao repositório oficial. A sincronização se dá pelo comando hg pull -u que já atualiza a área de trabalho acoplada com a última revisão.

Mercurial Subversion
user2 hg pull -u svn update

5. Edição Concorrente

Usuários 1 e 2 executarão mudanças concorrentes no mesmo arquivo. user 1 acrescentará a palavra “zero” na primeira linha enquanto usuário 2 acrescentará “quatro” na última linha. Como as mudanças acontecerão em partes diferentes do mesmo arquivo, a mesclagem ocorrerá sem conflitos.

Mercurial Subversion
user1 # edita números.txt # edita números.txt
hg diff svn diff
hg commit -m “zero” -u user1 svn commit -m “zero” –username user1
hg push
user2 # edita números.txt # edita números.txt
hg diff svn diff
hg commit -m “quatro” -u user2 svn commit -m “quatro” –username user2
# falha 1. Veja obs.
hg push
# falha 2. Veja obs.
hg pull
hg merge
svn update
hg commit -m “merge” -u user1 svn commit -m “quatro” –username user2
hg push

Descrição das falhas nas operações:

  1. O arquivo numeros.txt está desatualizado em relação à última revisão do repositório. É necessário atualizar/mesclar para que seja aceito.
  2. Por padrão, a operação de push não permite que um ramo fique com mais de uma ponta, isto é, tenha bifurcações após a combinação dos grafos de revisões. Qualquer linha individual de desenvolvimento deve ser antes unificada localmente com a linha presente no repositório-oficial antes de ser enviada.

6. Visualização do Grafo de Revisões

O histórico de revisões do DVCS é um grafo acíclico direcionado (Directed Acyclic Graph – DAG). Na interface gráfica, é possível ver os caminhos sendo bifurcados e reunificados. Pela linha de comando, é necessário antes habilitar o plugin do Mercurial que conseguir ver o grafo textualmente.

Edite o arquivo de configuração do repositório do usuário 2, cujo caminho é /tmp/user2/.hg/hgrc e adicione as seguintes linhas ao final

[extensions]
hgext.graphlog =
Mercurial Subversion
user2 hg glog svn log
@ changeset: 3:3eddeb3252ea
|\ tag: tip
| | parent: 1:f01fe74e7279
| | parent: 2:c3664eb01670
| | user: user2
| | date: Sun Apr 18 22:06:03 2010 -0300
| | summary: merge
| |
| o changeset: 2:c3664eb01670
| | parent: 0:b353a0bdea31
| | user: user2
| | date: Sun Apr 18 22:05:21 2010 -0300
| | summary: quatro
| |
o | changeset: 1:f01fe74e7279
|/ user: user1
| date: Sun Apr 18 22:05:43 2010 -0300
| summary: zero
|
o changeset: 0:b353a0bdea31
user: user1
date: Sun Apr 18 22:04:40 2010 -0300
summary: primeiro commit

O grafo apresentado mostra que as revisões produzidas pelos usuários 1 e 2 formaram linhas independentes de desenvolvimento que depois foram reunificadas.

Conclusões

Usando o Mercurial na topologia cliente-servidor, com um repositório oficial equivalente ao repositório central do Subversion, nota-se que não há nenhuma grande mudança na forma do trabalho, nem nos comandos, que são idênticos para a maioria das operações. A impressão que se tem é de que o Mercurial é um Subversion com pushpull.

À primeira vista, parece que o Mercurial precisa de mais comandos para fazer a mesma coisa que se faz no Subversion. A razão disso, e que só é mostrado quando se vê o grafo de revisões, é que cada desenvolvedor trabalha em uma linha independente, equivalente a um ramo privativo, no qual pode publicar suas revisões sem a obrigatoriedade de mesclar com outra revisão a cada etapa, que é o que acontece no Subversion. O resultado é um fluxo de trabalho ainda melhor que no modelo centralizado.

No Mercurial, e em DVCS em geral, todo desenvolvedor trabalha naturalmente em um ramo privativo. O mesmo resultado poderia ser obtido no Subversion definindo-se ramos privativos para cada desenvolvedor a cada tarefa, bug etc. a ser implementado. Quem já usou ou tentou usar uma solução assim no Subversion, sabe quanto é trabalhoso e complicado fazer isso.


Livros de programação disponíveis para download

No Comments »

Indico um link para diversos livros (em inglês) de programação disponíveis para download grátis. São livros sobre diversas linguagens de programação: Python, Ruby, C, C#, C++, CGI, JavaScript, Perl, Delphi, Pascal, Haskell, Java, Lisp, PHP e Prolog além de programação de jogos e engenharia de software.

Os livros estão em formatos para leitura online e para download.


Controle de Mudança Distribuído é necessário?

No Comments »

Controle de mudança distribuído (Distributed Bug Tracking – DBT)  parece ser um complemento natural para o controle de versão distribuído (DVCS – Distributed Version Control Systems); o desenvolvedor trabalharia de modo autônomo em seus tickets e depois sincronizaria com os outros desenvolvedores, da mesma forma que faz com o DVCS.

Projetos open source de DVCS começaram a aparecer em 2005 e vêm se tornando cada vez mais populares a cada dia, particularmente o Mercurial e o Git. Mas é curioso notar que não há nenhum projeto de DBT de renome, nem tem aparecido variações ou extensões de ferramentas centralizadas que as tornem distribuídas. Algumas tentativas de produzir um DBT não prosperaram; os projetos se encontram parados ou se tornaram apenas uma prova de conceito, sem conseguir grande aceitação:

  • Bugs Everywhere. Embora a página do projeto tenha sido revisada em 06/02/2010, o projeto parece abandonado, documentação inexistente e o link para o código fonte do projeto está quebrado (pelo menos no momento em que esse artigo está sendo escrito).
  • DisTract. Parado desde 2007.
  • DITrack. Abandonado em junho de 2008
  • Ditz. Parado desde novembro de 2008.
  • TicGit. Tem tido alguma atividade recente.
  • Fossil. Controle integrado de versão e de mudança distribuído. Não é baseado em nenhuma outra ferramenta distribuída já existente tal como o Mercurial. Vem sendo produzido ativamente.

Por que o Controle de Mudança Distribuído não Vingou?

O fato é que controle de versão é uma ferramenta para o programador, mas o controle de mudança é uma ferramenta para o projeto.

O controle de mudança tem o papel de aglutinar as necessidades do projeto, coordenar os esforços dos desenvolvedores e direcionar a evolução do projeto. É uma ferramenta de comunicação e colaboração entre desenvolvedores que funciona melhor de modo centralizado.

Imagine uma situação em que toda a equipe use um DBT. Cada desenvolvedor cria seus próprios tickets, páginas wiki, define milestones e organiza suas prioridades. Como juntar depois todas essas informações de uma maneira coerente para o projeto? Quem definiria as prioridades?

A facilidade de criar e editar tickets offline não compensa a complicação que um DBT introduziria no processo de desenvolvimento. Embora um DBT seja tecnicamente interessante, é uma aplicação procurando uma necessidade para preencher.

Acredito que o controle de versão vai caminhar para o modelo distribuído, mas o controle de mudança permanecerá centralizado.

Links Relacionados


Codeplex passa a usar Mercurial como controle de versão padrão

No Comments »

Codeplex é um portal da Microsoft para hospedagem de projetos open source, similar ao SourceForge e Google Code. Conforme anunciado, o Codeplex agora passa a suportar nativamente o Mercurial como controle de versão (a outra opção é o TeamSource, da própria Microsoft).

Entre os motivos apontados para a escolha do Mercurial, está a popularidade da ferramenta e o ótimo suporte ao Windows, o que é particularmente importante para o Codeplex, claro.

Sem entrar nos méritos da combinação Microsoft e open source, o fato é que o Mercurial vem sendo usado cada vez mais por provedores de hospedagem de projetos. Os próprios SourceForge e Google Code já oferecem suporte ao Mercurial.