APP下载

Windows平台的软件自动构建与发布技术研究

2018-09-20于红雨

成组技术与生产现代化 2018年2期
关键词:源码批处理命令

于红雨,李 燕

(机械工业第六设计研究院有限公司 智能与信息工程中心,河南 郑州 450007)

随着应用软件系统的业务功能越来越多,用户数量逐渐庞大,软件系统的编译构建也越来越复杂,且通常需要在多台服务器上发布部署.软件新业务功能的构建与发布是指更新并编译代码,将发布代码打包,再将新发布包拷贝到各服务器上,然后将发布包覆盖至各服务器的发布目录中.更新源码并编译时需使用源码管理工具软件更新代码,打开开发环境进行编译.在创建发布包时,某些配置文件无需打包.发布时将发布包拷贝至各服务器中并解压覆盖服务器的发布目录.构建与发布过程包含了很多重复性工作,耗时费力,容易出错.

Maven[1]、GNU Make[2]、Apache Ant、Jenkins[3]等常见解决方案主要用于Linux平台或JAVA语言开发项目的自动构建及发布.EEP(Efficient Electronic Platform)协同管理软件的开发环境为Windows平台VS2015,而源码管理工具为SVN1.9.2,开发语言为C#,部署环境为6台Windows Server服务器.以上解决方案不适用EEP协同管理平台的构建.为此,本文依据EEP协同管理软件的实际开发和部署环境,提出一种轻量级的解决方案.该方案主要包括软件源码更新和编译、发布代码打包并传送至各服务器部署等工作,另外,需以批处理命令写入批处理文件,在构建发布部署时执行批处理文件.该方案与现有常见解决方案相比,更符合EEP协同管理软件的实际部署运行情况.

1 软件构建与发布过程

本文依据软件现有开发、部署环境,使用Windows批处理方式,将原有各项手工操作以Window命令、SVN命令、MSBuild命令、压缩工具的压缩和解压命令写入批处理文件中,通过执行批处理文件实现构建与发布部署工作的自动执行.

该方案需在软件源码服务器上存放一个批处理文件(实现更新下载源码,编译源码以及将待发布的文件打包并传送至各服务器),并将批处理执行情况记录到日志文件中;在服务器上存放一个批处理文件后,通过服务器上定时任务的执行,将发布包解压至代码发布目录中;然后,压缩备份发布目录,并将批处理执行情况记录到日志文件中.

图1所示的软件构建及服务器集群部署工作流程能够直观地说明软件构建与发布的过程.

图1 软件构建及服务器集群部署工作流程

2 关键技术

2.1 SVN

SVN是Apache Subversion 的缩写.Subversion是一个免费/开源的版本控制系统,于2000 年由 CollabNet 公司开发,现已发展为 Apache 软件基金会的一个产品.

通过Subversion软件可以跨时间对文件和目录的修改进行管理,允许恢复数据的旧版本或检查数据的修改历史;可以跨越局域网进行操作,允许多个用户在不同的机器上修改和管理同一组数据,有利于团队协作.它是一个通用系统, 可以管理任意类型的文件集合.

针对EEP平台,可用SVN系统工具进行源码版本控制.SVN的常用命令[4]如下:

svn add 添加文件、目录

svn checkout 从源码仓库中取出一个工作副本

svn cleanup 递归清理工作副本

svn commit 将本地工作副本的改动发送至源码仓库

svn delete 从源码仓库或本地工作副本删除一个文件

svn revert 撤销本地修改

svn update 更新本地工作副本(从源码仓库更新).

2.2 MSBuild命令

使用脚本或.bat文件运行VS IDE软件时,如果要生成相关的任务,则推荐使用MSBuild命令.本文研究的一项关键技术就是使用命令控制项目的编译生成过程.MSBuild命令[5]如下:

MSBuild.exe [命令开关][项目文件]

