Build utilizando Jenkins

De MSTECH wiki
Revisão de 19h51min de 29 de junho de 2016 por Daniel.alves (Discussão | contribs) (Criou página com 'Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando a plataforma Jenkins para os projetos que usam .NET. Para tanto, algumas...')

(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para: navegação, pesquisa

Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando a plataforma Jenkins para os projetos que usam .NET. Para tanto, algumas alterações no projeto são necessárias para que o Build possa ser executado utilizando-se o próprio MSBUILD, e não a versão do Visual Studio no qual o sistema foi desenvolvido.

Alterações necessárias no Projeto

Arquivos *.csproj

Nos arquivos do projeto com extensão .csproj é necessário localizar e comentar o seguinte bloco:

1 <PropertyGroup>
2     <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
3     <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
4 </PropertyGroup>

No exemplo acima, o sistema foi desenvolvido utilizando a versão 10.0 do Visual Studio, e para que o MSBUILD possa compilar o projeto faz-se necessário comentar ou remover o bloco <PropertyGroup>.

Version.xml

É necessário alterar a estrutura do arquivo version.xml para atender a necessidade do sistema de build. Vale ressaltar que, como alguns sistemas fazem a leitura deste arquivo, faz-se necessária a alteração no sistema para efetuar a correta leitura do novo arquivo.

Arquivo antigo:

1 <?xml version="1.0" encoding="utf-8"?>
2 <configuration>
3   <versionNumber>
4     <Major value="5" />
5     <Minor value="5" />
6     <Revision value="7" />
7     <Build value="1" />
8   </versionNumber>
9 </configuration>

Arquivo novo:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Project
 3  ToolsVersion="4.0"
 4  DefaultTargets="Default"
 5  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 6     <PropertyGroup>
 7 	<Major>5</Major>
 8 	<Minor>5</Minor>
 9 	<Revision>7</Revision>
10 	<Build>1</Build>
11     </PropertyGroup>
12 </Project>

Zip.targets

É necessário incluir na raiz da solução o arquivo Zip.targets, que é responsável por compactar o pacote com o número da versão constante no arquivo version.xml.

  • Nota: A extensão do arquivo é .targets

Conteúdo do arquivo zip.targets

 1 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 2 
 3   <!-- Simple ZIP task that utilize .NET 4.5 Zip Compression -->
 4   <!--
 5     Example
 6     <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
 7          ToolsVersion="4.0" DefaultTargets="Sample" >
 8       <Import Project="Zip.targets" />
 9       <Target Name="Sample" >
10           <Zip SourceFolder="C:\SomeFolder\" OutputFileName="output.zip" />
11       </Target>
12     </Project>
13     you can run this project with msbuild    
14   -->
15   <UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
16     <ParameterGroup>
17       <SourceFolder ParameterType="System.String" Required="true"/>
18       <OutputFileName ParameterType="System.String" Required="true" />
19       <NoBackup ParameterType="System.Boolean" Required="false" />      
20     </ParameterGroup>
21     <Task>
22       <Reference Include="System.Core" />
23       <Reference Include="Microsoft.CSharp" />
24       <Reference Include="System.IO.Compression" />
25       <Reference Include="System.IO.Compression.FileSystem" />
26       <Using Namespace="System" />
27       <Using Namespace="System.IO" />
28       <Using Namespace="System.Net" />
29       <Using Namespace="System.Linq" />      
30       <Using Namespace="System.Reflection" />
31       <Using Namespace="Microsoft.Build.Framework" />
32       <Using Namespace="Microsoft.Build.Utilities" />
33       <Using Namespace="System.IO.Compression" />
34       <Code Type="Fragment" Language="cs">
35         <![CDATA[
36                 try {
37                     SourceFolder = Path.GetFullPath(SourceFolder);
38                     OutputFileName = Path.GetFullPath(OutputFileName);
39                       
40                     Log.LogMessage("Package zip... (" + OutputFileName + " )");
41                     
42                     // Prepare output temp file
43                     var tmpFile = Path.ChangeExtension(OutputFileName, ".zip.tmp");
44                     File.Delete(tmpFile);
45                     // Zip folder
46                     ZipFile.CreateFromDirectory(SourceFolder, tmpFile);
47                     // Replace output file
48                     File.Delete(OutputFileName);
49                     File.Move(tmpFile, OutputFileName);
50                     return true;
51                 }
52                 catch (Exception ex) {
53                     Log.LogErrorFromException(ex);
54                     return false;
55                 }
56             ]]>
57       </Code>
58     </Task>
59   </UsingTask>
60 </Project>

Build.xml

Todo o processo de Build está atrelado ao arquivo build.xml desenvolvido para orquestrar a execução do build dos sistemas em .NET. Este arquivo deve estar na raiz da solução.

A estrutura do arquivo é a seguinte:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <Project
 3  ToolsVersion="4.0"
 4  DefaultTargets="Compile"
 5  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 6  
 7 	<!-- CLASSE NECESSÁRIA PARA REALIZAR O ZIP DOS ARQUIVOS, CASO MUDAR A ESTRUTURA PRECISA ATUALIZAR O CAMINHO DE ONDE VAI FICAR -->
 8 	<Import Project="Zip.targets" />
 9  
10 	<PropertyGroup>
11 		<!-- NOME DA APLICAÇÃO [SITE] -->
12 		<ProjectName>NomeDoSite</ProjectName>
13 		
14 		<!-- DIRETÓRIO DA APLICAÇÃO RAIZ -->
15 		<ProjectDir>$(ProjectName)\</ProjectDir>
16 		
17 		<!-- NOME DO CSPROJ DA APLICAÇÃO [SITE], CASO O NOME NÃO FOR O MESMO DO <PROJECTNAME> ALTERAR -->
18 		<CSProjName>$(ProjectName).csproj</CSProjName>
19 		
20 		<!-- CAMINHO DE ONDE ESTÁ O ARQUIVO CSPROJ DA SOLUÇÃO [SITE] -->
21 		<ProjectPath>$(ProjectDir)$(CSProjName)</ProjectPath>
22 		
23 		<!-- PASTA AUXILIAR PARA JOGAR A COMPILAÇÃO, ZIPAR E NO FIM É EXCLUIDA -->
24 		<TargetDir>PackageBuild\</TargetDir>
25 		
26 		<!-- PASTA DEFAULT ONDE SERÁ COLOCADO AS DLL APÓS A COMPILAÇÃO DENTRO DO DIRETÓRIO AUXILIAR -->
27 		<TargetBinDir>$(TargetDir)\bin</TargetBinDir>
28 		
29 		<!-- ONDE VAI FICAR O ZIP DO BUILD -->
30 		<TargetBuildZip>Builds</TargetBuildZip>
31 
32 		<!-- NÃO ALTERAR -->
33 		<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
34 		<BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
35 	</PropertyGroup>
36 	
37 	<ItemGroup>
38 		<BuildArtifactsDir Include="$(TargetBinDir)\" />
39 		<ProjectsToBuild Include="$(ProjectDir)\$(CSProjName)"/>
40 	</ItemGroup>
41 	
42 	<Import Project="$(ProjectDir)\version.xml" />
43 	
44 	<!-- LIMPA OS REGISTROS CASO EXISTA, E CRIA A PASTA PADRÃO ONDE FICARÁ OS ZIP -->
45 	<Target Name="Clean">
46 		<MakeDir Directories="$(TargetBuildZip)"/>
47         <RemoveDir Directories="$(TargetDir)" />
48     </Target>
49 	
50 	<!-- COPIA OS ARQUIVOS NECESSÁRIOS DO SITE [ITEMS QUE ESTÁ DENTRO DO CSPROJ ex:(<Content Include="Administracao\Configuracoes\Configuracao\Busca.aspx" />)] -->
51 	<Target Name="CopyProject" DependsOnTargets="Clean">
52 	 <!-- Get list of CS and RES files -->
53 		 <XmlPeek
54 		 Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
55 		 XmlInputPath="$(ProjectPath)"
56 		 Query="/msb:Project/msb:ItemGroup/msb:Content/@Include|/msb:Project/msb:ItemGroup/msb:EmbeddedResource/@Include">
57 
58 		 <Output TaskParameter="Result" ItemName="Peeked" />
59 
60 		 </XmlPeek>
61 		 <!-- Copy source and resource files -->
62 		 <Copy
63 		 SourceFiles="@(Peeked->'$(ProjectDir)%(RelativeDir)%(Filename)%(Extension)')"
64 		 DestinationFiles="@(Peeked->'$(TargetDir)%(RelativeDir)%(Filename)%(Extension)')"/>
65 		 <!-- Copy project file -->
66 		 <Copy
67 		 SourceFiles="$(ProjectPath)"
68 		 DestinationFiles="$(ProjectDir)$(CSProjName)"/>
69 
70 		 <MSBuild Projects="$(ProjectDir)$(CSProjName)"/>
71 
72 	</Target>
73 	
74 	<!-- LIMPA A PASTA BIN DA PASTA AUXILIAR CASO EXISTA -->
75 	<Target Name="CleanBin" DependsOnTargets="CopyProject">
76          <RemoveDir Directories="$(TargetBinDir)" />
77     </Target>
78 	
79 	<!-- REALIZA O BUILD DA SOLUÇÃO GERANDO AS DLL's -->
80 	<Target Name="BuildCompile" DependsOnTargets="CleanBin">
81 	<MSBuild Projects="@(ProjectsToBuild)" Targets="Rebuild"
82                   Properties="outdir=%(BuildArtifactsDir.FullPath);Configuration=$(Configuration)" />
83     </Target>
84 	
85 	<!-- REALIZA O ZIP DA PASTA AUXILIAR E JOGA PARA A PASTA PADRÃO ONDE FICARÁ O ZIP -->
86 	<Target Name="Zip" DependsOnTargets="BuildCompile" >
87 		<Zip SourceFolder="$(TargetDir)" OutputFileName="$(TargetBuildZip)\$(ProjectName)_$(Major).$(Minor).$(Revision).$(Build).zip" />
88     </Target>
89 	
90 	<!-- APAGA A PASTA AUXILIAR -->
91 	<Target Name="Compile" DependsOnTargets="Zip">
92          <RemoveDir Directories="$(TargetDir)" />
93     </Target>
94 
95 </Project>

Configurando o Build no Jenkins