本文的目標是在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:\signtool\signcode.exe
set strSignCodePwd=D:\signtool\signcode-pwd.exe
rem spc、pvk證書文件
set strSpc=D:\signtool\mycert.spc
set strPvk=D:\signtool\mykey.pvk
rem 剛剛生成的密碼文件
set strPwd=D:\signtool\myPassword.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:\test\Release\test.dll
另外,也直接可以使用signtool.exe進行數字簽名,腳本如下:
@echo off
rem ----------------------------------------
rem TODO: Modify this constants before using
rem ----------------------------------------
set strFile=%1
set strSignCode=D:\signtool\signtool.exe
set strPfx=D:\signtool\mysign.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腳本進行簽名、打包、發布。