用MSBuild和Jenkins搭建持续集成环境(2)
这是持续集成系列的下半部分,如果你还没看过上半部分的话,请点击这里:用MSBuild和Jenkins搭建持续集成环境(1)。
与Jenkins相会
Jenkins在2004年由Kohsuke Kawaguchi创建,最开始的名字叫Hudson。Kawaguchi当时在Sun工作,Sun直到2008年一直为Hudson提供支持,但是当它 被Oracle收购以后,Oracle和Hudson的开发者社区出现了分歧。2011年,Oracle宣称了对Hudson商标的所有权,Hudson 开发社区于是将Hudson改名叫Jenkins,摆脱了Oracle的干扰,继续开发工作。
第一眼看上去,Jenkins像是一个专为Java项目准备的持续集成工具:有为Maven项目设计的job,有诸多为Java项目提供的默认插件,更不要说那些用Java写的插件了。
但Jenkins其实是一个非常灵活的工具,它可以结合各种版本管理系统和构建工具,用来构建任何类型的项目。在这篇文章中,我们会利用它的灵活 性,从Mercurial中pull代码,用MSbuild构建项目。首先,我们需要下载并安装Jenkins,然后安装Mercurial和 MSBuild插件。
配置Jenkins
从官方网站下载安装程序。它的Windows安装包很简单,会把Jenkins安装成Windows服务。Jenkins的默认的访问路径是http://localhost:8080,请确保8080端口不要被其他应用占用。
安装完毕以后就是装插件。请点击“Manage Jenkins”链接,然后再点击“Manage Plugins”。在“Available”标签页可以查看当前可安装的插件──你需要有一个能上网的环境,才能看到这一页的内容。用filter找到 Mercurial和 MSBuild插件,点击插件名称前面的单选框,进行安装。你可以点击“Installed”标签页,来确保这两个插件已经被安装成功了。在安装过程中, 你可能会看到提示信息说Jenkins需要重启才能完成安装,请让它重启,等重启完成后再访问“Installed”标签页,看看是不是安装成功。
Mercurial插件还需要做一些配置,才能让Jenkins找到Mercurial的安装路径。回到“Manage Jenkins”这一页上来,点击“Configure System”,找到“Mercurial”这一部分──如果你找不到“Mercurial”的话,就说明Mercurial插件没有装好──点击 “Add Mercurial”按钮之后,你需要给这个Mercurial实例起个名字(自己用着越方便越好);还需要输入Mercurial可执行文件的安装路 径,这里用的是hg.exe文件的所在目录;最后是可执行文件的名字,就用“INSTALLATION/hg.exe”就好,INSTALLATION这 个单词会被前面输入的安装路径替换掉。
创建一个Jenkins Job
点击“Back to Dashboard”,回到Dashboard上来,然后点击“New Job”链接。你会看到一组job类型,选择“Build a free-style software project”,给它命名为“HelloCI-RunUnitTests”,点击OK。
下一步是job配置页面。这一页有很多配置项,而且大多数都带有详细的描述信息,点击右侧的帮助图标就可以看到。我们现在只配置两部分,一是代码库所在位置,二是如何用MSBuild构建项目。
找到“Source Code Management”,选择Mercurial。在“Mercurial Version”输入框中输入先前在“Configure System”中配置的Mercurial名称。然后在Repository URL中输入Mercurial版本库的URL(也可以是一个文件系统的路径)。最后在Branch中输入你想跟踪的分支名。
接下来到“Build”这部分。点击“Add build step”按钮后,下拉框中就会出现一系列的step类型以供选择,其中便包括“Build a Visual Studio project or solution using MSBuild”,如果你没看到这个选项,就说明MSBuild插件没有正确安装。
点击“Build a Visual Studio project or solution using MSBuild”之后,在“MSBuild Build File”输入框中输入构建脚本的名字:HelloCI.msbuild。我们想让Jenkins执行“RunUnitTests”这个Target ,如果你没有把DefaultTargets属性设成RunUnitTests的话,可以在“Command Line Arguments”中输入“/t:RunUnitTests”,其中/t是/target的简写。
点击“Save”或“Apply”保存之后,这个job一旦被触发,就可以pull代码下来,编译项目,执行单元测试。我们先来手工触发一次,看看 配置是否正确。先回到Dashboard,这时可以在屏幕中央看到我们的job。点击job名字,然后在左侧的链接中找到“Build Now”链接,点击它,Jenkins就会开始执行。在这组链接的下方有一个“Build History”列表,它显示的是这个job的所有构建历史,当第一次构建开始运行的时候,你会在列表中看到一个进度条,同时还有一个小圆球显示构建状 态。圆球闪烁表示构建正在进行中,它停止闪烁的时候一般会是红色或蓝色,红色表示构建失败,蓝色表示成功。
如果这个job能够访问Mercurial版本库,找到了HelloCI.msbuild脚本,“RunUnitTest”执行成功,这个圆球应该 会变蓝。这时候你也就顺利完成了第一个Jenkins构建。如果构建失败,请点击“Build History”对应的编号查看详细信息,然后点击“Console Output”,就可以看到Jenkins所执行的每一个命令和对应结果,从中可以分析出构建失败的原因。
触发构建
构建成功以后,下一步要做的就是让Jenkins检测版本库的变化,一旦有代码提交,Jenkins就要pull代码并执行构建。有好几种方法可以 做到这一点。最简单的就是让Jenkins定时构建,但是如果在这一段时间内没有代码提交,这次构建反而是浪费。另一种方式是让Jenkins定时轮询, 看看版本库中是否有代码提交。这种方法的缺点是当有了代码提交以后,Jenkins要等到下一个轮询周期才能执行构建。当然,你也可以让Jenkins每 分钟都轮询一次,尽可能缩短等待时间,但我们还有另一种更优雅的方案──给Mercurial版本库中放一个post-commit的钩子,这样一旦版本 库接受了新代码,它都会通知Jenkins,让它立刻开始构建。
这个方法需要在.hg目录下的配置文件中(.hgrc)添加一个钩子。在这个钩子里面,你需要让Mercurial访问下面这个网 址:http://localhost:8080/job/JOBNAME/build?delay=0sec(JOBNAME需要替换成真实的job名 称),让Jenkins启动构建。但不幸的是,Windows下没有类似Linux wget这样可以进行HTTP请求的工具。我自己写了行Ruby代码来做这项工作。你也可以用Powershell来创建一个 System.Net.WebClient的实例,然后调用DownloadString方法。读者朋友可以自己完成这项工作,权当练习吧。
如果你不愿意用这个方法,就还用轮询吧。回到job配置页面,在“Build Trigger”区域选择“Poll SCM”,在“Schedule”输入框中输入轮询周期。它采用的语法格式是cron的风格。如果要每分钟轮询一次,就输入“1 * * * *”。你可以点击输入框右侧的帮助按钮,查看轮询周期的语法介绍。
构建流水线
Jenkins可以在某个构建成功结束之后启动其他job。于是就有了构建流水线,它的概念就是一个job成功之后触发其他job。触发者叫做上游job,被触发者被称作下游job。
构建流水线的应用场景有很多:让耗时较长的测试在单元测试结束之后执行;运行静态代码检查;把构建结果部署到试机环境(staging)或者产品环境中。我们下面来演示一下这个功能,让Jenkins在构建结束后启动web服务器,运行HelloCI这款应用。
我们只需要做三件事情:HelloCI-RunUnitTests job成功之后触发一个新job;把HelloCI-RunUnitTests的构建结果拷贝出来;启动web服务器。在开始之前,你还需要安装Copy Artifacts插件。回到Manage Plugins页面,参考之前安装Mercurial插件的方法安装Copy Artifacts。在看到重启的提示信息时重启Jenkins。
创建新job之前,我们需要告诉HelloCI-RunUnitTests job,让它把构建产物保存下来,以供新job使用。回到HelloCI-RunUnitTests job的配置界面,找到“Post-build Action”,选中“Archive the artifacts”,页面上就会出现一个文本框:“Files to archive”。我们要存档的目录有两份,一份是BuildArtifacts目录,一份是packages目录,后者是为了让我们能够访问NuGet package。如果要指定某个目录以及目录下所有内容,就需要在目录后面跟一个斜杠和两个星号。不同的目录或文件之间用逗号分割。在这里我们输入的是 “BuildArtifacts/**,packages/**”。
现在创建一个新job,起名叫“HelloCI-StartWebServer”。在配置页面上“Build Triggers”那一节里选中“Build after other projects are built”,把之前那个job配置成要触发当前job的项目。
接下来给job添加一个build step,让这个job所做的第一件事情就是拷贝之前job所保存的构建产物。这里要用到“Copy artifacts from another project”这个step(它是由Copy Artifacts插件提供的)。我们只需要填入HelloCI-RunUnitTests job的名字就可以。
最后还要添加一个build step,让它启动web server。这里用的是“Execute Windows batch command”,我们用Visual Studio提供的Cassini来运行应用。Cassini可以在“C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40.EXE”找到。运行Cassini很简单,把web应用存放的路径 作为参数传给它就行,如果没有指定端口号的话,它就会使用默认的端口号80。
“Execute Windows batch command”step需要一个可以在BuildArtifacts和packages拷贝后的目录下执行的命令。我们把下面这个命令复制到“Command”输入框中:
"C:\Program Files (x86)\Common Files\microsoft shared\DevServer\10.0\WebDev.WebServer40. EXE" /port:9876 /path BuildArtifacts/_PublishedWebsites/HelloCI.Web/.
这个命令可以启动Cassini,把它指向拷贝过来的应用,然后在9876端口启动服务器。
所有的配置都已就绪。试着修改一下代码然后提交。Jenkins应该能够监听到变化,运行HelloCI-RunUnitTests。如果代码编译 成功,所有测试均以通过,Jenkins应该开始运行HelloCI-StartWebServer job,把HelloCI-RunUnitTests的构建产物拷贝过来,在9876端口启动Cassini。如果这一切都运行无误,我们的持续集成系统 就搭好了。
结尾
MSBuild和Jenkins可讲的地方还很多。比如说可以从持续集成走向持续部署。你所需要的只是一个job,让它把构建产物部署到生产环境 (译者注:持续部署殊非易事,作者有些夸大其词,读者请勿轻信)。ASP.NET的应用就更简单了,用一个job把构建产物复制到某个目录下就行。这样一 来,只要所有的测试全都通过,这个Jenkins job就可以把最新特性发布到生产环境上去。
如果你还没做好准备走那么远,也可以用一下Promoted Build plugin,它可以在某个构建达到了一个特定的标准之后,把它标记为“推荐使用”。一个人或几个人手工审核过一个构建,也算得是达到了推荐标准。有了 Promoted Build plugin,人们做出的修改就可以自动发布到开发服务器上,所有的新功能都集中呈现。开发经理而后可以把某个特定的构建推荐到试机环境中。QA团队或其 他干系人可以进行验收(其方式就是推荐试机环境上的构建),然后这个构建就可以由Jenkins部署到产品环境上。
John Ferguson Smart曾写过一本很出色的书,叫做“Jenkins: The Definitive Guide”。这本书除了讲述Jenkins的功能之外,还描述了怎么保证Jenkins的安全,怎样检测资源使用(如磁盘占用),怎样进行分布式构建, 直到设置通知系统,让用户在构建开始、成功、失败的时候得到通知。这本书由O'Reilly出版,购买地址在此。如果你对Jenkins还不太了解的话,本书就属于必看的一本。
拥有一个自动化的构建部署系统,就跟要看重测试,要使用版本控制系统一样重要。我希望你已经熟练掌握了如何设置持续集成系统,可以开始着手集成自己的系统。
一开始不要太激进,一心想着把所有事情都做好。你可以一点一点来。你终会享受到胜利果实的。当Jenkins通知你某个构建失败的时候,你发现 bug的时机就提前了;当你再也不用记忆每一步部署的操作时,你就有了一整套系统化的部署流程。而更重要的是,你有了更多时间去做更重要的事情,比如开发 有价值的特性,或是为新项目做准备,也可以提前下班回家,再也不用为即将到来的上线担忧。
查看英文原文:Continuous Integration with MSBuild and Jenkins – Part 2
相关推荐
用MSBuild和Jenkins搭建持续集成环境.你或其他人刚刚写完了一段代码,提交到项目的版本仓库里面。但等一下,如果新提交的代码把构建搞坏了怎么办?万一出现编译错误,或者有的测试失败了,或者代码不符合质量标准所...
本文主要介绍了一种基于Jenkins的持续集成自动化搭建方法,结合了Msbuild、SVN、Python和Jmeter等工具,适用于.NET环境下的项目。以下是详细的知识点解析: 1. **Jenkins**:作为持续集成的核心工具,Jenkins是一款...
在介绍了持续集成环境的搭建之后,文章还提到了几个实际应用的例子,通过这些例子可以更直观地了解持续集成脚本的编写和应用。这些实践不仅提升了团队的协作效率,也显著提高了代码质量,进而增强了产品的稳定性和...
本配置指南详细阐述了如何使用Jenkins实现一套基于SVN、NuGet、MSBuild和FTP的持续集成流程。通过这个流程,你可以从SVN代码库拉取代码,利用NuGet获取项目依赖,通过MSBuild编译.NET应用程序,最后将编译结果通过...
标题中的“持续集成JAVA和C#”指的是在软件开发过程中,使用自动化工具将开发者提交的代码频繁地合并到主分支,并进行构建和测试的过程。这种做法可以尽早发现并解决潜在问题,提高软件质量和团队协作效率。Java和C#...
Jenkins 是一款开源的持续集成(Continuous Integration, CI)工具,用于自动化各种软件开发任务,如构建、测试和部署。它支持多种编程语言和构建工具,如Java、C#等,并且拥有丰富的插件生态系统,使得扩展功能变得...
在.NET 2003时代,构建过程主要依赖于集成开发环境(IDE)进行控制,这种方式存在明显的局限性,比如构建逻辑不透明、难以管理和扩展等。为了解决这些问题,微软在.NET 2005中引入了MSBuild作为新的构建引擎,它提供了...
总的来说,理解和掌握MSBuild对于.NET开发者至关重要,它不仅是构建.NET项目的工具,也是实现自动化构建和持续集成的关键组件。通过深入学习MSBuild的工作原理和使用技巧,开发者可以更高效地管理和维护他们的项目...
通过Azure Pipelines,代码在提交时或按预定时间自动编译、测试和部署,确保持续集成和持续部署(CI/CD)的顺利进行。 **总结** MSBuild是.NET生态系统中的关键组件,它提供了灵活的构建解决方案,不仅可以与Visual...
基于MSBuild的daily build流程是指使用MSBuild工具来自动化整个构建过程,使得开发团队可以更方便地管理和维护构建流程。MSBuild是一款强大且灵活的构建工具,可以直接读取csproj文件,控制csc/vbc等编译器,生成...
Jenkins 是一款流行的持续集成工具,它用于自动化各种软件开发任务,如构建、测试和部署。在本文中,我们将详细探讨如何安装和部署 Jenkins,并配置一个基础的部署环境。 首先,我们来看看安装环境的配置: 1. ...
在MSBuild 12.0中,重点在于与Visual Studio 2013的集成,引入了一些关键改进,如性能优化、更好的错误和警告消息,以及对.NET Framework 4.5.1的支持。这个版本还引入了新的任务和目标,使得自动化构建流程更加灵活...
本书主要介绍了微软构建工具集的核心组件——MSBuild以及如何在软件开发过程中高效利用MSBuild和Team Foundation Build进行自动化构建和持续集成。 #### 二、MSBuild简介 MSBuild(Microsoft Build Engine)是微软...
Jenkins 是一款开源、免费的持续集成(Continuous Integration, CI)服务器,原名为 Hudson,后因社区原因更名为 Jenkins。它支持多种平台,并且能够以 Master/Slave 架构运行,实现分布式构建任务。Jenkins 的主要...
其压缩包内的各个组件协同工作,确保了分析的高效性和准确性,为开发团队提供了一套完整的持续集成和持续质量检查解决方案。通过理解这些组件的功能和作用,我们可以更好地利用SonarScanner MSBuild提升项目质量,...
Jenkins 是一款流行的自动化构建工具,广泛应用于软件开发、测试和部署过程中。本文将详细介绍 Jenkins 的自动发布配置,包括安装、插件选择、全局配置、应用服务器设置、编译项目、自动发布项目和回滚项目等方面的...
MSBuild 经典教程 2 MSBuild 是微软公司推出的一个基于 XML 的自动化构建工具,旨在帮助开发者自动化项目的构建、编译和部署过程。本教程将从 MSBuild 的基础知识开始,逐步深入到高级特性,帮助读者掌握 MSBuild ...
标题中的"sonar-scanner-msbuild-5.0.4.24009-net46.zip"指的是一款名为SonarScanner的.NET版本构建工具的压缩包,用于.NET...通过与MSBuild和TFS的集成,它简化了在持续集成/持续部署(CI/CD)流程中的代码质量管理。
MSBuild是微软开发的一种构建工具,它...对于大型工程,良好的MSBuild配置能提高开发效率,减少错误,并简化持续集成和部署流程。在使用"MSBuild.rar"中的内容时,确保备份原有设置,谨慎操作,以免破坏现有构建流程。