用 Hudson 实现 Visual Studio (C++) 项目的 daily build

http://blog.2ndboy.net/?p=408

大概是去年吧,在尝试找一款开源 CI 工具的时候看到了这张表格,当时感觉 Buildbot 和 Hudson 不错,但是 Buildbot 在 Windows 下的安装和配置略显复杂,Hudson 就比较简单了,不过在装好 Hudson 以后没有找到编译 VC 6 项目的方法,所以没有继续研究下去。今年工作上的项目基本都要转到 Visual Studio 2008 上去,所以又把 Hudson 捡起来研究了一下,这里记录一下用 Hudson 为 C++ 的 Visual Studio project 做 daily build 的方法和步骤。

一、环境准备和安装

我们的项目是 for Windows 平台的,所以下面介绍的内容很多也只适用于 Windows 平台。Hudson 是用 Java 开发的,所以首先要确保机器上已经安装了 JRE,没有的话可以在这里下载合适的版本安装。

当然,还需要下载 Hudson,目前最新版的 Hudson 是 1.355 版,下载得到的是一个 war 包。俺不是做 Java 的,以前一直以为运行 Hudson 必须要装 Tomcat 这类容器,后来才知道用命令行就可以启动运行 Hudson。所以装 Tomcat 就省啦。

给 Hudson 在剩余空间比较大的盘上安个家,因为 Hudson 一般都把自己的配置文件,从 SCM 里 check out 出来的代码什么的放在它自己的 home 文件夹里。比如把下载回来的 Hudson.war 放在 D:\Hudson 目录下,在命令行下用 java -jar Hudson.war 就可以把 Hudson 开起来。但是这样的话 Hudson 会自动把它的 home 目录设定到当前用户的 home 目录下,所以我们可以在启动 Hudson 的时候手工指定一下 Hudson 的 home 目录:java -DHUDSON_HOME=D:\Hudson -jar hudson.war。

启动 Hudson 之后打开浏览器,访问 http://localhost:8080 就可以看到 Hudson 的 UI 了。为了方便使用,我们可以把 Hudson 安装成为 Windows 的一个 service,这样就不用每次在重启机器后再去手工运行 Hudson 了。进入 Hudson 的设置界面,点 Install as Windows Service。

Install as Windows Service

之所以有很多人喜欢 Hudson 是因为它的灵活和强大,跟 WordPress 一样,Hudson 同样支持通过安装各种 plugin 来扩展自己的功能。而且安装 plugin 在 Hudson 自己的 UI 上就可以完成,不必自己手工下载,放在某个特定目录再去后台设置什么的,非常方便!我们编译 Visual Studio 项目需要用到 MSBuild 这个 plugin,在 plugin 管理界面里的可用 plugin 页面找到 MSBuild,安装,然后重启 Hudson 服务即可。在把 Hudson 安装成一个 service 以后,我们可以通过命令行来启动和停止 Hudson——net start hudson,net stop hudson。

plugins

安装好 MSBuild 以后还要设置一下,进入系统设置,找到 MSBuild 那一段,会看到两个字段:name 和 Path to msbuild.exe。注意这里 name 一定要填,以后在做编译 job 设置的时候会用到,Path to msbuild.exe 就是你机器上 MSBuild.exe 的绝对路径,比如 C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe。

接下来要设置一下 SCM,比如 cvs.exe 在本机上的绝对路径,还有邮件通知使用的 SMTP 地址和账户等。注意邮件通知里的 Hudson URL 默认是 http://localhost:8080/,这里最好改成对外有效的主机名,否则别人收到 build 结果通知邮件以后点击链接访问 localhost 是无意义的:)

二、创建 Hudson build job

Hudson 把受它管理的每个编译项目叫做一个 job,在 Hudson 的 home 目录里你可以找到一个叫 jobs 的目录,里面存放着所有的 build job,在具体一个 job 的目录下还有一个 workspace 文件夹,里面存放的就是从 SCM 里 check out 出来的代码,当然你可以自己指定 workspace 的位置。比如有一个叫 foo 的 job,那它的 workspace 的位置就在 HUDSON_HOME\jobs\foo\workspace。

在 Hudson UI 里新建任务,然后选 Build a free-style software project 这个类型。

点击 Advanced Project Options 可以设置一些不常用的高级选项,比如 Use custom workspace 就可以自己来指定 workspace 的位置。如果你想把代码 check out 到一个特定名字的文件夹里,这个选项就派上用场了。假设你想把 code check out 到一个叫 bar 的文件夹里,可以在 Use custom workspace 里设置 D:\Hudson\jobs\foo\workspace\bar。其实 Hudson 内部定义了一些环境变量,使用这些变量可以增加 job settings 的灵活性,比如上面这个目录可以写成:$HUDSON_HOME\jobs\$JOB_NAME\workspace\bar,这样一来如果你以后变动了 Hudson 的安装位置就可以不用重现设置 job settings 了。有关 Hudson 的环境变量,可以看这个 link。需要注意的是,一但在这里设置了 custom workspace,那么再使用 $WORKSPACE 这个环境变量拿到的就是这个 custom workspace 的位置,而不是默认的位置。

