CI Factory e Boas Práticas de Integração Contínua

by alisson.vale 29/4/2007 23:39:44

Esta semana duas publicações interessantes sobre Integração Contínua me chamaram a atenção a ponto de eu estar sugerindo aqui no meu blog.

A primeira é um screen cast no DnrTV com Scott Hanselman e Jay Flowers sobre o CI Factory. O CI Factory realmente me impressionou. Ele ajuda a preparar e gerenciar "workspaces" que isolam, padronizam e permitem fácil extensão e manutenção de sistemas de integração contínua. Em poucos minutos de contato com a idéia da ferramenta já dá pra perceber o quanto seus projetos vão poder se beneficiar de seus recursos. Acho que o ponto alto do CI Factory é trazer consigo um grande conjunto de boas práticas na construção e no gerenciamento de sistemas de Integração Contínua e Build Servers. Algumas das boas práticas que detectei apenas vendo o vídeo (ainda não parei para me aprofundar no uso da ferramenta, mas certamente o farei assim que puder):

  • Todos os arquivos necessários para execução da build estão no mesmo contexto de controle de versão do próprio aplicativo;
  • Toda a lógica de build é portável de forma que pode ser rodada não só no servidor, mas também nas workstations dos desenvolvedores;
  • As referências a componentes de terceiros são organizadas e gerenciadas em um espaço próprio;
  • Adicionar ou Remover passos é simples e rápido;
  • Incorporar novos recursos à sua build também é muito fácil e rápido. Já vem com os pacotes para vários controladores de repositório, Versionamento de assemblies, Frameworks para execução de Unit Tests, Code Coverage, Métricas, Análises de Código, Deployment e Pacotes para Instalação.

Um outro post interessante foi do Martin Fowler a respeito dos gargalos que às vezes podem ser gerados com builds quebradas em processos de integração contínua. Quando uma build é quebrada, o resto do time é afetado até que a build seja corrigida. A solução pode ser o uso de “branches privados” onde o desenvolvedor faz uma integração prévia antes de integrar com a mainline. Eu particularmente acho que alguma disciplina pode ajudar bastante em diminuir este problema. Práticas como, por exemplo, não integrar no fim do expediente e na iminência do horário de almoço, não realizar integrações simultâneas, deixar bem visível para o restante da equipe que há alguém integrando e evitar que desenvolvedores que estão integrando sejam interrompidos por qualquer motivo.

Integração Contínua - The Whole Picture

by alisson.vale 13/4/2006 03:25:15

Há algumas semanas eu comentei aqui que estaria apresentando um overview do processo de Integração Contínua que idealizamos e criamos no nosso projeto. Neste artigo, vou apresentar o “The Whole Picture” do processo da forma como ele foi desenhado. Ou seja, como ele está arquitetado para à partir de um check-in do desenvolvedor, disponibilizar a aplicação para uso imediato pela área de qualidade e também, disponibilizar arquivos de instalação para testes e deploy nos clientes. 

O nosso processo de build nada mais é do que um emaranhado de aplicativos e ferramentas, cada um com seu propósito, que nos permite customizar todos os procedimentos e checagens necessárias para um incremento de versão mais seguro em nosso aplicativo. Mas atenção! Este não é um processo que pode ser copiado integralmente para outros projetos. Um processo de build é muito dependente do ambiente em que ele ocorre e do sistema ao qual ele está agarrado. Cada projeto precisa de suas próprias rotinas para validação e geração de artefatos. Uma idéia geral é apresentada nesse post para que você possa seguir seu próprio caminho na hora de projetar seu processo de Integração Contínua.

Características do Processo

  • Usamos 100% de ferramental open-source e freeware (apenas o banco de dados é proprietário: MSSql Server);
  • Há vários pequenos aplicativos desenvolvidos internamente por nossa equip para atender partes específicas do processo;
  • Há duas versões do processo que nós identificamos como RTM e Mainline. Cada uma se aplica a um branch de código diferente. A RTM se refere à versão de produção do nosso sistema, já à Mainline se refere à versão que está em desenvolvimento. Essas duas versões podem se diferenciar na ordem em que os procedimentos são executados, na maneira que ele é executado e também se determinado procedimento vai ou não ser executado.
  • Hoje, em sua versão mais lenta e completa, o processo demora em torno de 35 minutos; e, em sua versão mais rápida, 6 minutos.
  • Qualquer problema encontrado em qualquer uma das etapas da build, faz com que todo o processo seja interrompido. Nesse caso, uma notificação é enviada para toda a equipe.