/ds 在生成日志末尾显示有关生成的配置以及如何将它们安排到节点中的详细信息

/p:name=value设置或重写指定项目级属性,其中name是属性名称,value是属性值.要求单独指定每个属性并使用分号或逗号分隔多个属性

/t:targets在项目中生成指定目标.要求单独指定每个目标并使用分号或逗号分隔多个目标

/l:logger指定用于记录MSBuild中事件的记录器

/clp:parameters将指定的参数传递到控制台记录器,且后者会在控制台窗口中显示生成信息.这里可以指定以下参数:

-PerformanceSummary显示在任务、目标和项目中所花费的时间;

-Summary在末尾显示错误和警告摘要.

2.3 压缩软件命令

由于软件项目编译后生产的发布代码文件数量较多,因此有必要使用压缩工具把发布文件打包后发送至各服务器,服务器再执行发布文件包解压来实现代码发布.常用解压工具HaoZip的命令[6]如下:

HaoZipC a -tzip archive.zip subdir* 从 subdir 文件夹添加所有文件到 archive.zip压缩文件

HaoZipC d archive.zip *.bak 从 archive.zip 压缩文件中删除 *.bak 文件

HaoZipC e archive.zip -oc:soft *.cpp 从压缩文件 archive.zip 中释放 *.cpp 文件到 c:soft 文件夹

HaoZipC x archive.zip -oc:soft *.cpp 从压缩文件 archive.zip 中释放 *.cpp 文件到 c:soft 文件夹.

2.4 局域网连接及文件拷贝命令

要将软件部署在局域网内多台服务器中,必须先将发布包传送至各服务器,最简单的方法就是建立局域网连接并将文件拷贝至服务器中.Wndows平台局域网连接及局域网文件拷贝命令[7]如下:

net use \IPipc$“密码”/user:“帐号”建立与指定IP的IPC$(空连接)

net use z: \IPc$“密码”/user:“帐号”将对方的C盘映射为自己的Z盘

net use \IPipc$/del删除与指定IP的IPC$连接

net use z:/del删除本机映射的Z盘

net use * /del删除本机所有映射和IPC$连接.

XCOPY是COPY的扩展,可以在建立连接的局域网计算机间复制文件和目录(包括子目录).XCOPY的语法[8]如下:

