本文的目标是在windows Server 2008 R2中,搭建一个Visual Studio 2010项目的每日构建、发布环境,实现代码的自动编译、打包、数字签名、发布,其中使用jenkins作为每日构建工具,通过MSBuild对VC工程进行编译,使用nsis(Nullsoft Scriptable Install System)对生成的程序进行打包,而签名、打包、发布等整个过程通过ant脚本调度。
Jenkins是一款Java平台的开源持续集成(Continuous Integration,CI)软件。它易于安装,配置简单,具有丰富的插件支持和高度的可扩展性,可用于监控重复作业运行情况,如持续集成、每日构建等。Windows下的jenkins需要安装jdk、.net framework环境。
1、安装jdk 1.5以上版本
可以在这里下载,安装
在环境变量中设置JAVA_HOME,值为jdk安装目录
把%JAVA_HOME%/bin加到系统的path路径中
新打开一个命令行窗口,输入:
java
回车,有帮助信息则说明JDK配置成功。
2、安装.net framework 3.5 sp1
配置jenkins作为windows服务运行时,需要.net framework 2.0及以上版本(4.0以上版本不行),否则会提示如下错误:
Windows Server 2008 R2 SP1中不允许直接安装下载的.net framework 3.5文件,运行时会报错“必须用‘角色管理工具’安装或配置Microsoft .NET Framework 3.5”。其实在Windows Server 2008 R2 SP1下已经集成了.NET Framework 3.5.1,只需要在管理界面打开就行了,步骤如下:
服务器管理器=>功能>添加功能
转播到腾讯微博
选择.NET Framework 3.5.1 功能,在添加功能向导中,点击添加所需的角色服务,然后一直下一步进行安装即可
转播到腾讯微博
3、安装nsis(Nullsoft Scriptable Install System)
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 下安装程序制作工具,它提供了安装、卸载、系统设置、文件解压缩等功能。就像它名字里所说的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑,NSIS 的脚本语言和通常的编程语言有类似的结构和语法。 我们将在ant脚本中,调用NSIS的makensis.exe执行我们编写的nsi脚本,对程序进行打包。
到http://nsis.sourceforge.net/Download 下载最新版本的NSIS,并进行安装;项目中使用到了processwork.dll插件,注意要放到对应的plugins目录下
注意需要在系统的环境变量PATH中,增加NSIS的安装目录以及下面的bin目录
可以在命令行中运行makensis命令,验证是否正确配置了环境变量
4、安装ant
Apache Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,我们在这里使用ant脚本统一调度其他软件,进行数字签名、打包、发布等。
a.下载
在http://ant.apache.org/bindownload.cgi 下载最新压缩包,如apache-ant-1.8.3-bin.zip ,解压到d:ant即可。
b.ant的配置
1) 在环境变量中设置ANT_HOME,值为ANT安装目录d:ant
2) 把%ANT_HOME%/bin,%JAVA_HOME%/bin加到你系统的path目录中去。
c.测试是否成功
新打开一个命令行窗口,输入:
ant -version
回车,看到输出ant说明配置成功。
5、安装MSBuild 4.0
Microsoft Build Engine (MSBuild) 是 Microsoft 和 Visual Studio 的新的生成平台。MSBuild 在如何处理和生成软件方面是完全透明的,使开发人员能够在未安装 Visual Studio 的生成实验室环境中组织和生成产品。
可以通过安装对应版本的.net framework来安装MSBuild,需要安装的是.net framework 4.0。
因为编译的是vc++的程序,依赖于C运行时库,所以还需要安装sdk,在这里下载Windows SDK for windows 7 and .Net Framework 4
安装整个MSBuild 4.0比较复杂,简单起见,可以安装vs2010整个开发开发环境,这里就是安装了整个vs2010。
6、安装jenkins
下载最新版本的jenkins,存放到待安装目录,如d:jenkins
在命令行中运行如下命令,指定 -D参数,这样就可以把jenkins的home目录指定到d:jenkins(注意在windows Server 2008 中,需要以管理员身份运行)
java -DHUDSON_HOME=D:jenkins -jar jenkins.war
启动后,在浏览器中就可以通过http://localhost:8080来访问了,然后可以配置jenkins作为windows服务运行
在系统管理中,选择“Install as Windows Service”,并指定路径,因为刚才已经使用-D参数指定了路径,在这里选择默认路径即可,安装完成后会提示重新启动。
这样jenkins就可以作为一个服务随Windows启动了,也可以通过命令行启动和停止,如:net start jenkins,net stop jenkins
7、安装插件
jenkins具有丰富的插件,扩展jenkins的功能,对于刚安装的jenkins,需要先获取插件资料,才可以在线安装、更新插件。在系统管理=>管理插件中,点击高级选项卡,点击立即获取,检查更新信息。检查完成后,就可以看到最新的插件信息。已安装选项卡中列出jenkins中已经安装的插件,而更新选项卡中,则列出可以更新的插件,在这里选择安装MSBuild插件,以便hudson可以调用msbuild。
选中当安装成功并且没有运行中的任务时重启jenkins,点击签名的绿色箭头,则安装完成后,如果没有运行的任务,则会重新启动jenkins,使插件生效
转播到腾讯微博
也可以自己下载插件,在高级选项卡中选择上传插件进行安装。
8、设置
系统管理=>系统设置中设置jdk
设置MSBuild
在系统设置里,设置MSBuild,如下图,path to MSBuild中,设置完整的msbuild路径;同时注意把MSBuild目录,添加到系统的path路径里面
设置Ant
9、配置windows 2008防火墙
转播到腾讯微博
转播到腾讯微博
转播到腾讯微博
10、配置数字签名环境
SignCode是微软在.NET Framework SDK 1.0 和 1.1 版中提供的一个数字签名工具,使用 Authenticode 数字签名对可移植可执行 (PE) 文件(.dll 或 .exe 文件)进行签名。但是使用SignCode进行签名时,需要人工参与进来,手工输入key密码等信息,不能在ant脚本里面调用。有人写了个程序signcode-pwd,允许在命令行中调用SingCode,可以在http://www.stephan-brenner.com/?page_id=9下载signcode-pwd.zip文件。
压缩包中包括三个文件:signcode-pwd.exe、sign-with-pwd.bat、版本说明。Signcode-pwd.exe可以将SignCode.exe用到的密码存为一个密码文件,sign-with-pwd.bat调用SignCode.exe、sighcode-pwd.exe,自动在进行签名时为SignCode.exe填写密码,从而实现不需要人工参与的进行数字签名。
Signcode-pwd中需要使用包含软件发布证书的 SPC 文件和包含私钥的私钥的.pvk文件,可以在这里找到如何在不同格式的证书之间转换的方法。
注意:需要使用时间戳服务器进行签名时,一定要保证能连上互联网,否则由于无法访问时间戳服务器而失败。
注意:不能仅签名NSIS打包后的文件,应该对包含的所有DLL文件都要先签名后再打包,再签名打包的文件,否则IE浏览器会显示为“未验证的发行者”而影响正常使用,甚至杀毒软件会认为是病毒而被删除!
首先用sign-code-pwd.exe生成密码文件myPassword.pwd
sign-code-pwd.exe -e myPassword.pwd testpassword
sign-with-pwd.bat是一个批处理文件,需要修改文件,指定SignCode.exe、Signcoe-pwd.exe的路径,指定spc、pvk证书文件、密码文件、时间戳服务器等信息,如下:
@echo off
rem
rem TODO: Modify this constants before using
rem
set strFile=%1
set strSignCode=D:signtoolsigncode.exe
set strSignCodePwd=D:signtoolsigncode-pwd.exe
rem spc、pvk证书文件
set strSpc=D:signtoolmycert.spc
set strPvk=D:signtoolmykey.pvk
rem 刚刚生成的密码文件
set strPwd=D:signtoolmyPassword.pwd
rem wosign的时间戳
set strTimeStampUrl=http://timestamp.wosign.com/timestamp
echo Start signcode-pwd.exe
%strSignCodePwd% -f %strPwd%
echo Execute signcode.exe
rem echo %strSignCode% %strFile% -spc %strSpc% -v %strPvk% -a sha1 -t %strTimeStampUrl%
rem %strSignCode% %strFile% -spc %strSpc% -v %strPvk% -a sha1 -t %strTimeStampUrl%
%strSignCode% %strFile% -spc %strSpc% -v %strPvk% -a sha1
if errorlevel 0 goto end_success
end_error
echo Error occured while signing
%strSignCodePwd% -t
rem exit 1
end_success
echo Singing was successfully
%strSignCodePwd% -t
这样,我们就可以使用sign-with-pwd.bat对文件进行签名了,例如
sign-with-pwd.bat D: estRelease est.dll
另外,也直接可以使用signtool.exe进行数字签名,脚本如下:
@echo off
rem
rem TODO: Modify this constants before using
rem
set strFile=%1
set strSignCode=D:signtoolsigntool.exe
set strPfx=D:signtoolmysign.pfx
set strPwd=helloworldx
set strTimeStampUrl=http://timestamp.wosign.com/timestamp
echo Execute signtool.exe
rem %strSignCode% sign /f %strPfx% /p %strPwd% /t %strTimeStampUrl% %strFile%
%strSignCode% sign /f %strPfx% /p %strPwd% %strFile%
if errorlevel 1 goto :end_error
if errorlevel 0 goto :end_success
end_error
echo Error occured while signing
Goto :eof
end_success
echo Singing was successfully
注意:现在wosign不再提供免费的时间戳服务,上面的脚本已经把使用时间戳的命令注释掉
11、简单的ant脚本
Clean all output directories
签名可执行程序dll
打包可执行程序
签名安装包
发布
12、Job配置
下面就可以进行配置job了,在svn中下载代码,然后用msbuild编译程序,再用ant脚本进行签名、打包、发布。
转播到腾讯微博