Artefatos Gerados

  • Uma aplicação publicada em um servidor de homologação para uso imediato, sem que seja necessário qualquer procedimento manual para instalação;
  • Um relatório contendo o ChangeLog da versão “Minor” e o ReleaseNotes da build.
  • Um arquivo msi auto-instalável, disponibilizado em um website para download, onde se pode baixar uma determinada versão e instalá-la em uma máquina para testes, para apresentação ou até no ambiente de produção do cliente.
O aumento de confiança da equipe na qualidade da build gerada é um ponto importante. A aplicação deverá chegar na área de qualidade com menos problemas de deploy e de integração se passar por todas as validações incorporadas nesse processo de Integração Contínua.

RoundTrip

A seguir é apresentado o esquema de execução do processo de Integração Contínua, a lista de ferramentas utilizadas e uma explicação geral sobre cada passo, são mostrados mais adiante.

WholePicture.png


Ferramental

Função

Ferramenta

Tipo

Passos

Controlador de Código-Fonte

CVS

Open Source

1, 2

Issue Tracking

Mantis

Open Source

1, 11

Build Server

CruiseControl.Net

Open Source

3, 4, 17

Build Script Tool

NAnt

Open Source

Do 5 ao 16 

Build Script Tool

MSBuild

Freeware

8

Validação dos schemas dos arquivos xml da aplicação.

Phidelis-XmlValidator.exe

Desenvolvida internamente

7

Execução de scripts no BD

Isql.exe

Proprietária do SqlServer

9

Execução de testes de unidade

NUnit

Open Source

10

Geração de ChangeLog e Release Notes

ChangeLogManager.exe

Desenvolvida internamente

11

Geração de meta-dados para o Wix.

GenWixFiles.exe

Desenvolvida internamente

12

Geração de instalador no formato MSI

Wix

Open Source

13

Suporte para deploy de alterações no banco de dados e arquivos de configuração

SupportDeploy.exe

Desenvolvida internamente

14

Monitoramento e Notificação

DevConsole

Desenvolvida internamente

17


Políticas de Check-in

O processo começa com o desenvolvedor efetuando check-in (commit no CVS) em um ou mais arquivos. Criamos então, um conjunto de políticas de check-in, conforme descrevemos a seguir:

  • Comentário obrigatório para qualquer commit;
  • Comentário individualizado por arquivo;
  • Associação com uma tarefa previamente cadastrada no Issue Tracking;
  • Os comentários devem fazer parte da documentação da task no issue tracking; 


Obviamente, as ferramentas de controle de código-fonte e issue tracking não se falam nativamente. Houve então a necessidade de integrá-las. Implementamos então uma integração do CVS com o Mantis de forma que um script PHP validasse a forma e o conteúdo do comentário escrito pelo desenvolvedor no momento do check-in. Para que isso funcione, o comentário é sempre escrito conforme uma regra pré-estabelecida. Ele é aplicado a uma Regular Expression que valida sua forma. Já o script PHP valida seu conteúdo, recuperando de seu texto o número da task do Mantis e documentando o comentário inserido pelo desenvolvedor nas notas dessa mesma task. Esse processo será descrito com mais detalhes em um post futuro.

Processo de Build e Deploy

Após todo o processo de check-in do desenvolvedor, este pode acionar o build server para disparar os procedimentos de build e deploy, conforme é mostrado no passo 3 da figura 1. O próprio build server se encarrega de obter o código-fonte na versão mais atual para o branch associado. O NAnt é acionado então pelo build server e começa a execução de uma série de procedimentos. Inicialmente, os assemblies são marcados com um novo número de versão seguindo uma máscara pré-definida (ex: 2.0.1.*), onde o * é um número que é incrementado a cada execução do processo (apenas as execuções com sucesso são contadas). Os assemblies saem então com o mesmo número de build da Integração Contínua. Cada assembly é então compilado e reservado junto com referências a bibliotecas de terceiros.