选中 Build Triggers 里的 Build periodically 就可以让 Hudson 在特定的时间自动触发一个 build,这里的语法跟 *nux 里面的 cronjob 很像,比如你想让这个 build 在每天凌晨 1 点自动触发,可以写成 0 1 * * *。

在 Build 节里点 Add build step,选 Build a Visual Studio project or solution using MSBuild,然后来设置 MSBuild。有 3 个 field 需要设置:
MsBuild Version 这里选我们在系统设置设置的 MSBuild 的 name,如果你机器上有多个版本的 MSBuild,这里可以选择合适的版本。
MsBuild Build File 这里填 .sln 或者 .vcproj 文件的位置。
Command Line Arguments 这里填需要传递给 MSBuild 的命令行参数。比如你要编译 foo.sln 里的 p1,p2,p3 这三个工程,但是顺序必须是 2->3->1,那么可以传这个参数:/p:Configuration=Release /t:p2;p3;p1,如果想做一个 clean build,那么只需要在第一个 target 前加上 Clean 即可——/p:Configuration=Release /t:Clean;p2;p3;p1。

最后还可以设置在编译完成以后发通知邮件,多个收件人之间用空格分隔,据说淘宝内部还自己开发了旺旺通知 plugin,在编译结束后可以通过用旺旺发 IM 的形式来通知有关人等,这也体现了 Hudson 非常好的扩展性:)

设置完成以后点 save 保存,一个 new job 就创建好了。你可以点“立即生成”来马上启动一个 build,或者等着 Hudson 在你设定好的时间自动 build 然后把通知邮件发给你。

三、安全设置

安装之后 Hudson 默认是允许匿名访客对 Hudson 和 build job 的设置做修改,而且也可以访问 workspace 查看代码,在实际环境里我们显然需要对这种宽松的 AC 做一下限制。

进入系统管理,系统设置。选中 Enable security。在 Access Control 的 Security Realm 中选中 Hudson’s own user database,表示我们要使用 Hudson 内建的用户数据库来做访问控制。然后在 Authorization 中选中 Matrix-based security,这样我们就可以对每个用户的权限做详细的设置了。

默认已经有一个 Anonymous 匿名用户了,不过他没有任何权限,我们一般要给他 read 权限,这样一来收到 build 邮件通知的人就可以通过点击邮件里的链接看到一些结果信息而又无法改动配置了。在下面我们还可以用 User/group to add 增加一个用户,比如增加一个叫 2ndboy 的管理员用户,然后给他所有的权限:

Access Control

注意我们在创建 2ndboy 用户的时候并没有指定密码,而一旦你开启访问控制,保存设置后,你马上就变成了匿名用户,再也不能访问系统设置了。一开始我也晕了,后来才明白,你在系统设置里新建的用户其实相当于一个 placeholder,要真正创建这个用户、设置密码还需要先点 Log in,然后在 Log in 界面里点 Create an account 来到 Sign up 页面才能真正的创建这个用户。Sign up 好以后要记得到系统设置里把 Hudson’s own user database 下面的 Allow users to sign up 改成未选中状态,否则匿名用户可以随意的 sign up 自己的账户。

Hudson 跟 Buildbot 一样,还支持分布式 build,不过暂时还没什么研究,等有了心得以后再来分享:)

4 Responses to “用 Hudson 实现 Visual Studio (C++) 项目的 daily build”

  1. diandian Says:

    请教问题:hudson下用msbuild命令自动编译*.sln文件,提示错误:C:\Users\Administrator\.hudson\jobs\TestMyBuild\workspace\TestMyBuild\TestMSBuild\TestMSBuild.sln.cache(59,5): error MSB3411: 未能加载 Visual C++ 组件“VCBuild.exe”。如果未安装该组件,请执行下列操作之一: 1) 安装 Microsoft Windows SDK for Windows Server 2008 和 .NET Framework 3.5;或 2) 安装 Microsoft Visual Studio 2008。
    Done Building Project “C:\Users\Administrator\.hudson\jobs\TestMyBuild\workspace\TestMyBuild\TestMSBuild\TestMSBuild.sln” (clean target(s)) — FAILED.
    我用VC2005开发程序,在cmd命令行窗口下发现也碰到类似问题:VCbuild找不到,只能在
    Vs2005 命令提示窗口运行msbuild没问题,不知道怎么解决,你能解答吗?

  2. 2ndboy Says:

    公司里用的就是 VS2008,所以没遇到过这个问题,家里刚好装的是 VS2005,刚才试了一下果然发现跟你说的一模一样的问题:) Google 了一下找到 http://www.jiamaocode.com/Cts/1015.shtml,但是试了下没用。又找到 http://www.ademiller.com/blogs/tech/2009/05/gotchas-getting-c-projects-building-on-a-ci-server/,估计只能这样做了,装 Windows SDK,或者干脆装 VS2008 吧:)

  3. diandian Says:

    呵呵,问题已经解决,我windows机器上装了VS2005,需要在环境变量Path里添加设置
    C:\Program Files (x86)\Microsoft Visual Studio 8\VC\vcpackages,重登陆hudson

  4. 2ndboy Says:

    解决就好:)

原文地址:https://www.cnblogs.com/kevinzhwl/p/1847822.html