在Ant中对exec任务重试任务会给出错误的结果

时间:2018-10-03 11:17:06

标签: ant exec ant-contrib

我的蚂蚁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,就好像是成功。

2 个答案:

答案 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>