【ANT】实现与Bat批处理、Jenkins集成管理
迁移到ANT的原因是最近公司的VM在更新,很多测试数据的路径改变,导致测试失败。如果在测试代码和测试及脚本中手动更改新的路径,无疑是一项相当繁杂的工作,而ANT可以为我们减少路径更改时的烦恼
迁移到ANT的原因是最近公司的VM在更新,很多测试数据的路径改变,导致测试失败。如果在测试代码和测试及脚本中手动更改新的路径,无疑是一项相当繁杂的工作,而ANT可以为我们减少路径更改时的烦恼
一、Ant 简介与安装
1. 简介
Apache Ant是Java库和命令行工具,其任务是驱动构建文件中描述的进程作为彼此依赖的目标和扩展点。Ant的主要已知用法是Java应用程序的构建。Ant提供了许多内置任务,可以编译,组装,测试和运行Java应用程序。Ant也可以有效地用于构建非Java应用程序,例如C或C++应用程序。更一般而言,Ant可用于引导可根据目标和任务描述的任何类型的过程。Ant是用Java编写的。Ant的用户可以开发自己的包含Ant任务和类型的“antlib”,并为他们提供大量现成的商业或开源“antlib”。Ant非常灵活,不会对采用它作为构建工具的Java项目强加编码约定或目录布局。
以上内容来自 Apache Ant官网
本人不是Java开发者,使用Ant的目的是统一管理文件依赖路径,结合Bat批处理实现Jenkins项目持续集成
2. 安装与配置环境变量
下载地址 https://ant.apache.org/bindownload.cgi,下载二进制压缩包

下载完成后解压压缩包,将其复制或剪切至合适位置。接下来需要将其加入环境变量,首先新建变量ANT_HOME,值为解压后的地址

另外还需在Path变量中加入新项,值为 %ANT_HOME%\bin

测试,安装成功则如下所示

二、使用方式
1. 文件类型
Ant文件分为两种类型, xml文件和properties文件
| 文件类型 | 作用 |
|---|---|
| .xml | 脚本功能 |
| .properties | 文件路径 |
xml文件专注实现一些功能性的代码,.properties文件用来将一些固定的文件路径。这样的好处是一旦文件路径改变,只需相应地更改.properties文件里面的变量值即可,而不会影响.xml文件功能
2. 基本语法
Ant的一些基本语法不多赘述,网上资料太多,这里重点讲下我所用到的点
1. 引用 .properties文件
建议xml和properties 文件名称一致,比如test.xml和test.properties,这样的好处是知道这俩文件是配套的,便于识别。引用格式如下
<project name="test" basedir="." default="function_1">
<property file="test.properties"/>
</project>
2. 在.properties中存放固定路径
.properties可以用变量接受路径,变量使用方式为${variable}
test_folder=E:/Builds/Current
test_file=${test_folder}/file.jpg
在xml文件中就可以使用定义好的变量,不过需要注意一点的是在Wndows中 .properties文件变量路径分隔符为/,而.xml文件中路径分隔符为\,有时会混淆,请着重关注一下
3. 引用 target块
每个 target块相当于一个功能,多个target也能合成一个target
<project name="test" basedir="." default="function_1">
<property file="test.properties"/>
<target name="function_1">
<antcall target="function_1.target_1"/>
<antcall target="function_1.target_2"/>
</target>
<target name="function_1.target_1">
<!-- Do something-->
</target>
<target name="function_1.target_2">
<!-- Do something-->
</target>
<target name="function_2">
<!-- Do something-->
</target>
</project>
4. 使用
在安装完后我们已经将Ant加入环境变量,所以可以直接在cmd运行Ant脚本
ant -buildfile D:\test\ant-scripts\test.xml
以上面target块内容为例,当没有设定具体执行哪个target时,会自动执行默认的target,即function_2
ant -buildfile D:\test\ant-scripts\test.xml "funtion_2"
也可以指定具体执行某个target,如function_2
三、与Bat批处理集成
虽然Ant中xml脚本也能实现一些具体逻辑,但是比较复杂,没有bat批处理方便。所以最终的设想是 用Ant组织文件,用Bat处理逻辑

