Bom agora que já temos nosso WebSite compilando através do Team Build, vamos começar a configurar o Deploy desse Site em um servidor.

Nessa parte, vou fazer um paralelo de como faríamos se fizemos o mesmo procedimento usando uma WebApplication.

Inicialmente, vou falar um pouco da estrutura estrutura diferente dos dois tipos de projetos.

Quando criamos um WebSite project no Visual Studio, automaticamente um arquivo da solution é criado. Até aí nada demais, afinal o Visual Studio faz isso para qualquer novo projeto. O ponto diferente é que para o WebSite, nós não temos um arquivo de projeto! e aí começam alguns de nossos problemas…

O arquivo *.vbproj ou *.csproj nada mais é do que um script do MSBUILD, onde existem algumas configurações informando o que deve ser feito na hora da compilação do projeto e isso é essecial para o TeamBuild.

O Team Build encapsula algumas informações para nós, deixando toda essa configuração e customização mais fácil, mas em um dado momento de seu workflow ele simplesmente pega o arquivo do seu projeto, passa ele como parametro para o MSBUILD que irá realizar a compilação.

O MSBUILD por padrão aceita dois tipo de arquivo o *.vbproj ou *.csproj e o *.sln. A grande diferença é que nos *.*proj temos alguns scripts já implementados e quando usamos o *.sln o MSBUILD irá usar as configurações básicas instaladas, não tendo disponível nenhum target (tarefas que devem ser executadas para compilar o projeto) diferente que possuem alguns parametros a mais, como por exemplo o DeployOnBuild.

Qual é o impacto disso para o nosso deploy ? Simples, a primeira coisa que precisamos fazer para que possamos fazer o deploy automático é criar um pacote. Esse pacote que contém todos os arquivos necessários do nosso site e alguns arquivos de configuração que o MSDeploy irá utilizar.

Para criar o pacote, no caso de uma WebApplication, precisamos apenas passar um parametro para o MSBUILD e ele montará o pacote para nós. Vamos ver o exemplo:

Primeiro, teamos que criar uma  Build Definition para a Web Application (igual aos passos anteriores) e adicionar esse parametro, para isso abra sua build definition novamente e vá até a aba Process, conforme imagem abaixo:

image

Na aba de processo, vamos no item 3 Advanced e vamos procurar o parametro MSBUILD Arguments e vamos adicionar o parametro /p:DeployOnBuild=true a mais que vai fazer que um pacote já seja criado durante a compilação de uma Web Application.

image

Pronto, feito isso, enfilere uma build e depois vamos no diretório onde o Site foi compilado para ver o pacote criado.

Depois de gerar a build e a compilação ter sido concluída com sucesso, vamos no seguinte diretório: (Esse caminho é o padrão da configuração do Team Build e dos Agentes, então caso você tenha feito alguma configuração diferente o caminho pode variar).

Abra o Windows explorer e vá no seguinte caminho: C:\Builds\1 dali para frente, basta navegar nas pastas seguindo a seguinte lógica :

  • Nome do team project
  • Nome da Build Definition

Ao chegar na Build escolhida, vamos no diretório de Binários e no diretório onde contém os sites publicados. No meu exemplo esse caminho completo seria:

C:\Builds\1\TeamBuild\WebApp\Binaries\_PublishedWebsites

Olhando dentro desse diretório, veremos duas pastas. WebApp1 que contém os arquivos do Site e a pasta WebApp1_Package que contém o pacote que será utilizado para deploy.

(Não é escopo desses posts falar sobre a estrutura de arquivos do pacote, apenas como gerar de forma automática.)

Se fizermos a mesma coisa com a Build Definition do WebSite, ou seja, adicionar o parametro no MSBuild Arguments e formos no diretório, veremos que teremos quase todas as pastas iguais, menos a referente ao pacote.

Isso acontece porque o parametro de DeployOnBuild=true é um parametros que o script de MSBUILD (*.*proj) conhece e executa algumas atividades a mais para gerar o pacote. Como no projeto do WebSite não temos isso, teremos que montar “na mão” essa geração do pacote.

Para criar a geração do pacote, iremos utilizar o MSDeploy que é um componente utilizado para realizar deploy que foi desenvolvido pela microsoft e é instalado quando instalamos o Web Deploy. Para mais informações acesse : http://www.iis.net/download/webdeploy

Criando o Pacote para um WebSite

Já que não temos algumas facilidades, precisamos alterar o Workflow de build e adicionar uma tarefa que utilize o MSDeploy para realizar a geração do pacote. Para isso iremos utilizar como base da nossa customização o processo padrão o Default Template.

Para alterar o workflow de Build, vá no source control e entre nas seguintes pastas:

No nosso exepmlo: $/TeamBuild/BuildProcessTemplates e abra o arquivo DefaultTemplate.xaml

A seguinte tela será apresentada:

image

Esse é o workflow padrão utilizado pelo servidor de TeamBuild para compilar nosso projeto. Como não é escopo desse post, não entrarei em detalhes de como funciona esse procedimento e suas tarefas.

Para o nosso exemplo, vamos adicionar uma tarefa chamada da Invoke Process em um ponto especifico do workflow. A tarefa Invoke Process fica na toolbox no grupo Team Foundation Build Activities.

image

A nossa tarefa deve ser adicionada logo após a compilação do nosso website, por isso, procure dentro do workflow a sequencia de atividades chamada: Try Compile, Test, and Associate Changesets and Work Items e bem no final dela, arraste e solte a tarefa InvokeProcess, conforme figura abaixo:

image

Ao adicionar a tarefa bem no final dessa sequencia de atividades, a tarefa aparecerá com um ícone vermelho de exclamação, isso ocorre porque precisamos passar alguns parametros para que o Invoke Process funcione.

Para isso, abra as propriedade da tarefa (aperte F4) e vamos preencher os campos:

image

Arguments: String.Format(“-verb:sync -source:contentPath=””{0}\_PublishedWebSites\WebSite1\”” -dest:package=””c:\site\teste.zip”” “, BinariesDirectory)

DisplayName: Criação do Pacote

FileName: String.Format(” “”c:\Program Files\IIS\Microsoft Web Deploy V2\MSDeploy.exe”” “)

Como nesse primeiro momento queremos garantir apenas a criação do pacote, vamos deixar algumas informações do Arguments de maneira fixa, mais tarde iremos deixar mais dinâmico.

Obs: O caminho que você informar onde o pacote será criado, o usuário do teambuild tem que ter permissão de escrita, caso contrário o pacote não será criado. Para fins de exemplo, crie o diretório Site e dê permissão para todos.

Dica: Se você estiver com problemas para debugar, na tarefa Invoke Process tem dois espaços para você adicionar uma tarefa. Nela podemos adicionar uma tarefa que escreva no log da Build para identificar os possiveis problemas. para isso, arraste a tarefa do tipo WriteBuildMessage  e no parametro, coloque a string de Output de cada um dos Handles,

image

Feito isso, salve o template e faça o check-in do arquivo, caso contrário o TFS não irá executar essa nossa customização.

Depois de ter feito o check-in, gere uma nova build e quando ela finalizar com sucesso, vá no diretório onde definimos que estaria o nosso pacote para ver se ele foi criado.

Claudio Leite

Claudio Leite é consultor de ALM da Lambda3, Visual Studio ALM Ranger, PSD, PSM I e PSM II. Graduado em Ciência da Computação pela Universidade Católica de Petrópolis, MBA e POS-MBA em Gestão de Projetos pela Fundação Getúlio Vargas. Twitter: @claudiobernardo