[英]Ant-contrib foreach task - last value in the list
我目前正在使用foreach ant任务执行部署,并且列表中包含应用程序服务器名称(2个服务器)。 在移至下一个应用程序服务器之前,有一种逻辑等待2分钟(睡眠)。
逻辑工作正常,但是即使在第二台(最后一个)应用服务器之后也应用了睡眠,这增加了2分钟。
有没有办法找到我已经达到列表中的最后一个值? 这样我可以不用等待就退出。
sl.app.server.list=lstrdrasv01.str.staples.com
<foreach list="${sl.app.server.list}" param="sl.app.server" target="Storelocator.app.deploy" parallel="false" inheritall="true"/>
<sshexec host="${sl.app.server}"
username="${sl.app.username}"
password="${sl.as.password}"
trust="true"
output="output"
command="${start}"/>
<echo message="Waiting for Rolling deploy 2 min..."/>
<sleep seconds="120"/>
</target>
睡眠执行了2次,其中我的列表包含2台服务器,理想情况下,它应该只睡眠1次,因为第二台服务器之后没有更多服务器。
您应该使用for而不是foreach ,因为foreach使用antcall,而for使用macrodef。
注意:可以与antcontrib1.0b2一起使用 ,最新版本antcontrib1.0b3有一些错误,并且会因以下原因而失败:
BUILD FAILED
if doesn't support the nested "isgreaterthan" element.
无需额外目标的解决方案,所有工作都可以按顺序完成:
<project>
<!-- Import AntContrib -->
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<property name="sl.app.server.list" value="server1,server2"/>
<!-- make use of jdk builtin javascript engine (since jdk 1.6.0_06) -->
<script language="javascript">
project.setProperty('serveritems', project.getProperty("sl.app.server.list").split(',').length);
</script>
<for list="${sl.app.server.list}" param="server" delimiter=",">
<sequential>
<echo>
Remaining $${serveritems} => ${serveritems}
process Server : @{server}
</echo>
<!--
NOTE : you have to use @{..} syntax here !
<sshexec host="@{server}" ...
-->
<if>
<isgreaterthan arg1="${serveritems}" arg2="1"/>
<then>
<echo>Waiting for Rolling deploy 2 min...</echo>
<sleep seconds="120"/>
</then>
</if>
<!-- this doesn't work correctly, note the output
Remaining ${serveritems} => -1 in second loop -->
<!--
<math result="serveritems" operand1="${serveritems}" operation="-" operand2="1" datatype="int"/>
-->
<!-- decrease serveritems -->
<script language="javascript">
project.setProperty('serveritems', parseInt(project.getProperty('serveritems')) - 1);
</script>
</sequential>
</for>
</project>
输出错误的<math result ... />
以减少serveritems:
[echo] Remaining ${serveritems} => 2
[echo] process Server : server1
[echo]
[echo] Waiting for Rolling deploy 2 min...
[echo] Remaining ${serveritems} => -1
[echo] process Server : server2
[echo]
使用脚本语言javascript输出serveritems减少:
[echo] Remaining ${serveritems} => 2
[echo] process Server : server1
[echo]
[echo] Waiting for Rolling deploy 2 min...
[echo] Remaining ${serveritems} => 1
[echo] process Server : server2
[echo]
最后=>请注意,如@macrodef一样,在顺序!中使用@ {..}进行参数替换!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.