Depois disso, os vários arquivos Xml utilizados para configurar a aplicação passam por procedimentos de checagem. São 3 níveis de checagem: sintaxe (via parser), regras de integridade (via schemas) e semântica (via um aplicativo desenvolvido internamente). Por exemplo, nós temos um arquivo de mapa de urls que mapeia o caminho físico de uma página web com um alias lógico. A validação sintática checa se não há má-formação do xml, a validação de integridade checa, entre outras coisas, se os atributos obrigatórios de cada elemento estão preenchidos; ou ainda, se um determinado atributo contém valores válidos. Já a validação semântica verifica, por exemplo, se o arquivo indicado no mapa existe fisicamente no repositório. Há também vários outros arquivos Xml utilizados pela aplicação que passam pelos seus próprios níveis de validação. 

O próximo passo é o acionamento do MSBuild para a compilação e merging da aplicação web. O ASP.Net 2.0, diferentemente do 1.1,  disponibiliza um aplicativo chamado ASPNetMerger que compila todo o código de interface de usuário em um único assembly, deixando as páginas aspx apenas com conteúdo HTML. O MSBuild foi utilizado nesse caso por que já tem tasks preparadas para rodar este procedimento.

Feito isso, e se tudo deu certo até agora, estamos prontos para executar os testes unitários. Como há vários testes que acessam o banco de dados, é necessário acionar o isql.exe para execução do script SQL de inicialização do BD da aplicação. Um BD novo é criado, as configurações para acesso a este bd são realizadas, e o NUnit é chamado para rodar os testes de cada um dos assemblies compilados anteriormente.

Se nenhum teste falhar, a build continua com o procedimento de geração de ChangeLog e ReleaseNotes. Esses procedimentos merecem estar em um post específico (e estarão!), mas, em resumo, o que acontece aqui é a leitura de todos os logs do CruiseControl. Esses logs contém as informações de que tasks do Issue Tracking foram contempladas em cada build gerada. Com essa informação, nós conseguimos gerar um documento de ChangeLog que relaciona as tasks associadas a cada build gerada anteriormente. O ChangeLog é contextual à máscara de número de versão que está no contexto da integração contínua.

O resto do processo fica por conta da geração e execução do MSI, um arquivo auto-instalável que permite a instalação de toda a aplicação em modo silencioso. A geração do MSI é toda realizada pelo framework open-source WIX. Como a aplicação é toda web, depois de instalada ela já pode ser acessada pela equipe e testada. Vale destacar, nesse processo de instalação, que houve a necessidade de desenvolvermos um pequeno aplicativo para a atualização automática de estruturas de banco de dados e arquivos de configuração que venham a ser criados ou modificados pelos desenvolvedores.

Ao final, o NAnt faz a cópia do arquivo MSI para um diretório onde ele estará disponível para download pela equipe ou pelos próprios clientes.

O próprio Build Server se encarrega de notificar a equipe de que o processo de build foi finalizado com sucesso. Se qualquer evento anterior falhar, a build se encerra e a equipe é imediatamente notificada.



Integração Contínua x One-Step-Build x One-Step Deployment

by alisson.vale 26/3/2006 20:13:45

Em um projeto XP a Integração Contínua deve ser encarada como um importante agente transformador. Ela é o primeiro passo para que o software saia da máquina de um desenvolvedor e apareça na máquina de um cliente para que este o utilize. Na minha visão, a IC afeta diretamente e de forma significativa um projeto XP. Ela pode dizer, por exemplo, o quão rápido será o feedback do seu cliente. Pode dizer também quanto tempo um desenvolvedor terá que gastar para incorporar seu código no sistema e quão confiante o time estará depois de modificações no código, pois este sabe que uma “Successfull Build” é o resultado da passagem do código por vários níveis de checagens. Um integração contínua executa no mínimo três operações básicas: Recupera o código-fonte de seu repositório em sua versão mais atualizada, compila e monta seus diversos componentes e executa todos os testes de unidade sobre esses componentes recém-compilados. Ou seja, nesse cenário, tivemos dois níveis de checagem: compilação e testes de unidade.

De forma geral, uma IC que apenas compila e executa testes de unidade é o suficiente para o seu propósito, que é permitir que os códigos de  vários desenvolvedores estejam sempre sintonizados e funcionando de forma correta. Este processo deve ser simples e rápido o suficiente para ser executado em até 10 minutos. Esta é uma média de tempo que pode ser considerada para a maioria dos projetos. Há projetos em que esse tempo acaba sendo maior. O ideal é que a IC possa acontecer várias vezes por dia e, que os desenvolvedores não precisem ficar parados esperando longos processos de integração.

