Mudanças entre as edições de "Build utilizando Jenkins"

De MSTECH wiki
Ir para: navegação, pesquisa
(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...')
(Sem diferença)

Edição das 19h51min de 29 de junho de 2016

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