Olá a todos! Início de ano, é hora de atualizar o blog. Irei através deste minicurso mostrar como montar um servidor de Integração Contínua (Continuous Integration) na prática. Veremos como instalar e configurar todas as ferramentas: Delphi XE2, DUnit, FinalBuild, SVN Server, Tortoise SVN e Cruise Control.NET. No decorrer do minicurso irei falar melhor sobre cada uma delas e suas funções.
Introdução
Antes de tudo vamos saber o significado da palavra integrar segundo o dicionário Aurélio – Integrar: Tornar-se Inteiro. Completar-se. Então imagine você integrando seu trabalho (código fonte) continuamente a fim de verificar se ele continua “inteiro”, integro. O conceito de integração contínua não é muito novo, já existe há algum tempo, porém, ganhou popularidade com o advento das metodologias ágeis (XP, Scrum, Kanban…), uma vez que CI é um dos seus pilares. Outros pontos que não podemos esquecer é o aumento da complexidade dos softwares atuais e o número de pessoas trabalhando ao mesmo tempo no mesmo projeto. Nesse cenário, CI desempenha um papel importante na redução de problemas quando os desenvolvedores integram seus códigos.
Vejamos a descrição sobre Integração Contínua segundo Martin Fowler (especialista no assunto): “Integração Contínua é uma prática de desenvolvimento de software onde os membros de uma equipe integram seu trabalho frequentemente, geralmente pelo menos uma vez por dia. Cada integração é verificada por um build automatizado (incluindo testes que são fundamentais) para detectar erros e devolver um feedback o mas breve possível. Essa abordagem reduz significativamente problemas com integração e permite que a equipe desenvolva software mais coeso de forma mais rápida.”
No build de integração pode haver varias tarefas como por exemplo: Compilação, Testes Unitários, Copia de bibliotecas externas, Criação de Banco de Dados, Empacotamento, etc. Não existe um limite estabelecido para o número de tarefas realizadas no build.
Testes Unitários
O foco não é falar sobre testes unitários nem muito menos ensinar a fazê-los, existem milhares de artigos e tutorias que mostram a importância dos testes. Porém vale enfatizar que é de extrema importância que em nossos projetos existam testes que possam ser rodados no build de CI. Com eles o servidor de CI pode verificar se foi feito algo que não era previsto pelos testes.
Feedback
Após a execução do build automatizado a equipe de desenvolvimento recebe um feedback sobre o que aconteceu no servidor de CI, se tudo acorreu como previsto, ou se ocorreu algum problema (Geralmente conhecido pela expressão – “o servidor quebrou…”). O feedback na CI é uma das maiores vantagem se não a maior de todas. Tende a estabelecer uma boa cultura na equipe, uma vez que o estado do projeto é informado várias vezes ao dia, e assim, reduzindo o tempo de quando o erro foi introduzido até quando ele é detectado.
Visão Geral
Figura 1 – Visão geral do processo de Integração Contínua
Mãos à Obra
Todas as ferramentas citadas anteriormente podem ser encontradas no seguinte link: http://centraldaengenharia.wordpress.com/2011/12/08/delphi–conference-2011-downloads/
Salve o projeto de teste do minicurso extraindo o diretório VendasXE em: C:\Projetos\
Faça o download em: http://fortesreport.com.br/wp–content/uploads/2011/12/DC2011-IntegracaoContinua.zip
Projeto VendasXE
Após realizar o download e extrair os arquivos, você deverá ter o seguinte caminho C:\Projetos\VendasXE. Execute o arquivo: \DB\CreateDataBase.bat. Inicie o RAD Studio XE2 e abra o DelphiConference.groupproj. Acesse a aba Project Manager, clique duplo em VendasXETests.exe como mostra a figura 2. Compile, execute e rode os testes.
Figura 2 – Project Manager VendasXE
Visual SVN Server
O SVN(SubVersion) é um software para versionamento de código muito conhecido. Essa ferramenta é comumente utilizada no desenvolvimento de software para controlar o histórico de desenvolvimento e as diferentes versões do código fonte, além da documentação. A figura 3 mostra a tela inicial de instalação.
Figura 3 – Instalação do Visual SVN Server
- Clique em next;
- Aceite os termos e next;
- Na tela de Select Components deixe marcada a opção VisualSVN Server and Management Console e next;
- Na tela de Custom Setup deixe as opções default e next;
- Clique em Install;
Execute o Visual SVN Server. O primeiro passo será criar um usuário de acesso.
- Clique com o botão direito no item Users e selecione a opção Create User… como mostra a figura figura 4;
- Informe um usuário e senha;
- Clique em Ok.
Figura 4 – Criando usuário de acesso
Iremos agora adicionar um repositório que irá conter nosso projeto VendasXE.
- Clique com o botão direito no item Repositories e selecione a opção Create New Repository… como mostra a figura figura 5;
- Informe o nome VendasXE e marque a opção Create default structure (trunk, branches, tags);
- Clique em Ok;
Figura 5 – Criando um Repositório
Tortoise SVN
Tortoise SVN é um cliente(“plugin”) do SVN, no qual sua funcionalidade é permitir que você interaja com o SVN de forma visual e muito intuitiva. Um item muito interessante no tortoise é após sua instalação ele se integrar com o windows shell. A figura 6 mostra a tela inicial de instalação.
Figura 6 – Instalação do Tortoise SVN
- Clique em next;
- Aceite os termos e next;
- Na tela de Custom Setup deixa as opções default e next;
- Clique em Install;
- Será necessário reiniciar o computador após a instalação;
Iremos agora vincular o diretório do nosso projeto VendasXE ao repositório do SVN Server que criamos anteriormente.
- Abra o Visual SVN Server;
- Abra Repositories;
- Abra VendasXE;
- Clique com o botão direito em trunk e clique na opção Copy URL to Clipboard;
- Acesse o diretório C:\Projetos\ e clique com o botão direito no diretório VendasXE;
- Clique na opção SVN Checkout…;
- Cole a URL do projeto na caixa de texto URL of repository, como mostra a figura 7
- Clique em Ok.
- Ele deverá mostrar uma janela informando que o diretório VendasXE não está vazio, e perguntar se deseja continuar. Clique em yes.
- Clique em Accept permanently.
- Informe o usuário e senha que você criou no Visual SVN Server;
- Marque a opção Save authentication clique em Ok;
- Clique em Ok.
Figura 7 – Tortoise SVN Checkout…
Nosso diretório VendasXE deverá esta igual a figura 8.
Figura 8 – Diretório vinculado ao repositório. (Tortoise SVN)
Apesar do nosso diretório está vinculado ao repositório, nossos fontes ainda não foram enviados. Para isso iremos utilizar a opção Add… do Tortoise SVN. Irá aparecer uma janela listando todos os sub-diretórios e arquivos de código fonte que compõe o nosso projeto VendasXE. Essa fase será um pouco chata, mas irei dar algumas dicas para torná-la mais rápida. Vamos lá!
- Botão direito do mouse em VendasXE e clique na opção TortoiseSVN > Add…
- Ordene a listagem por extensão clicando no título da coluna Extension.
- Ordene de tal forma que os diretórios venham primeiro na listagem;
- Desmarque todos os itens clicando na opção Select / Deselect all;
- Marque somente os seguintes diretórios: Business, Common, Dao, DB, Patterns, Tests, UI, Win32. Dica: Você pode selecionar os itens segurando o shift e clicando sobre eles, após eles estarem selecionados aperte a tecla barra de espaço para que todos sejam marcados ao mesmo tempo.
- Clique Ok;
- Clique em Ok novamente;
- Repita os Passos 1, 2, 3 e 4;
- Marque somente os seguintes diretórios: __history, Common/__history, Pattern/__history, Tests/__history, UI/__history;
- Botão direito do mouse, selecione Add to ignore list > Ignore 5 items by name;
- Marque somente os seguintes diretórios: Test/Win32/Debug, Win32/Debug, Test/Win32;
- Clique em Ok;
- Clique em Ok novamente;
- Repita os passo 1, 2;
- Repita o passo 4;
- Marque todos os itens com extensão *.dcu. Botão direito do mouse sobre um dos itens marcados Add to ignore list > *.dcu.
- Repita o passo 16 para as seguintes extensões: *.dsk, *.exe, *.fdb, *.identcache, *.ini, *.local, *.tvsconfig, *.~dsk.
- Clique em Select / Deselect all e depois em Ok;
- Agora que finalizamos o processo de adição dos arquivos que serão controlados(versionados) pelo SVN Server iremos enviá-los para o repositório.
- Botão direto no diretório VendasXE e clique em SVN Commit…
- A próxima janela irá mostrar a listagem de todos os arquivos e diretórios que serão enviados para o repositório.
- Informe um texto para registrar(Auditar) o seu commit, como mostra a figura 9 e clique em Ok;
- Clique em Ok novamente;
Figura 9 – Commit Tortoise SVN
Agora se acessarmos o Visual SVN Server, podemos verificar que já existem arquivos em Repositories > VendasXE > trunk.
Final Builder
Final Builder é uma excelente ferramenta para construção de builds automatizados. Ela possui uma IDE unificada e bem intuitiva, no qual você pode criar seus processos de build de forma simples. Se integra com varias outras ferramentas incluindo o compilador do delphi(dcc) e também com o SVN(SubVersion). Não irei passar pelo processo de instalação do Final Builder por ele esta incluso no pacote de instalação do RAD Studio XE2.
Criando o Nosso Processo de Build
Iremos agora criar os passos para o nosso build. Esses passos serão executados sempre que algum desenvolvedor modificar os fontes que estão no repositório. Iremos criar um processo simples com os seguintes passos:
- Realizar um Update nos fontes do Servidor de CI;
- Compilar o projeto VendasXE com as modificações realizadas;
- Criar um banco de dados novo, uma vez que pode haver mudanças nos scripts;
- Rodar os testes automatizados para saber se algum problema foi encontrado;
Mãos à Obra
- Execute o Final Builder;
- File > New Project;
- Salve o projeto em C:\Projetos\Build\ com o nome VendasXE.fbz7;
O Final Builder é baseado em Actions(Ações) que são disparadas em sequência ou em paralelo, dependendo do caso. Existem várias actions pré-definidas que podemos utilizar de forma bem intuitiva. Para iniciarmos a criação acesse a Aba Actions como mostra a figura 10.
Figura 10 – Actions Final Builder
Action SubVersion Update
Antes de iniciar a criação da action de update devemos configurar no Final Builder onde se encontra o executável do SVN Server. O diretório padrão é: C:\Arquivos de programas\VisualSVN Server\bin. Caso você tenha modificado o diretório no momento da instalação informe o novo local.
- Menu Tools > Options;
- Digite na caixa de texto Search: Subversion;
- Clique no Item SubVersion que foi encontrado;
- Na caixa de texto Subversion binaries location informe o diretório citado anteriormente como mostra a figura 11.
- Clique em Ok.
Figura 11 – Configurando o diretório do SVN Server
De volta a tela principal do nosso projeto com a aba actions selecionada realize os seguintes passos:
- Digite na caixa de texto Search: Subversion Update;
- Na janela Subversion Update na caixa de texto Work Folder digite C:\Projetos\VendasXE.
- Na sessão Security informe o usuário e senha cadastrados no Visual SVN Server.
- Click em Ok.
- Agora na tela principal você poderá ver a action que adicionamos.
- Execute o projeto através da tecla F5 ou clicando no botão Run como mostra a figura 12.
- Ao final da execução de cada action deverá aparecer na coluna Status um retângulo verde com a palavra Completed no seu interior.
Figura 12 – Executando o projeto (Actions)
Action Compiler
- Digite na caixa de texto Search: Compiler;
- Clique em Build Delphi que se encontra nos resultados da busca;
- Na caixa de texto Project File aponte para o VendasXETests.dpr que se encontra dentro do diretório: C:\Projetos\VendasXE\Test.
- Na Combo Compiler Version selecione Delphi XE2.
- Logo você perceberá que o botão ao lado da caixa de texto Project File agora está habilitado, clique nele e no diálogo que aparecer clique em Yes para que todas as opções do projeto VendasXETests.dpr sejam importadas automaticamente.
- Na sessão Option source vá até a combo Project Config e selecione Debug.
- Clique em Ok.
Mais uma action foi criada em nosso projeto. Execute novamente e veja o resultado.
Action Create Database
Essa action em particular é bem interessante e aconselho todos a fazer essa “simples” tarefa mas que ajuda bastante no nosso dia a dia. Quem nunca passou por aquele problema de sempre está precisando de um banco “zero” para realizar testes e nunca ter um disponível rapidamente? Então, eu já. Em nosso projeto no diretório C:\Projetos\VendasXE\DB temos os seguintes arquivos: CreateDataBase.bat, CreateDB.sql. O CreateDataBase.bat executa o cliente do firebird em modo console, removendo o banco atual se existir e criando um novo baseado no script do banco de dados, o CreateDB.sql. Agora sabendo de tal recurso iremos configurar a action Create Database.
- Digite na caixa de texto Search: Execute Program;
- Na caixa de texto Program File informe o nosso CreateDataBase.bat – C:\Projetos\VendasXE\DB\CreateDataBase.bat
- Clique em Ok.
- Experimente antes de executar as actions novamente ir até o diretório C:\Projetos\VendasXE\DB\ e excluir o arquivo DC.FDB(caso ele exista). Agora quando executar as actions você poderá verificar que o banco foi criado novamente.
Action DUnit (Tests)
Antes de criarmos essa action devemos nos atentar a um detalhe. Por default quando criamos um projeto de testes no DUnit(que já vem incorporado no XE2) ele é executado em modo “Gráfico”(GUI Running). Caso criássemos nossa action com essa opção habilitada, os testes serão executados em modo gráfico e o Final Builder irá esperar alguém fechar essa janela para que ele possa processar o build. Caso você não queira contratar um estagiário para ficar do lado do servidor fechando essa tela =), devemos configurá-la para abrir em modo Console.
- Em nossa lista de actions, duplo clique sobre o item Build Delphi;
- Na janela Build Delphi acesse a aba Directories;
- Na sessão Conditionals, mude o conteúdo da caixa de texto Conditional defines: de: _CONSOLE_TESTRUNNER;RELEASE para CONSOLE_TESTRUNNER;RELEASE. Somente remover o Underline inicial.
- Clique em Ok.
- Execute novamente as actions.
- Acesse o diretório C:\Projetos\VendasXE\Test\Win32\Debug e execute o VendasXETests.exe. Note que os testes serão executados em modo console e ao final será gerado um arquivo chamado dunit-report.xml. Esse arquivo contém o resultado dos testes(Success ou Fail) e será utilizado na configuração da nossa Action DUnit.
Pronto! Agora o ambiente está devidamente configurado para criarmos a Action DUnit (Tests).
- Digite na caixa de texto Search: DUnit;
- Na janela DUnit na caixa de texto Test Executable informe o caminho completo onde está o executável que rodará nossos testes. C:\Projetos\VendasXE\Test\Win32\Debug\VendasXETests.exe.
- Na caixa de texto Report file informe o .xml gerado após a execução dos testes. C:\Projetos\VendasXE\Test\Win32\Debug\dunit-report.xml.
- Clique em Ok.
- Rode as actions.
Verifique o log gerado pelo Final Builder na aba Build Log no canto inferior da tela. Estamos quase terminando a etapa de automação do nosso build. Falta somente configurarmos o Final Builder para executar em modo console da mesma forma dos nossos testes. Para isso, basta adicionar o diretório de instalação do Final Builder nas variáveis de ambiente do Sistema Operacional e executar os seguinte passos:
- Acesse o diretório C:\Projetos\Build(Diretório no qual salvamos o projeto do Final Builder);
- Crie um arquivo com o seguinte nome: Build.bat;
- Edite o arquivo com o conteúdo: FBCMD /P”VendasXE.fbz7″;
- Salve, feche e execute;
Finalmente o processo de automação do build está concluído.
Cruise Control.Net
Cruise Control.Net é uma ferramenta para automação do processo de Integração Contínua. Iremos utilizá-la para monitorar o nosso repositório de código fonte e assim que detectar alguma mudança disparar(trigger) todo o nosso processo de build. Essa ferramenta também será responsável pelo importante mecanismo de feedback caso haja algum problema na integração contínua. Podemos ver também todo um histórico do que vem acontecendo em nosso projeto.
Instalando…
- A figura 13 mostra a tela inicial de instalação do Cruise Control.Net;
Clique em next até chegar em Install(sem mistério) =) ;
Figura 13 – Instalação do Cruise Control.Net
As configurações do Cruise Control.Net são baseadas em um arquivo .xml(nããããããããoooooooo), mas não entraremos em pânico, pois existe uma ferramenta visual que configura esse arquivo xml de forma simples. Execute o instalador CCNetConfig.x.xx.xx.msi.
- A figura 14 mostra a tela inicial de instalação do CCNet Config;
- Aceite os termos e next;
- Clique em next até chegar em Install;
Figura 14 – Instalação do CCNet Config
Criando um Projeto no Cruise Control.Net
- Execute o CCNet Config;
- File > Open;
- Acesse o diretório de instalação do Cruise Control.Net(C:\Arquivos de programas\CruiseControl.NET\server) e selecione o arquivo ccnet.config.
- Na combo Version selecione a opção 1.4.
- Clique em Open.
- Note que apareceu 2 itens no lado esquerdo da tela: Cruise Control, Integration Queues;
- Botão direito no item Cruise Control > Add Project…
- Informe o nome VendasXE clique em Ok.
- A figura 15 mostra o resultado após a adição do nosso projeto;
- Selecione o item VendasXE, deverá aparecer várias configurações no lado direito;
- Na combo SourceControl selecione o item SubversionSourceControl;
- Expanda o item SourceControl;
- No item Executable, informe o svn.exe que se encontra no diretório de instalação do Visual SVN Server, assim como fizemos no Final Builder.
- Preencha os items Password e Username com o cadastrado no Visual SVN Server;
- Configurações do item SourceControl finalizadas;
- Nos itens principais informe em WebUrl o endereço do repositório do projeto VendasXE, assim como fizemos ao realizar o checkout no tortoise svn;
- No item WorkingDirectory informe o diretório: C:\Projetos\VendasXE;
- A figura 16 mostra como ficará nossas configurações;
Figura 15 – Projeto VendasXE (CCNet Config)
Criando Triggers(Gatilhos)
Após configurarmos nosso projeto informando em qual repositório está os arquivos de código fonte, devemos criar um recurso que fique monitorando o repositório, afim de verificar se houve mudanças. Esse recurso se chama Triggers. Seu funcionamento é idêntico as triggers de banco de dados, irá disparar sempre que algo acontecer, no nosso caso sempre que houver mudanças em nosso repositório.
- Botão direito no sub-item Triggers > Add Trigger > IntervalTrigger;
- Selecione o sub-item adicionado em Triggers(IntervalTrigger);
- A direta no item BuildCondition informe: IfModificationExists;
- No item Seconds informe em segundos o intervalo que seja verificado junto ao repositório se existem modificações;
- Veja como deve ficar na figura 17;
Figura 17 – Criando Triggers (CCNet Config)
Criando Tasks(Tarefas)
Pronto! Trigger configurada para monitorar o repositório, verificando se existem modificações. E agora, se houver modificações? Iremos configurar uma tarefa que será disparada pela trigger caso haja modificações em nosso repositório. Essa tarefa será executar o nosso Build.bat que contém todas as tarefas automatizadas pelo Final Builder.
- Botão direito no sub-item Tasks > Add Task > ExecutableTask;
- Selecione o sub-item adicionado em Tasks(ExecutableTask);
- A direita no item (Executable) informe o caminho completo do nosso Build.bat;
- No item BaseDirectory informe o diretório onde está o arquivo Build.bat;
- Veja como deve ficar na figura 18;
Figura 18 – Criando Tasks (CCNet Config)
Salve tudo e feche o CCNet Config. Antes de mandarmos iniciar o nosso servidor de integração continua, acesse o diretório C:\Projeto botão direito no diretório VendasXE > Tortoise SVN > Revert…. Selecione todos os itens e clique em Ok. Isso deixará o diretório idêntico ao repositório. Execute o CruiseControl.Net. O resultado deverá ser algo parecido com a figura 19. Essa tela deverá ser atualizada de acordo com o intervalo da trigger definida no CCNet Config.
O próximo passo é registrar a DashBoard(Cliente visual do Cruise Control) no IIS(Internet Information Services). O site se encontra no diretório de instalação do CruiseControl.Net: C:\Arquivos de programas\CruiseControl.NET\webdashboard. Irei pular esse passo pelo artigo não abranger IIS. Existem vários artigos e a configuração é bem simples. Após a configuração acesse o endereço da página dashboard e veja o resultado, figura 20. Navegue pelos itens da dashboard e veja as informações que ela lhe fornece sobre todos os builds que foram realizados no projeto VendasXE.
Figura 20 – DashBoard CruiseControl.Net
Todas as configurações relacionadas ao servidor de integração contínua foram finalizadas(Ufffa). Iremos agora realizar o último passo que será instalar um cliente do CruiseControl.Net nas máquinas dos desenvolvedores(clientes). Esse cliente fica na área de notificação do windows informando(feedback) aos desenvolvedores sobre o que está acontecendo no servidor de CI. Com isso, caso alguém commit algo que “quebre” o build, todos os desenvolvedores serão notificados, da mesma forma se tudo ocorreu bem.
CCTray (CruiseControl.Net)
Execute o instalador CruiseControl.NET-CCTrayx.xx.xx.exe.
- A figura 21 mostra a janela inicial de instalação do CCTray;
- Clique em next até chegar em Install(sem mistério) =) ;
- Execute o CCTray;
- A figura 22 mostra a janela principal do CCTray;
Figura 21 – Instalação do CCTray
Figura 22 – Janela Principal CCTray
Agora basta configurar o CCTray para acessar o serviço do CruiseControl.Net.
- Acesse File > Settings;
- Aba Build Projects;
- Clique no botão Add…
- Na janela Project clique no botão Add Server.
- Na janela Build Server marque a opção Connect directly using .Net remoting;
- Informe na caixa de texto o IP do servidor que está executando o CuiseControl.Net;
- Clique em Ok;
- De volta a janela Project deverá aparecer o projeto VendasXE na listagem Avaliable Projects;
- Selecione o Projeto VendasXE e clique em Ok;
- Na janela Tray Settings clique em Ok novamente;
- A imagem 23 mostra a janela principal do CCTray após a configuração;
Figura 23 – CCTray Integrado ao VendasXE
Pronto galera, nosso ambiente esta completamente configurado. Realize o Checkout do Projeto VendasXE na máquina cliente onde foi instalado o CCTray. Realize mudanças no código fonte e commit, veja como o CCTray se comporta. Você pode até injetar um erro no código fonte para ver o resultado.
Conclusão
Galera é isso! Nesse artigo podemos ver na prática como montar um servidor de integração contínua. Busquem ler sobre o assunto e entender cada vez mais o seu processo. Sou capaz de afirmar a vocês que os frutos colhidos com esta técnica é bastante favorável para o crescimento da equipe e do projeto. Estarei a disposição para tirar todas as dúvidas em qualquer etapa do artigo, afinal, o mesmo é um pouco cansativo. Um abraço a todos e não deixem de entrar em contato.
“Tudo é uma questão de Engenharia!”
“Everything is a matter of Engineering!”
At+.