Ao contrário do que muitos pensam, a IC não precisa ser feita de forma automática. Ela é uma atividade que pode ou não ser feita com o uso de ferramentas. Se, depois de terminar seu trabalho, um par de desenvolvedores sentar em uma máquina, baixar manualmente o código-fonte, compilar esse código e rodar seus testes, tudo de forma manual, ainda assim será um bom processo de IC.

Com o uso de ferramentas de script você pode fazer seu processo de IC se beneficiar do conceito de One-Step Build. Um One-Step Build é um processo que permite a geração de uma build de um sistema por meio de apenas um único passo, que pode ser um click de botão ou a execução de um programa. O próprio script criado se encarrega de rodar todos os passos necessários para a geração da build. Se os passos necessários para execução dessa build passarem por “Obter a última versão do código”+”Compilar”+”Rodar testes de unidade”, este processo de One-Step-Build poderá ser utilizado como apoio para a IC. Há várias ferramentas que podem te ajudar nisso. As mais conhecidas são o Ant, o NAnt, o MSBuild e, mais recentemente, o Ruby Rake (a sensação do momento nesse assunto).

Aqui no nosso projeto, nós usamos com muita satisfação o NAnt e o MSBuild. Ambas as ferramentas são usadas no mesmo processo. O NAnt roda 90% do processo. Deixamos o MSBuild responsável apenas por algumas tasks relacionadas com os processos de compilação e merging da parte web da nossa aplicação, que está em ASP.Net 2.0.

Mas o One-Step Build ainda não é suficiente para reduzir em sua totalidade o que há entre o desenvolvedor e o cliente. Ainda há um vazio entre o resultado da integração contínua e o software efetivamente funcionando no ambiente do usuário.

Depois de integrado, em tese, o software estaria pronto para ser disponibilizado em ambientes diversos para testes ou para uso efetivo de seus usuários. Só em tese mesmo... mas há muito o que fazer ainda. Um software integrado, é um software cujo código-fonte foi validado e checado naquilo que é possível em termos de automação. O compilador checa sintaxe, compatibilidade de tipos e a validade de mensagens enviadas entre objetos. Ainda precisamos checar se os objetos respondem satisfatoriamente às regras e ao propósito para os quais eles foram codificados. Isso é feito com testes de unidade. Mas ainda há um longo caminho a andar para que o software possa estar na máquina de um usuário pronto para ser utilizado e testado. 

Percorrer este caminho, significa ter o que chamamos de One-Step Deployment. Esse é um grande desafio para qualquer equipe de desenvolvimento de software. Pense em todos os passos que você precisa tomar para levar seu software do repositório de código-fonte direto para a máquina do usuário. Atualizar o aplicativo, estruturas de banco de dados, arquivos de configuração, módulos rodando em diferentes máquinas com diferentes tecnologias; considerar restrições de segurança, ambientes distribuídos e, como se já não estivesse complicado, você ainda tem que deixar seu processo informar aos usuários o que foi alterado entre uma versão e outra. Difícil? Sim. É complicado mesmo... Mas o tamanho dos benefícios é proporcional ao tamanho do desafio.  Quando você conseguir executar todos estes passos por meio de um “apertar de botão” você terá alcançado o tão sonhado “One-Step Deployment”.

Em nosso projeto, depois de muito esforço, nós conseguimos chegar a uma solução de Gerência de Configuração em que unimos Integração Contínua com One-Step Build e One-Step Deployment.

Para aqueles que querem conhecer essa solução eu estarei postando semanalmente um overview de todas as etapas que precisamos vencer para chegar a este resultado.

Acompanhe!

Console do Desenvolvedor

by alisson.vale 14/2/2006 03:13:08

Em um projeto ágil, uma equipe de desenvolvimento gasta seu tempo basicamente fazendo três tipos de tarefa: análise e design, codificação e configuração/atualização do ambiente e das ferramentas de trabalho. Este último tipo, em especial, envolve a interação do desenvolvedor com ferramentas de apoio, como o repositório de código-fonte, o tracking de tarefas e outras. Pode não ser muito perceptível na maioria dos projetos, mas, na medida em que o projeto cresce em tamanho e complexidade, este tipo de atividade pode passar a ser um grande inconveniente para a agilidade da equipe.

