Build utilizando Jenkins
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.
Índice
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="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
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>