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...')
 
(Página substituída por 'Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando o Jenkins para os projetos desenvolvidos em .NET. O novo modelo...')
 
(3 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
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.
+
Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando o Jenkins para os projetos desenvolvidos em .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 ==
+
O novo modelo de Build adotado pela MSTech encontra-se disponível no link: [//gitlab.mstech.com.br/build-dotnet/cake-mstech/wikis/home Manual do Build/Jenkins]
 
+
=== Arquivos ''*.csproj'' ===
+
Nos arquivos do projeto com extensão .csproj é necessário localizar e comentar o seguinte bloco:
+
 
+
<syntaxhighlight lang="xml" line="1" >
+
<PropertyGroup>
+
    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
+
    <VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
+
</PropertyGroup>
+
</syntaxhighlight>
+
 
+
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:
+
<syntaxhighlight lang="xml" line="1" >
+
<?xml version="1.0" encoding="utf-8"?>
+
<configuration>
+
  <versionNumber>
+
    <Major value="5" />
+
    <Minor value="5" />
+
    <Revision value="7" />
+
    <Build value="1" />
+
  </versionNumber>
+
</configuration>
+
</syntaxhighlight>
+
 
+
Arquivo novo:
+
<syntaxhighlight lang="xml" line="1" >
+
<?xml version="1.0" encoding="utf-8"?>
+
<Project
+
ToolsVersion="4.0"
+
DefaultTargets="Default"
+
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
    <PropertyGroup>
+
<Major>5</Major>
+
<Minor>5</Minor>
+
<Revision>7</Revision>
+
<Build>1</Build>
+
    </PropertyGroup>
+
</Project>
+
</syntaxhighlight>
+
 
+
=== 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
+
 
+
<syntaxhighlight lang="xml" line="1" >
+
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
 
+
  <!-- Simple ZIP task that utilize .NET 4.5 Zip Compression -->
+
  <!--
+
    Example
+
    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
+
        ToolsVersion="4.0" DefaultTargets="Sample" >
+
      <Import Project="Zip.targets" />
+
      <Target Name="Sample" >
+
          <Zip SourceFolder="C:\SomeFolder\" OutputFileName="output.zip" />
+
      </Target>
+
    </Project>
+
    you can run this project with msbuild   
+
  -->
+
  <UsingTask TaskName="Zip" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
+
    <ParameterGroup>
+
      <SourceFolder ParameterType="System.String" Required="true"/>
+
      <OutputFileName ParameterType="System.String" Required="true" />
+
      <NoBackup ParameterType="System.Boolean" Required="false" />     
+
    </ParameterGroup>
+
    <Task>
+
      <Reference Include="System.Core" />
+
      <Reference Include="Microsoft.CSharp" />
+
      <Reference Include="System.IO.Compression" />
+
      <Reference Include="System.IO.Compression.FileSystem" />
+
      <Using Namespace="System" />
+
      <Using Namespace="System.IO" />
+
      <Using Namespace="System.Net" />
+
      <Using Namespace="System.Linq" />     
+
      <Using Namespace="System.Reflection" />
+
      <Using Namespace="Microsoft.Build.Framework" />
+
      <Using Namespace="Microsoft.Build.Utilities" />
+
      <Using Namespace="System.IO.Compression" />
+
      <Code Type="Fragment" Language="cs">
+
        <![CDATA[
+
                try {
+
                    SourceFolder = Path.GetFullPath(SourceFolder);
+
                    OutputFileName = Path.GetFullPath(OutputFileName);
+
                     
+
                    Log.LogMessage("Package zip... (" + OutputFileName + " )");
+
                   
+
                    // Prepare output temp file
+
                    var tmpFile = Path.ChangeExtension(OutputFileName, ".zip.tmp");
+
                    File.Delete(tmpFile);
+
                    // Zip folder
+
                    ZipFile.CreateFromDirectory(SourceFolder, tmpFile);
+
                    // Replace output file
+
                    File.Delete(OutputFileName);
+
                    File.Move(tmpFile, OutputFileName);
+
                    return true;
+
                }
+
                catch (Exception ex) {
+
                    Log.LogErrorFromException(ex);
+
                    return false;
+
                }
+
            ]]>
+
      </Code>
+
    </Task>
+
  </UsingTask>
+
</Project>
+
</syntaxhighlight>
+
 
+
=== 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:
+
<syntaxhighlight lang="xml" line="1" >
+
<?xml version="1.0" encoding="utf-8"?>
+
<Project
+
ToolsVersion="4.0"
+
DefaultTargets="Compile"
+
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+
<!-- CLASSE NECESSÁRIA PARA REALIZAR O ZIP DOS ARQUIVOS, CASO MUDAR A ESTRUTURA PRECISA ATUALIZAR O CAMINHO DE ONDE VAI FICAR -->
+
<Import Project="Zip.targets" />
+
+
<PropertyGroup>
+
<!-- NOME DA APLICAÇÃO [SITE] -->
+
<ProjectName>NomeDoSite</ProjectName>
+
+
<!-- DIRETÓRIO DA APLICAÇÃO RAIZ -->
+
<ProjectDir>$(ProjectName)\</ProjectDir>
+
+
<!-- NOME DO CSPROJ DA APLICAÇÃO [SITE], CASO O NOME NÃO FOR O MESMO DO <PROJECTNAME> ALTERAR -->
+
<CSProjName>$(ProjectName).csproj</CSProjName>
+
+
<!-- CAMINHO DE ONDE ESTÁ O ARQUIVO CSPROJ DA SOLUÇÃO [SITE] -->
+
<ProjectPath>$(ProjectDir)$(CSProjName)</ProjectPath>
+
+
<!-- PASTA AUXILIAR PARA JOGAR A COMPILAÇÃO, ZIPAR E NO FIM É EXCLUIDA -->
+
<TargetDir>PackageBuild\</TargetDir>
+
+
<!-- PASTA DEFAULT ONDE SERÁ COLOCADO AS DLL APÓS A COMPILAÇÃO DENTRO DO DIRETÓRIO AUXILIAR -->
+
<TargetBinDir>$(TargetDir)\bin</TargetBinDir>
+
+
<!-- ONDE VAI FICAR O ZIP DO BUILD -->
+
<TargetBuildZip>Builds</TargetBuildZip>
+
 
+
<!-- NÃO ALTERAR -->
+
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
+
<BuildPlatform Condition=" '$(BuildPlatform)' == '' ">Any CPU</BuildPlatform>
+
</PropertyGroup>
+
+
<ItemGroup>
+
<BuildArtifactsDir Include="$(TargetBinDir)\" />
+
<ProjectsToBuild Include="$(ProjectDir)\$(CSProjName)"/>
+
</ItemGroup>
+
+
<Import Project="$(ProjectDir)\version.xml" />
+
+
<!-- LIMPA OS REGISTROS CASO EXISTA, E CRIA A PASTA PADRÃO ONDE FICARÁ OS ZIP -->
+
<Target Name="Clean">
+
<MakeDir Directories="$(TargetBuildZip)"/>
+
        <RemoveDir Directories="$(TargetDir)" />
+
    </Target>
+
+
<!-- COPIA OS ARQUIVOS NECESSÁRIOS DO SITE [ITEMS QUE ESTÁ DENTRO DO CSPROJ ex:(<Content Include="Administracao\Configuracoes\Configuracao\Busca.aspx" />)] -->
+
<Target Name="CopyProject" DependsOnTargets="Clean">
+
<!-- Get list of CS and RES files -->
+
<XmlPeek
+
Namespaces="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
+
XmlInputPath="$(ProjectPath)"
+
Query="/msb:Project/msb:ItemGroup/msb:Content/@Include|/msb:Project/msb:ItemGroup/msb:EmbeddedResource/@Include">
+
 
+
<Output TaskParameter="Result" ItemName="Peeked" />
+
 
+
</XmlPeek>
+
<!-- Copy source and resource files -->
+
<Copy
+
SourceFiles="@(Peeked->'$(ProjectDir)%(RelativeDir)%(Filename)%(Extension)')"
+
DestinationFiles="@(Peeked->'$(TargetDir)%(RelativeDir)%(Filename)%(Extension)')"/>
+
<!-- Copy project file -->
+
<Copy
+
SourceFiles="$(ProjectPath)"
+
DestinationFiles="$(ProjectDir)$(CSProjName)"/>
+
 
+
<MSBuild Projects="$(ProjectDir)$(CSProjName)"/>
+
 
+
</Target>
+
+
<!-- LIMPA A PASTA BIN DA PASTA AUXILIAR CASO EXISTA -->
+
<Target Name="CleanBin" DependsOnTargets="CopyProject">
+
        <RemoveDir Directories="$(TargetBinDir)" />
+
    </Target>
+
+
<!-- REALIZA O BUILD DA SOLUÇÃO GERANDO AS DLL's -->
+
<Target Name="BuildCompile" DependsOnTargets="CleanBin">
+
<MSBuild Projects="@(ProjectsToBuild)" Targets="Rebuild"
+
                  Properties="outdir=%(BuildArtifactsDir.FullPath);Configuration=$(Configuration)" />
+
    </Target>
+
+
<!-- REALIZA O ZIP DA PASTA AUXILIAR E JOGA PARA A PASTA PADRÃO ONDE FICARÁ O ZIP -->
+
<Target Name="Zip" DependsOnTargets="BuildCompile" >
+
<Zip SourceFolder="$(TargetDir)" OutputFileName="$(TargetBuildZip)\$(ProjectName)_$(Major).$(Minor).$(Revision).$(Build).zip" />
+
    </Target>
+
+
<!-- APAGA A PASTA AUXILIAR -->
+
<Target Name="Compile" DependsOnTargets="Zip">
+
        <RemoveDir Directories="$(TargetDir)" />
+
    </Target>
+
 
+
</Project>
+
</syntaxhighlight>
+
 
+
== Configurando o Build no Jenkins ==
+

Edição atual tal como às 15h54min de 28 de outubro de 2016

Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando o Jenkins para os projetos desenvolvidos em .NET.

O novo modelo de Build adotado pela MSTech encontra-se disponível no link: Manual do Build/Jenkins