Por exemplo, aqui na nossa equipe, um desenvolvedor precisaria executar os seguintes passos sempre que fosse começar a trabalhar em uma nova tarefa:

 - Fazer um check-out do código-fonte no branch adequado;
 - Criar um diretório virtual;
 - Abrir o projeto na IDE;
 - Remover páginas web desnecessárias (para diminuir o tempo de build)
 - Compilar todos os assemblies;
 - Rodar testes de unidade;
 - Apontar a aplicação para o banco de dados correto;
 - Rodar um programa para checagem/atualização da estrutura do bd em uso;
 - Rodar a aplicação;
 
Com certeza, muita coisa... por incrível que pareça, cada passo desse tem sua importância e não fazer um deles na ordem correta pode levar a ainda mais desperdício de tempo.

Para tentar agilizar esse processo, nós criamos uma ferramenta onde o desenvolvedor pode centralizar e disparar essas ações de forma a perder o menor tempo possível. Chamamos essa ferramenta de “Console do Desenvolvedor”, ou simplesmente DevConsole e sua aparência pode ser conferida na Figura 1.

figura1.PNG
Figura 1: Visão geral do DevConsole


Como pode ser observado na Figura 1, o console permite que o desenvolvedor tenha acesso rápido às situações de build da integração contínua e aos itens de trabalho que estão em desenvolvimento. Há links para visualizar os detalhes de cada build ou work item e links para acesso às releases geradas pela integração contínua em cada branch ativo.

Essa visão é interessante, porém não é suficiente para o desenvolvedor. Ele precisa executar operações de montagem e configuração de ambiente para cada “work item” pendente. Assim, ao criar o DevConsole nós tivemos três objetivos em mente:

 1: Automatizar a execução de tarefas repetitivas e que precisam ser realizadas fora da IDE, muitas vezes, com a utilização de mais de uma ferramenta de apoio;
 2: Isolamento do ambiente de desenvolvimento por tarefa. Cada tarefa deve ter o seu próprio ambiente e os desenvolvedores devem ser capazes de alternar entre várias tarefas de maneira rápida e fácil;
 3: Manter a equipe sintonizada e informada dos eventos que vão ocorrendo no dia-a-dia de trabalho.

Vamos ver como isso ocorre a seguir.

Objetivo 1: Automação de tarefas repetitivas do desenvolvedor

Devido ao nosso método de trabalho, o desenvolvedor precisa alternar - sem esforço de configuração - entre diversas tarefas durante o dia em uma mesma máquina. Dessa maneira, nossa primeiro desafio, foi permitir que o ambiente de trabalho configurado para cada work item fosse completamente isolado um do outro. Clicando-se com o botão direito sobre um item do DevConsole, este exibe um menu de opções conforme é apresentado nas figuras 2a, 2b e 2c.

figura2a2.png
Figura 2a: Opções para configuração de ambiente

A opção Environment contém algumas das opções utilizadas para montagem e configuração de ambiente, caso estas precisem ser executadas de forma isolada. Mas, a opções mais utilizada é primeira “Inicializar Ambiente”. Esta opção executa todos os procedimentos listados no início deste artigo (check-out, compilação, checagens, etc). Ao final do processo, o desenvolvedor já tem a IDE e a aplicação pronta para uso. 


figura2b2.png
Figura 2b: Opções para recuperação de arquivo do repositório

Na opção Source Control, temos as ações de check-out e update, caso estas precisem ser executadas de forma isolada (o que é mais raro). Nesse caso, as vantagens de se usar o console ao invés dos clientes do cvs é, primeiro, não precisar abrir outra ferramenta e, segundo, já se ter definido o contexto de pasta onde essas operações serão executadas de forma automática.

figura2c2.png
Figura 2c: Opções de integração com a IDE


Já as opções de integração com a IDE (figura 2c) são mais frequentemente utilizadas. Elas permitem, por exemplo, que o desenvolvedor crie apenas os projetos que serão afetados no trabalho desse item. Como nós temos mais de 10 projetos, abri-los todos de uma vez torna a IDE e o processo de compilação lentos. Assim, o desenvolvedor monta uma solução do Visual Studio apenas com o(s) projeto(s) que será(ão) alterado(s), os outros são referenciados via assemblies automaticamente pelo DevConsole.

