我的蚂蚁build.xml中有一段代码
<retry retrycount="10" retrydelay="30000">
<exec executable="${env.M2_HOME}/bin/mvn.cmd" output="@{log}" failonerror="true" resultproperty="res" timeout="@{timeoutmillis}" errorproperty="error">
...
</exec>
</retry>
<echo message="${res}"/>
如果一次失败最多10次,我将重试cmd任务。但是,即使重试几次后仍成功,即使构建成功,res
中返回的值也为1。我希望它是0,就好像是成功。
答案 0 :(得分:0)
Ant中的属性是不可变的(它们不是变量),因此即使您的exec
任务最终成功,结果属性也已经设置为第一次运行时得到的结果。
您可以通过创建一个sequential
块并使用其中的local
任务来控制属性范围来解决此问题。
<retry retrycount="10">
<sequential>
<local name="do.fail" />
<input addproperty="do.fail" validargs="y,n" message="fail?" />
<fail>
<condition>
<equals arg1="${do.fail}" arg2="y" />
</condition>
</fail>
</sequential>
</retry>
运行以上示例将提示用户,直到输入“ n”(或10次重试)为止。
答案 1 :(得分:0)
这不是我所问问题的直接答案。但是考虑到CAustin和jdpjamesp所说的话,我正在读取输出日志的内容,以查看命令是否失败。
即使经过n次失败后,cmd仍通过,该cmd仍将返回1。但是,只有在命令末尾通过时,在mvn的情况下,输出日志才会具有“ BUILD SUCCESS”。因此,搜索此字符串对我有用。但是,不应在每次之后都添加日志。
所以我实现了这一点-
<property name="pass.string" value="BUILD SUCCESS" />
<resourcecount property="pass.string.count">
<fileset id="matches" file="@{log}">
<contains text="${pass.string}" />
</fileset>
</resourcecount>
<if>
<equals arg1="${pass.string.count}" arg2="0" />
<then>
..
</then>
<else>
..
</else>
</if>