Windows Server配置Jenkins,实现监测SVN提交自动构建.net4.5的项目
1,持续集成
概念:http://baike.baidu.com/view/5253255.htm,对于大多数人而言,自动构建/自动测试/自动部署,已经很发挥它的价值了。选择上:
- 推荐jenkins,一是它比较常见,二是它能跑在windows服务器上
- CruiseControl有.net的版本,一进其官网看见醒目的文档过期提示,我就没有尝试的欲望了
- gitlab ci的web界面清爽(比jenkins好看),但是只能跑在linux上,感兴趣的同学去试验吧,所以本文是讲的jenkins。
2,msbuild
- 了解msbuild
- msdn上的一点一滴的起步
- 或者这篇文章也是个不错的入门
- 当然,你也可以走点歪门邪道,直接用sln文件生成msbuild文件
set MSBuildEmitSolution=1 msbuild <<your project>>.sln
注意: 此种情况下生成的msbuild文件只适用于本机,也就是说,它定义了一堆路径,全是你开发机器上的,同时解决方案里所有项目的属性都是一个一个配置的,不是用的变量,如果要修改的话只有批量替换。
其次,如果需要输出到其它目录,或是别的定制的需求,想绕过msbuild的学习应该是不行的
3,jenkins
- 下载jenkins,执行安装包里的install.exe,安装好后目标服务器的8080端口即可访问,而且已经添加到防火墙例外,远程亦可访问
- 配置Jenkins
- 导航到“系统管理/管理插件/可选插件”,从filter里面输入msbuild,把msbuild插件安装好,记得勾选装好后重启jenkins
- 把msbuild的目录加到环境变量里去,如果不这么做,也可以在jenkins里面配置:
- 导航到“系统管理/系统设置/msbuild”,(jenkins插件安装后并成功重启后会出现)
- 点击“新增msbuild安装”,填入名称(如msbuild4)和带文件名的路径(如C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe)
- 保存
- 新建一个job
- 新建的时候选择自由风格软件即可
- 配置好名称,选择一个源码管理,我选择SVN(subversion),该插件系统自带了,配置说明:
- Repository URL:代码仓库地址(当文本框失焦,会出现一个警告,提示没有权限,点击警告文字中的授权链接即可打开一个弹窗录入用户名密码)
- Local module directory (optional):签出代码保存的位置
- Repository depth option:选择infinity
- 如果要从多个位置签出,add more location即可
- “构建”一栏填写内容:
- msbuild version:如果你没有设置过,那么就是默认的default(前提是前面说的环境变量加了),否则你可以从下拉里选出你上一步配置过的msbuild4
- msbuild build file: 你编写的msbuild文件名
- Command Line Arguments:暂时留空
- 保存后,一个job就建成了
- 点击左侧的“立即构建”,即可开始构建,当然,99.99%的情况下你会构建失败的。
4,错误解决
如果你选择安装visual studio到服务器上,那就万事大吉了
如果嫌麻烦不安装visual studio,那么就得针对出现的问题来逐个解决了
- 错误1: 先别看错误代码,你装了.net framework没有,既然我以4.5为例,从4.0到4.5都分别装一下吧
- 错误2: 'msbuild.exe' 不是内部或外部命令,也不是可运行的程序或批处理文件。 Build step 'Build a Visual Studio project or solution using MSBuild' marked build as failure
解决:一般是你没有把msbuild路径加到环境变量里,如果加了还报这个问题,重启机器测试;如果你是在jenkins里面配置的路径还出这个问题,是不是配错了,这不属于知识性错误,不阐述。
- 错误3: error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v11.0\WebApplications\Microsoft.WebApplication.targets" was not found. Confirm that the path in the <Import> declaration is correct, and that the file exists on disk.
解决:错误已经很明确的,既然没有装vs,就把开发机器上的C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\整个目录都拷到CI服务器上,几百M,如果还嫌这个太大,那么你只需要拷贝其中的v10.0或v11.0(看你装的vs版本)这个文件夹即可。
- 错误4: C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.Common.targets(983,5): warning MSB3644: The reference assemblies for framework ".NETFramework,Version=v4.5" were not found. To resolve this, install the SDK or Targeting Pack for this framework version or retarget your application to a version of the framework for which you have the SDK or Targeting Pack installed. Note that assemblies will be resolved from the Global Assembly Cache (GAC) and will be used in place of reference assemblies. Therefore your assembly may not be correctly targeted for the framework you intend. [C:\Program Files (x86)\Jenkins\jobs\test\workspace\net_zkx_zkkaweb\Zkx.Jkka.Application\Zkx.Jkka.Application.csproj]
解决:你没装vs的话,windows sdk也就是缺失的,其实错误信息已经把解决方案告诉你了:
- install the SDK
- Targeting Pack for this framework version
- retarget your application to a version of the framework for which you have the SDK
- Targeting Pack installed.
既然选择不装vs了,那么也放弃安装sdk的方法吧,所以只需要指出正确的framework路径就可以了: - 我把C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5拷到任意目录,如d:\fmsdk\v4.5
- 还记得在添加Job的时候配置“构建”一节的时候,我说“Command Line Arguments”暂时不配置吧,此时你就要配置了:-p:FrameworkPathOverride="d:\fmsdk\v4.5",具体路径看你怎么复制的。
- 这篇文章就是讲的这个问题
- 有关msbuild的问题就这么些,还出现问题的话只能拿着错误号放狗搜索了,要知道,你现在除了安装了jenkins和必要的.net framework库,没有额外安装windows sdk或vs,已经省了很大功夫了。
5,svn hooks
要想在svn成功接收到代码后自动构建,就得用到svn hooks。在源码仓库目录下有一个hooks文件夹,里面列出来的就是可用的钩子“模板”,我们需要post-commit,所以你就建一个post-commit.bat即可,所以,重要的是文件名。
因为我们只做一件事,就是访问一下那个“立即构建”的超链接,链接地址右键复制出来,所以我们也没必要学习模板里的语法,只需要知道如何用一个命令来访问网址即可。 因为批处理语句本身不支持发起http请求,所以你可以选择调用IE来访问一个目标网址。我用powershell写了一个调用IE访问的脚本,本机测试成功,但是通过svn触发的过程中,完全没任何反应,如果有兴趣的,可以自己试试原生的start iexplore “构建网址”,我就不多说了,跳到下一节
6,powershell
我的这篇文章是参考我同事的同样一篇文章写的,目的是什么呢? 就是我要看能不能用最少的安装,最少的知识量做到jenkins自动构建.net framework4.5的程序。
最少安装前面做到了,除了非装不可的.net framework和jenkins本身,再无安装过程
最少知识量呢?
- 1,不去学习msbuild的语法(实测用sln生成的msbuild可用性不高,失败)
- 2,我同事用的vb来发起http请求,即使代码已经很简单了,作为一个C#的coder,既然powershell都能调用.net framework了,我自然考虑用既有知识干这件事,哪怕语法格式不熟,至少一看就懂
这就是我生成的ps1文件:
#post-commit-hook-jenkins.ps1 [Net.HttpWebRequest] $req = [Net.WebRequest]::create($args) $req.Method = "GET" [Net.HttpWebResponse] $result = $req.GetResponse()
一个webrequest即可,只管请求不管响应。
那么我的post-commit.bat这个脚本就这么写就行了:
# post-commit.bat powershell E:\Repositories\post-commit-hook-jenkins.ps1 网址
就是ps1文件的绝对路径,加上”网址“参数即可,这个”网址“就是上述脚本里的$args
测试一次svn commit,如愿看到jenkins的web控制台排了个任务进行构建。