XCOPY Source [Destination] [/w] [/p] [/c] [/v] [/q] [/f] [/l] [/g] [/d[:MM-DD-YYYY]] [/u] [/i] [/s [/e]] [/t] [/k] [/r] [/h] [{/a |/m}] [/n] [/o] [/x] [/exclude:FileName1[+[FileName2]][+[FileName3]] [{/y | /-y}] [/z].

3 软件自动构建与发布技术方案的设计及实现

本文以EEP协同管理Web平台项目(以下简称EEP Web平台)为例,根据项目特点进行软件自动构建及发布技术方案的详细设计.EEP Web平台是EEP平台的Web版,与EEP平台共用后台服务软件,它属于ASP.Net MVC项目.软件自动构建是在源码服务器上进行的,而代码发布是在各应用服务器上完成的,因此需要编写在源码服务器上运行的自动构建.bat文件和在应用服务器上运行的部署.bat文件.

3.1 源码更新

因为EEP Web平台既具有Web前端页面,也引用了EEP平台的后台服务,所以其源码分为两部分(自身源码和引用的EEP平台服务程序集),在源码更新时二者都更新才能保证后续编译通过.

源码更新功能需要SVN软件工具的支持.这里仅用SVN的更新代码命令update即可,但需要将SVN的工具路径、命令及源码路径写入批处理文件.为了方便,可在批处理文件中定义变量保存工具的路径及源码路径、编译结果目录、打包文件名等,后续使用软件路径及源码路径时引用相应变量即可.

源码更新的变量设置命令如下:

set TortoiseProc=“C:Program FilesTortoiseSVNinTortoiseProc.exe”

set SourceCodeFolder=“D:***EEP_WebPlatform runkSrc” 注:***代替了详细路径

set ShareDllFolder=“D:***EEP_WebPlatform runkShareDll”.

源码更新的批处理命令如下:

%TortoiseProc% /command:update /path:%SourceCodeFolder% /closeonend:1

%TortoiseProc% /command:update /path:%ShareDllFolder% /closeonend:1

echo 代码更新完成……

源码更新完毕后退出SVN.

3.2 源码编译

源码编译在源码服务器上进行,在此之前,各程序员已经完成了本地编译及功能测试,并将代码通过SVN签入源码服务器.因此,编写编译命令时无需带调试符号.源码编译与源码更新的批处理命令编写方式相同,定义变量保存编译的工具路径、解决方案路径和编译输出路径.

源码编译的变量设置命令如下:

set Msbuild=“C:WindowsMicrosoft.NETFrameworkv4.0.30319Msbuild.exe”

set sln=“D:***EEP_WebPlatform runkSrcEEP_WebPlatform.sln”

set OutDir=“D:***EEP_WebPlatform runkSrcEEP_WebPlatformin”

源码编译命令如下:

%Msbuild% %sln% /ds /clp:ShowTimestamp;Summary /m /t:Clean;Build /p:DebugSymbols=false;VisualStudioVersion=12.0; OutDir=%OutDir%

echo源码编译完成.

此处将编译过程信息直接显示在控制台窗口中,可以使用/l:logger将编译过程信息记录至日志文件中,使用/nocolog开关来禁用控制台记录器.

3.3 发布代码打包

因为源码服务器上应用软件配置文件中EEP平台的后台服务路径与实际部署时配置文件的服务路径不一致,所以应在代码打包时排除源码服务器上的此类配置文件.若源码资源文件中包含二维码图片,则需要将此类图片排除(因正式服务器上所用图片与源码服务器图片不同).

打包批处理命令如下:

set PublishedWebFolder=“D:***EEP_WebPlatform runkSrcEEP_WebPlatformin\_PublishedWebsitesEEP_WebPlatform”

set zipFileName =Deploy

set zipFileFullName=D:***EEP_WebPlatform runkDeploy

set Zipexe=“C:Program Files2345SoftHaoZipHaoZipC.exe”

echo 删除未修改的文件,减小压缩包大小,加快处理速度……

del /f /q %PublishedWebFolder%Web.config

del /f /q %PublishedWebFolder%ResourcesServiceConfigService.xml

echo 压缩文件,通过HaoZip软件……

del /f /s /q “%zipFileFullName%.zip”

%Zipexe% a -tzip “%zipFileFullName%.zip” %PublishedWebFolder%* -r.

3.4 将发布包发送至服务器

在发布代码部署至各服务器前,需要将发布代码包发送至各服务器.

发布包发送命令如下:

rem windows远程复制?

set ip_addr1=***.***.*.*

rem 连接到远程服务器***.***.*.*

net use \%ip_addr1%ipc$ password/user:accountName

rem 更新复制到远程服务器

xcopy %zipFileFullName%.zip \%ip_addr1%EEP_WebPlateReleaseFile /y /h

xcopy %zipFileFullName%.zip \%ip_addr1%EEP_WebPlate1Deploy /y /h

发布包传送至服务器后,为了不影响软件正常使用,通常需在下班后发布代码,因此可使用定时任务功能.定时任务功能能够在设定时间点执行部署批处理文件,完成文件部署任务.设置定时任务的命令为:

at \%ip_addr1% 21:00 “D:***WebPlateDeploy.bat”.

完成以上工作后,需将局域网连接删除,删除命令如下:

rem 删除连接

net use \%ip_addr1%ipc$ /delete.

3.5 在服务器上发布代码部署

发布代码部署批处理文件需要在各服务器上执行.发布前首先备份压缩发布目录,然后将发布包解压覆盖至发布目录,最后将发布目录压缩打包并存放到备份目录中,发布后需要备份压缩发布目录.发布目录压缩包应以当前发布时间为文件名,以防止文件名重复.同时,需将部署过程信息保存至txt文件中,以备查询.

发布代码部署的批处理命令如下:

set Zipexe=“C:***HaoZipHaoZipC.exe”

set publishPath=“D:***Deploy”

set zipFileName=“D:***DeployDeploy.zip”

set releaseFile=“D:***ReleaseFileDeploy.zip”

set bakPath =“D:***BakeFile”

echo ReleaseFile下的Deploy.zip更名为Deploy_yyyymmdd_hhmm.zip文件……

set DateTime1=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%

ren %releaseFile% Deploy_%DateTime1%.zip >D:*** esult.txt

echo 通过好压压缩软件解压缩文件……

%Zipexe% x %zipFileName% -o%publishPath% -y >>D:*** esult.txt

del /f /s /q “%zipFileName%”>>D:*** esult.txt

echo 备份

%Zipexe% a -tzip D:***Deploy_%DateTime1%.zip D:***Deploy -r >>D:*** esult.txt

move D:***Deploy_%DateTime1%.zip D:***BakeFile >>D:*** esult.txt

exit.

4 软件自动构建与发布技术方案的测试及分析

4.1 测 试

通过执行软件自动构建批处理文件和发布部署批处理文件,可成功实现EEP Web平台的自动构建及Windows服务器集群部署,并将构建及部署过程记录在日志文件中.分析日志文件可知,单次构建和部署耗时约2 min(图2~图5).其中:构建耗时1 min(构建耗时与源码目录中需编译的源码文件数量及大小有关),如图2和图3中框内时间所示;部署耗时1 min,如图4和图5中框内时间所示.该方案执行测试时,去掉了定时执行部署任务的命令,可在构建结束后立即进行部署发布.

图2 项目自动构建开始的日志界面

图3 项目自动构建结束的日志界面

图4 项目自动发布部署开始的日志界面

图5 项目自动发布部署结束的日志界面

在相同的构建部署环境下,手动编译部署时,实际测得耗时为14 min(更新代码并编译打包耗时2 min+发布至单台服务器耗时2 min×6台服务器).

4.2 分 析

由于各服务器均在设定的时间点执行部署批处理文件,因此它们的部署工作耗时相差不大.

若软件自动构建及发送至各服务器耗时为B2,手动编译并发送至各服务器耗时为B1,则自动构建并发送至各服务器耗时一定小于等于手动编译并发送至各服务器耗时,即B2≤B1.

若使用自动发布技术进行软件发布部署工作,耗时为D2,人工发布至单台服务器耗时为D1,则D2

采用自动构建及发布技术时,每次发布耗时为:B2+D2.手动编译发布耗时为:B1+D1×N(N为部署服务器台数).部署服务器台数越多,则使用自动构建发布技术进行发布部署的效率越高,耗时相对越少.B2+D2

5 结束语

本文结合EEP Web平台开发及部署环境,实现了一种轻量级自动构建及发布的解决方案.该方案以Windows批处理文件方式,将原有手工做的各项工作以命令方式写入批处理文件中,执行批处理文件,实现Windows平台的软件自动构建及发布功能.与原手工构建及发布方式相比,该方案明显缩短了构建发布时间,提高了构建发布的效率.

猜你喜欢

源码批处理命令
只听主人的命令
面向数据可靠传输的高译码率带反馈的LT码
国内一站式工程设备租赁平台众能联合完成C2、C3两轮融资
浅谈开源操作系统的历史
恶意批处理文件导致电脑黑屏、反复重启、无响应的原因分析及应对思路
企业如何保护源码
移防命令下达后
借助批处理 让Cortana变聪明
这是人民的命令
基于PSD-BPA的暂态稳定控制批处理计算方法的实现