1、 版本构建简介
Ø 一个误解:版本构建就是编译。这只是版本构建的一个方面,版本构建还应该包括:代码更新,远程部署,单元测试等。
Ø 广义的版本构建是和自动测试联系在一起的,就是保证每天的版本能正常运行,并能通过自动测试。
Ø 我们目前的版本构建目的有两个:一个是给测试人员提供合适的版本进行测试,另外一个就是约束开发人员每天checkin的代码是有效的(从编译层面上)。
2、 ANT工具
Ant是一个基于JAVA的跨平台的构建工具。具有如下特点:
• 语法简单,使用xml脚本。
• 运行速度快。
• 可以集成其他工具,如:ClearCase,JUIT等。
• 可扩展性,可以自定义任务。
• 易于部署,通过FTP,COPY等任务进行部署。
• 可以调用任意其他可执行程序。
ANT脚本结构
Ø 搭建环境:将ant工具包拷贝到任意指定的目录,设置ANT_HOME 环境变量,将$ANT_HOME/bin目录添加到path环境变量中
Ø 脚本结构:
<project name=“build_server” default=“all”> --工程
<targetname=“compile”> --目标
<javac srcdir=“.”/> --任务
</target>
</project>
其中一个脚本文件包括一个工程,一个工程可以包括多个目标,目标之间可以具有依赖关系,一个目标可以包括多个任务。
Ø 脚本执行:通过命令行ant –f filename
ant默认执行的文件为:build.xml
ANT命令行选项介绍
• ant –h 帮助
• ant –version 显示版本信息
• ant –f filename 指定构建的文件
• ant –logger classname 指定日志记录程序
• ant –l filename指定记录的日志文件名
• ant –verbose 详细的构建过程信息
• ant –propertyfile filename 指定属性文件名
举例:
ant –logger org.apache.tools.ant.listener.Maillogger –ldailybuild.log -verbose
ANT核心任务之javac
• 任务说明:javac是最核心的任务,用于编译源码
• 实例:<javac srcdir="${src.dir}"destdir="${build.dir}" debug="on" debuglevel="lines,vars,source">
<classpathrefid="vendorclasspath"/>
</javac>
• 属性说明:
• srcdir:指定源代码的目录位置
• destdir:指定编译后的class存放目录位置,若不对destdir进行设置
默认class和源代码放置相同位置。
• debug:debug的编译开关
• debuglevel:debug级别。(从日志的异常能定位到代码的行数,就是因为这个选项设置的,否则其结果就是unknown resource)
• classpath :指定编译代码引用的外部lib目录
ANT核心任务之jar
• 任务说明:jar任务用于将编译的class文件打成jar文件
• 实例:
<jardestfile="${jar.dir}/common.jar">
<filesetdir="${build.dir}">
<includename="**/*.*"/>
<excludename="**/*.txt"/>
</fileset>
</jar>
• 属性说明:
destfile:指定打成jar文件的存放目录和文件名。
fileset:用于指定该jar文件包含(include)的文件和不包含(exclude)的文件。
ANT核心任务之文件和目录操作
• 任务说明:makedir,copy,delete这几个任务用于创建目录,拷贝文件,删除文件
• 实例:<mkdir dir="build/classes"/>
<delete dir="${build.dir}"/>
<copy file="${jar.dir}/common.jar" todir="${application.dir}/lib">
</copy >
• 属性说明
dir:待操作的目录
todir:拷贝的目的目录
ANT核心任务之ftp
• 任务说明:ftp任务主要用于远程部署
实例:
<ftp server="${deploy.ftp.ip}"remotedir="${jboss.server.omcr.lib}"userid="${deploy.ftp.username}" password="${deploy.ftp.password}"binary="true" verbose="true" action="put">
<filesetdir="${application.lib.dir}/report">
<include name="*.*"/>
<excludename="_desktop.ini"/>
</fileset>
</ftp>
<echo>FTP部署完成,现在时间是:${now}</echo>
属性说明:
server和remotedir都使用相对路径, userid 和password在build.properties中均有定义。各服务器部署得jboss,用户名和密码会相应不同,在此文档中修改
ANT核心任务之exec
• 任务说明:该任务用于执行其他可执行程序。
• 实例:
<execdir="." executable="dailylabel_night.bat"/>
</exec>
• 属性说明:
dir:指定待执行程序目录。
executable:可执行文件的全名
ANT扩展任务之ccupdate
• 任务说明:该任务是调用clearcase的update命令,进行代码更新。
• 实例:<ccupdate cleartooldir="${cctool.dir}/bin" viewpath="${codeview.dir}"graphical="false" log="update.log" overwrite="true" currenttime="true"rename="false">
</ccupdate >
• 属性说明:
viewpath:待更新视图的路径。
graphical:是否显示图形化信息。
log:更新过程日志文件。
overwrite:是否覆盖。
ANT其他任务介绍
ant:构建一个子工程。
java:运行java程序。
junit:运行单元测试。
javadoc:生成java的doc文件。
echo:打印信息。
telnet:远程登录。
…
可以参考ant的帮助文档,一般你所需要的都提供了。
一个实际的版本构建过程
自动构建包括的功能和应用到的ant任务
• 定时构建 --操作系统定时任务实现,每个版本每天两次
• 清除临时文件 -- ant中的delete任务,保证不同时间编译不冲突
• 初始化目录结构 -- ant中的mkdir任务,创建构建过程用到的各种目录
• 更新代码 -- ant中ccupdate任务,保证编译采用的是最新代码
• 编译代码 -- ant中javac任务,编译源代码
• 自动打包 -- ant中jar任务
• 自动部署 -- ant中ftp任务
• 自动打标签 -- ant中exec任务调用CC的mklabel命令。CC的工具
• 邮件通知构建结果 -- ant中MailLogger属性。通过设置参数实现
• 自动备份构建结果 -- ant中的copy,ftp任务。保证构建过程都有备份。
编写自己的构建脚本
l 通常,构建脚本应包括以下步骤:
ü 设置构建属性
ü 更新代码
ü 初始化
ü 编译
ü 打包
ü 部署
ü 清除
l 关键点:目录的规划
l 脚本编写要领:
ü 易于移植
ü 可配置
ü 易维护
3、 批处理命令
• 批处理程序(也称为批处理文件)可以简化日常的或重复的任务。批处理程序是无格式的文本文件,它包含一条或多条命令,文件扩展名为 .bat 或 .cmd。当在命令提示符下键入文件名时,文件中的命令将顺序执行。
• 任何命令均可以包含在批处理文件中。此外,for、goto 和 if 命令允许有条件地处理批处理文件中的命令。例如,if 命令根据条件语句的结果来执行命令。其他命令允许您控制输入输出以及调用其他批处理程序。可替换参数 % 扩展了批处理脚本参数变量。
批处理命令:Call
• 作用:
– 从一个批处理程序调用另一个批处理程序,而不使父批处理程序停止。call 命令现在将标签接受为调用的目标。
• 语法:
– call [drive:][path]filename [batch-parameters]
– call :label [arguments]
• 参数说明:
– [drive:][path]filename 指定要调用的批处理程序的位置和名称。filename参数必须具有 .bat 或 .cmd 扩展名。
– batch-parameters 指定批处理程序所需要的任何命令行信息。
批处理命令:For
• 作用:
– 对一组文件中的每个文件运行指定的命令。可以在批处理程序中或直接从命令提示符使用 for 命令。
• 语法:
– for %%variable in (set) docommand[command-parameters]
– 要在命令提示符下使用 for,请使用以下语法:
– for %variable in (set) docommand [command-parameters]
• 参数说明:
– %%variable 或%variable :代表可替换的参数。for 命令使用在set 中指定的每个文本字符串替换 %%variable(或 %variable),直到此命令(在command-parameters 中指定)处理所有的文件为止。使用 %% variable 在批处理程序中执行for 命令。使用% variable 通过命令提示符执行 for 命令。变量名区分大小写。
– (set) 指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。
– command 指定要在指定的 set 所包含的每个文件上执行的命令。
– command-parameters :指定要用于指定命令(如果指定的命令要使用任何参数或开关)的任何参数或开关。
批处理命令:%(可替换参数)
• 作用:
– 可替换参数 %0 和 %1 到 %9 可以放在批文件的任何位置。批处理文件运行时,%0 由批处理文件名替换,并且参数变量 %1 到 %9 由命令行上输入的相应参数替换。
– % 参数扩展了批处理脚本参数变量 (%0, %1, ..., %9),如下所示:
– 批处理脚本中的 %* 是引用所有参数的通配符。对于单个参数变量,扩展选项如下表所述。
批处理命令:%(可替换参数扩展选项)
变量 | 描述 |
%~1 | 扩展 %1 并删除所有引号 (") |
%~f1 | 将 %1 扩展到完全合格的路径名 |
%~d1 | 将 %1 扩展到驱动器盘符 |
%~p1 | 将 %1 扩展到路径 |
%~n1 | 将 %1 扩展到文件名 |
%~x1 | 将 %1 扩展到文件扩展名 |
%~s1 | 扩展的路径仅包含短名称 |
%~a1 | 将 %1 扩展到文件属性 |
%~t1 | 将 %1 扩展到文件日期/时间 |
%~z1 | 将 %1 扩展到文件大小 |
%~$PATH:1 | 搜索 PATH 环境变量中列出的目录,并将 %1 扩展到发现的第一个目录的完全合格的名称。如果没有定义环境变量名称,或搜索没有找到文件,则此修改键扩展成空字符串。 |
批处理命令:%组合用法
修改程序可以合并以获得复杂的结果:
变量(使用合并的修改程序) | 说明 |
%~dpI | 只将 %I 展开到驱动器号和路径 |
%~nxI | 只将 %I 展开到文件名和扩展名 |
%~fsI | 将 %I 展开到只包含短名称的完整路径名 |
%~dp$PATH:I | 在 PATH 环境变量所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径 |
%~ftzaI | 将 %I 扩展到与 dir 相似的输出行 |
编写简单批处理程序
l 对于Java程序的运行来说,核心有两个
Ø 运行时环境,由JAVA_HOME定义;
Ø 运行时lib库,由CLASS_PATH定义;
l 简单的lib库的处理方法
l 复杂的lib库的处理方法
批处理程序实例
set TMP_CLASSPATH_=%CLASSPATH_%
if not "%JAVA_HOME%" = "" goto NEXT
@if exist %CURRENT_PATH%jdk1.4
set JAVA_HOME=%CURRENT_PATH%jdk1.4
cd ..
if "%JAVA_HOME%" ="" set JAVA_HOME=%CD%\jdk1.4
:NEXT
for %%i in (%0) do cd /d %%~dpi\..
set CLASSPATH_=%CLASSPATH_%
for %%i in (.\ui.jar) do call".\bin\cpappend.bat" %%i
for %%i in (".\lib\report\*.jar")do call ".\bin\cpappend.bat" %%i
set CLIENT_CLASSPATH_=%CLASSPATH_%
set CLASSPATH_=%TMP_CLASSPATH_%
start %JAVA_HOME%\bin\javaw -cp"%CLIENT_CLASSPATH_%" -Xms128m-Xmx512m com.ccit.omcr.ui.main.UiApplication
• cappend.bat内容:
set CLASSPATH_=%CLASSPATH_%;%1