Uma outra opção de integração com a IDE é o “Filtro de páginas web”. Nós temos, hoje, por volta de 700 páginas aspx para interface com o usuário. Trabalhar com a IDE compilando todas essas páginas em uma build é inviável. Assim, o desenvolvedor pode selecionar as páginas que ele quer que estejam presentes no projeto web (O Visual Studio permite que se faça isso pela IDE, mas, infelizmente, ainda não de modo eficiente).

figura2d2.png
Figura 2d: Atalhos para operações comuns

Por último, a opção Abrir do menu, permite criar atalhos para operações comuns do dia-a-dia, como abrir a pasta onde os arquivos de projeto estão localizados, abrir o work item no sistema de tracking e abrir a própria aplicação relacionada com o item no browser.

Objetivo 2 – Isolamento de tarefas em uma mesma máquina

Depois de finalizado o processo de configuração, as pastas com os arquivos relacionados a cada item ficam dispostas no disco separadas pelo branch associado ao “work item” (a informação de em qual branch aquele item deve ser trabalhado é indicada quando do report do “work item” na ferramenta de tracking (Mantis)). Além disso, os arquivos de solução na IDE ficam bem caracterizados para que o desenvolvedor saiba exatamente com o quê está trabalhando (Veja figuras 3a e 3b).

Figura3a.PNG
Figura 3a: O item que está sendo trabalhado fica bem destacado na IDE.

 

Figura3b.PNG
Figura 3b: Visão da disposição de pastas criada pelo DevConsole. Separação por Branch e Work Item.

 
 
 
Figura3c.PNG
Figura 3c: Diretório virtual configurado no IIS pelo DevConsole de forma isolada para cada work item, contribuindo para o isolamento entre tarefas em uma mesma máquina.


Repare que essa separação permite um maior controle de ambiente, principalmente quando o desenvolvedor precisa rapidamente alternar entre uma tarefa e outra, mesmo estas estando associadas a branches diferentes e rodando em configurações, diretórios virtuais e bancos de dados diferentes. O isolamento é feito criando imagens do código-fonte em pastas do disco diferentes e configurando toda a aplicação para que ela rode sem interferência com relação ao ambiente de um outro “work item”.

Objetivo 3 – Notificações do dia-a-dia

Uma das coisas que implementamos na ferramenta (em um segundo momento) foi o suporte a notificações que achamos importantes serem enviadas para toda a equipe. Principalmente, no que diz respeito ao controle de builds e avisos relacionados com o andamento das tarefas. Nós temos os seguintes tipos de notificação:

 - Situação geral de todas as builds:

Figura4.PNG
Figura 4a

 - Quando uma build começa a ser executada:

Figura4a.PNG
Figura 4b

 - Quando uma build falha ou é executada com sucesso:

Figura4e.PNG
Figura 4c

 - Quando um novo item é colocado no sistema de tracking:

Figura4b.PNG
Figura 4d

 - Quando há uma mudança de “status” de algum item:

Figura4d.PNG
Figura 4e

 - Quando um commit é realizado:

Figura4c.PNG
Figura 4f

O próprio Cruise Control.Net oferece recursos para notificação das builds ainda de forma um pouco melhor que essa, mas achamos mais interessante centralizar todas as notificações em uma única ferramenta. Além disso, o CCNet dispõe de APIs muito simples de usar para checagem remota do servidor de builds. Não houve muito esforço para implementar essa opção no DevConsole.

As Operações são executadas com o NAnt

 Uma das idéias que nos permitiu desenvolver esta ferramenta de modo rápido foi a utilização de scripts NAnt ao invés da codificação direta das operações com C#.  Ou seja, cada opção de menu do DevConsole na verdade dispara um script NAnt que pode ser trabalhado de forma mais flexível (Veja figura 5).

Figura5.PNG
Figura 5: Operação de Inicialização de ambiente sendo executada pelo NAnt.


Conclusão