在实践过程中发现几处难点,以下就详细说明如何解决这些问题
- Bat如何接受文件路径参数
- Ant如何调用Bat文件
- Ant脚本执行结果不明确
1. Bat接受文件参数
首先我们需要知道Bat是可以接受参数的,这里简单介绍下如何传递参数给Bat文件,首先有这么一个test.bat,它接受参数然后打印参数
@echo on
set parameter_1=%1
set parameter_2=%2
set parameter_3=%3
echo %parameter_1% %parameter_2% %parameter_3%
cmd中测试,可以输出正确结果
test.bat "aa" "bb" "cc"
有关更多Bat文件参数可以参考 命令行传递给批处理的参数
2. Ant调用bat文件
Ant本身是支持调用cmd的,详细内容可以参考 Exc Task,例子如下
<target name="exec_bat">
<exec executable="cmd">
<arg value="/c"/>
<arg value="test.bat"/><!--和该xml文件同一目录 -->
<arg value="aa"/>
<arg value="bb"/>
<arg value="bb"/>
</exec>
</target>
这样当我们执行xml文件时
ant -buildfile D:\test\ant-scripts\test.xml "exec_bat"
输出结果和在cmd中直接运行一致
D:\test\ant-scripts\test.bat "aa" "bb" "cc"
需要注意的是 <arg value="/c"/>这行一定不能少,它属于声明语句表明在cmd运行,然后不能使用<arg line="xxx">因为这样不起作用。需要对每个bat脚本语句进行输入
if exist D:\test\file do copy D:\test\file E:\temp\
如果用Ant脚本输入的话就会变成
<arg value="/c"/>
<arg value="if"/>
<arg value="exist"/>
<arg value="D:\test\file"/>
<arg value="do"/>
<arg value="copy "/>
<arg value="D:\test\file"/>
<arg value="E:\temp"/>
可以看到十分繁琐与复杂,所以建议代码逻辑在bat中处理,Ant只需传递固定参数即可
3. 显示正确Build状态
在Ant执行cmd时,测试发现无论bat执行是否出错,Ant的Build状态始终时成功的。这是因为Bat的错误信息没有传递给Ant,Ant就始终认为Build成功。
所以在Bat中命令结束后需要返回当前执行结果,首先Bat脚本需要在每个命令结束后判断当前执行状态,如果失败则退出整个Bat,且不执行后续命令。errorlevel !=0代表执行失败,最后返回errorlevel的值
可以参考这些资料
https://stackoverflow.com/questions/22395597/propagating-exit-code-from-execd-batch-file-back-to-ant
https://stackoverflow.com/questions/734598/how-do-i-make-a-batch-file-terminate-upon-encountering-an-error
@echo on
::接收参数
set origin_file=%1
set dir1=%2
set dir2=%3
:: 替换成正确的分隔符
set origin_file=%origin_file:/=\%
set dir1=%dir1:/=\%
set dir2=%dir2:/=\%
copy %origin_file% %dir1%
if %errorlevel% neq 0 exit %errorlevel%
copy %origin_file% %dir2%
if %errorlevel% neq 0 exit %errorlevel%
另一方面,Ant需要对返回结果进行处理,如果返回结果是不是0,则Build失败。这里用resultproperty接受cmd返回值,然后在fail块进行判断。这样就可以得到Ant正确的Build状态
## properties内容
origin_file=D:/test/file
dir1=E:/temp
dir2=F:/temp
<!--xml片段-->
<target name="exec_bat">
<exec executable="cmd" resultproperty="_buildErrorCode">
<arg value="/c"/>
<arg value="test.bat"/>
<arg value="${originfile}"/>
<arg value="${dir1}"/>
<arg value="${dir2}"/>
</exec>
<echo message="Bat Error Code: ${_buildErrorCode}"/>
<fail message="Set ant build result">
<condition>
<not>
<equals arg1="${_buildErrorCode}" arg2="0"/>
</not>
</condition>
</fail>
</target>
四、与Jenkins集成
1. 插件与配置
下载 Ant Puglin,在全局工具配置中配置Ant路径

这样设置后可以在Pipeline项目中使用withAnt命令,
2. Jenkinsfile参数
但是我觉得withAnt命令太繁琐而Ant路径已经加入环境变量,所以还是直接使用Window Batch Shell方便,在Stage中执行xml文件即可
stage('1. Dosomething_1'){
steps{
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
bat label: '', script: 'ant -buildfile %WorkSpace%\\test.xml "function_1"'
}
}
}
stage('1. Dosomething_2'){
steps{
catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
bat label: '', script: 'ant -buildfile %WorkSpace%\\test.xml "function_2"'
}
}
}
这样在只需改变Jenkinsfile中所需的xml target参数,即可实现调用不同的功能,一旦测试数据发生变化只需修改properties文件即可,其他的所有脚本都无需改变