65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Jenkins、MSBuild、NuGet 和 Git 进行持续集成(第一部分)

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3投票s)

2013年4月23日

CPOL

3分钟阅读

viewsIcon

20948

在本博客系列中,我将向您解释如何设置持续集成。

最近我一直在使用 MSbuild 为我的 C# 项目设置一些持续集成 (CI)。在本博客系列中,我将向您解释如何设置持续集成。

首先,我们将创建一个 MSBuild 脚本来编译我们的代码。我们还将创建一个小的批处理文件,以便轻松执行 MSbuild 脚本。

在准备就绪后,我们将向构建脚本添加几个目标,以运行例如单元测试、集成测试、代码覆盖率、打包等。

因此,我们将采用敏捷方法,并根据验证学习改进我们的构建过程。

首先,我们需要了解 MSbuild 的一些基本知识。我认为网上有足够的页面可以为您提供基本的介绍。一个好的起点是 MSDN 文档 关于 MSBuild。

让我们假设我们在 Git 仓库 / 本地文件系统中具有以下项目结构。

  • src(包含我们的源代码)
  • lib(包含构建输出以及 NuGet 上不可用的第三方库)
  • reports(包含代码覆盖率报告、测试场景和测试结果)
  • ci.msbuild(您的 msbuild 文件)
  • ci.msbuild.cmd(您的批处理文件,用于在本地机器上执行构建)

ci.msbuild

在构建文件的第一个版本中,我们只有一个目标(Compile)。此目标将构建我们的项目。我们不使用解决方案文件,因为有人可以在解决方案配置中禁用项目。通过显式使用项目,我们可以确保构建所有必要的项目。我们还有一个 PropertyGroup 来定义一些变量。

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         DefaultTargets="Compile">
  <PropertyGroup>
    <Configuration>Debug</Configuration>
    <Platform>AnyCPU</Platform>
    <DefineSolutionProperties>false</DefineSolutionProperties>

    <!-- General Paths -->
    <RootPath>$(MSBuildProjectDirectory)</RootPath>
    <SrcPath>$(RootPath)\src</SrcPath>
    <ReportsPath>$(RootPath)\reports</ReportsPath>
    <ToolsPath>$(RootPath)\tools</ToolsPath>
    <Packages>$(SrcPath)\packages</Packages>
  </PropertyGroup>
  
  <Target Name="Compile">
    <Message Importance="high" Text="Compiling projects"/>
    <MSBuild Projects="$(SrcPath)\MyProject.Core\MyProject.Core.csproj"
             Properties="Configuration=$(Configuration);Platform=$(Platform)" />
    <MSBuild Projects="$(SrcPath)\MyProject.Web\MyProject.Web.csproj;$(SrcPath)\MyProject.Win\MyProject.Win.csproj"
             Properties="Configuration=$(Configuration);Platform=$(Platform)"
             BuildInParallel="true" />    
  </Target>
</Project>
</noscript>

ci.msbuild.cmd

使用以下批处理文件,我们可以轻松执行构建脚本并提供构建配置。

@echo off 

setlocal
set msbuild="C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe"

set /p configChoice=Choose your build configuration (Debug = d, Release = r? (d, r)

if /i "%configChoice:~,1%" EQU "D" set config=Debug
if /i "%configChoice:~,1%" EQU "R" set config=Release

%msbuild% _ci.msbuild /nologo /m /v:m /t:Compile /p:Configuration=%config%

pause
endlocal

如您所见,我们使用 msbuild.exe 并将我们的 ci.msbuild 文件作为参数传递。/nologo 参数会从控制台输出中删除一些 msbuild 标题文本。/m 参数会根据您的机器中可用的处理器启用并行构建。/v:m 参数将详细程度设置为最小,因此不会将所有内容输出到控制台。/t:Compile 参数告诉 msbuild.exe 执行构建文件中的 Compile 目标,而 /p:Configuration=%config% 参数会将我们的构建配置(Debug/Release)注入到构建中。

如果我们跳过 /p 参数,默认配置将为 Debug,如构建脚本的 PropertyGroup 中定义。如果我们跳过 /t 参数,默认目标 Compile 将被执行,如我们的 msbuild 文件中定义。

因此,现在您可以使用一个简单的批处理文件来构建您的项目。在博客的下一部分中,我将描述添加一个 LoadNuGetPackages 目标,该目标将根据您的包配置下载所有 NuGet 包。至少我们今天大多数人都使用 NuGet。我们还将添加一个 Clean 目标,该目标将在我们再次编译之前清理我们的目录,这样我们就不会被早期编译的旧程序集所困扰。请与您的朋友分享这篇文章,并期待本系列的下一部分 :D

文章 使用 Jenkins、MSBuild、NuGet 和 Git 进行持续集成(第一部分) 最初发表在 Marco Franssen 上。

© . All rights reserved.