Tirando de lado a própria adoção da ferramenta, que foi construída com base exclusivamente nas demandas que tínhamos para automação das nossas atividades, acho que o nosso principal ganho foi a incorporação de algumas práticas que se revelaram muito úteis para o trabalho do desenvolvedor. A padronização foi uma delas. Hoje o DevConsole direciona os desenvolvedores a assumirem um padrão de trabalho, que é compartilhado por todos da equipe.  Ganhamos também alguma flexibilidade para lidar com as limitações da IDE, principalmente no gerenciamento de uma grande quantidade de projetos e dos projetos web que, quando grandes demais, geram muitos transtornos. Por fim, encontramos na ferramenta um grande aliado no controle do ambiente do desenvolvedor, principalmente para a alternância de tarefas que, particularmente no nosso projeto, ocorre com certa frequência e precisa acontecer do modo mais rápido e suave possível.

Tags:

SCM

Mais idéias sobre portais para equipes de desenvolvimento

by alisson.vale 8/2/2006 22:06:41

Esse post vai em especial para o colega Thiago Arrais que está conduzindo, em conjunto com outros parceiros, uma excelente iniciativa de implementação open-source de um portal para projetos de software: o Motiro.

Ano passado quando ministrei a disciplina de Gerência de Configuração em um curso de Pós-graduação em Projeto de Software aqui na Grande Vitória, utilizei esse texto como motivação para os alunos terem uma idéia de como um projeto poderia ser apoiado por boas práticas de gerência de configuração. O texto é uma adaptação da introdução do excelente livro "Portais Corporativos - A revolução na gestão do conhecimento" de José Cláudio Cyrineu Terra e Cindy Gordon. Preservei o nome do portal citado no livro, mas adaptei todas as cenas e personagens para um ambiente em uma empresa de software.  Acho que o texto pode dar boas idéias para o pessoal do Motiro e para todos aqueles que querem avançar no mundo da Gerência de Configuração e/ou dos Portais Corporativos. 

OBS: A história se passa em uma empresa que não trabalha com métodos ágeis. Alguém se propõe a adaptá-lo para um projeto XP?

Segue então o texto conforme eu passei para os alunos:

 

A seguir descreve-se uma série de cenas ocorridas – ou que poderão ocorrer? – em uma empresa que desenvolve produtos de software de médio ou grande porte. A área de gerência de configuração da empresa integrou seus processos através de um avançado portal de conhecimento corporativo: o Agente-C. O relacionamento verbal entre o Agente-C e os funcionários da empresa é propositalmente futurista para aumentar a dinâmica dos diálogos e para ajudar o leitor a entender os processos que estão em funcionamento em um ambiente controlado por uma área de gerência de configuração.

 

 

CENA 1

 

Personagens:  Agente-C, Inácio Guedes, Gabriel Fonseca, Bianca Lins

 

Local:  Escritório de Inácio Guedes

 

Contexto:

                - Sigma é um dos principais fornecedores de software de controle orçamentário e financeiro no Brasil.

                -  Inácio é o líder no projeto de desenvolvimento de um produto. Ele se chama “Projeto Sinus”

                - Gabriel é o gerente de configuração do projeto. Sua responsabilidade é manter os artefatos do projeto corretamente armazenados, identificados e categorizados. Ele também define os processos de liberação de releases, controle de código-fonte e automação do projeto.

                - Bianca ingressou recentemente em outra filial da Sigma em Recife.

 

 

Inácio chega no escritório e liga seu computador

 

Inácio:       Bom dia, Agente-C!

 

Agente-C:     Bom dia, Inácio!

 

Inácio:       Alguma notícia relevante?

 

Agente-C:     Sim. Uma nova release do projeto Open-Source Gentle.Net foi liberada.

 

Inácio:       O Gabriel já sabe disso?

 

Agente-C:     Sim. Ele também assina e recebe as notícias sobre esse assunto nessa agência.

 

Inácio:       OK. Próxima.

 

Agente-C:     Uma desenvolvedora sênior chamada Bianca Lins ingressou ontem no nosso escritório em Recife. Ela tem uma experiência que é altamente relevante para o projeto Sinus.

 

Inácio:       OK. Me passe mais detalhes.

 

Agente-C:     Ela trabalhou por cinco anos como desenvolvedora da IBM, tem uma grande experiência com SQLServer e é especialista em tunning e performance nesse SGBD.

 

Inácio:       Isto é realmente interessante. Por favor, tente marcar uma reunião com áudio e vídeo com ela em qualquer horário amanhã pela manhã.

 

