|
|
(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="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
| + | |
− | 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 ==
| + | |
Esta página tem como objetivo orientar os colaboradores na correta configuração do Build utilizando o Jenkins para os projetos desenvolvidos em .NET.