Agente-C:     Baseado no seu calendário on-line, ela está disponível para um encontro às 10 horas da manhã. Eu reservarei a hora, esperarei por confirmação e entrarei em contato em contato com você.

 

Inácio:       OK. Envie pra ela um link com nosso último relatório de performance no módulo de conciliação bancária.

 

Agente-C:     Link enviado. Convite para reunião virtual enviado.

 

Três horas depois no escritório de Inácio....

 

Inácio:       A Bianca mandou notícias?

 

Agente-C:     Sim. A reunião está confirmada. Ela te deixou uma série de links para artigos que ela escreveu anteriormente sobre tunning e performance.

 

Inácio:       OK. Eu preciso ir agora. Coloque os links nos meus favoritos e me lembre de consultá-los amanhã cedo.

 

No dia seguinte....

 

Agente-C:     Bom dia Inácio! Você tem uma reunião em vídeo conferência com Bianca Lins em 10 minutos. Ela já está on-line.

 

Inácio:       OK. Podemos começar a reunião.

 

Inácio:       Bom dia Bianca... Espero que esteja gostando dos seus primeiros dias na empresa.

 

Bianca:       Obrigada. Estou me sentindo em casa.

 

Inácio:       Bianca, você analisou nosso relatório de performance que o Agente-C te passou?

 

Bianca:       Sim, analisei e tomei a liberdade de colocar alguns comentários, anexando-os ao documento.

 

Inácio:       Ótimo, vou dar uma olhada. Há alguma forma de você nos ajudar a resolver esse problema?

 

Bianca:       Acho que há meios de melhorar. Preciso de acesso aos testes de unidade e também ao relatório de timing desses testes.

 

Inácio:       Agente-C, Por favor envie uma senha para a Bianca ter acesso ao nosso código-fonte. Bianca, faça um check-out da mainline. Você precisa de instruções sobre como compilar e executar os testes de unidade?

 

Bianca:       Sim, Inácio. Mas enquanto conversarmos fiz uma busca aqui no Agente-C, e já estou com um documento com instruções sobre isso. Há inclusive intruções de acesso ao repositório de código-fonte.

 

Inácio:       Certo, Bianca, muito obrigado pela ajuda. Fico aguardando novas notícias então. Até mais.

 

Bianca:       Até mais.

 

Conceitos-Chave: Gestão de Competências, Notificações automáticas, Acesso a fontes externas de informação, Colaboração virtual.


 

CENA 2

 

Personagens: Agente-C, Inácio Guedes, Mauro Leme, Tânia Fernandes

 

Locais: Escritório de Inácio Guedes

 

Contexto:

 

                - Um novo relatório de bugs chega da equipe de testes noturnos. Os testes noturnos acontecem todos os dias. Eles servem para testar aquilo que foi produzido pela equipe de desenvolvedores que trabalha durante o dia.

                - Mauro Leme é desenvolvedor da equipe do projeto Sinus que está atualmente trabalhando em sua versão 2.25. Nessa manhã, ele estava de plantão na equipe de SWAT.

                - Tânia Fernandes é analista de negócio e responsável pela automação de testes funcionais do sistema.

 

 

Agente-C:     Inácio, a equipe de testes noturnos mandou seu relatório de testes noturnos realizados no branch da versão 2.25 do Sinus. Gostaria de abrir?

 

Inácio:       Sim.

 

O Agente-C exibe na tela:

 

Sistema: Sinus

Branch: Sinus_RC_225

 

Número

Tipo

Descrição

Criticidade

0012098

BUG

Erro de “Invalid Operation” quando se tenta comprometer parcelas de contrato.

Alta

0012099

BUG

Caminho de workflow incorreto no trâmite de solicitações de pagamento.

Alta

0012100

MELHORIA

Exibição de mensagem de falta de saldo antes de se completar o cadastro de novos contratos

Baixa

 

Inácio:       Certo. Como está a situação das correções?

 

O Agente-C exibe na tela:

 

<

Número

Situação

Desenvolvedor

Previsão

0012098

Em Desenvolvimento

Mauro Leme

2 horas

0012099

Aguardando Intervenção

Mauro Leme

Não indicada

0012100

Aguardando Intervenção

Mauro Leme

1 hora