ANT - 对现有脚本的速度改进

时间:2011-10-25 13:24:14

标签: deployment ant

我已经构建了一组通用的部署脚本,这些脚本非常适合我们的大部分内容。然而,我们刚刚介绍了我们最大的项目设置,我们现在发现时间太多了,我们不喜欢。

目前的项目规模为33,226个文件,大小为400Mb以上。时间目前在13分钟和15分钟之间55分钟(最后部署时间)取决于ANT做出的某些决定(更多信息如下)。

就我们目前在x2服务器上执行以下步骤而言: -

1)ANT将项目从SVN导出到两台服务器(由3部分组成)。

2)它开始关闭服务器#1上的Web服务。 这是我们为阻止Windows(2003)文件锁定失败而采取的解决方法。

3)ANT在当前版本(所有部分)上运行“移动”任务到临时文件夹&将导出的新版本移动到其位置。

4)运行自定义部署代码 - 一部分是将永久性功能从临时文件夹移动到新的(即系统文件/ Web服务器管理工​​具)。

5)删除临时文件夹。

6)使网络服务重新上线

...冲洗并重复第二个服务器步骤2 - > 6。

7)保存ANT日志。

我遇到的主要问题是ANT移动任务似乎是两个决定之一。它要么:

a)非常简单地将版本交换并继续 - 花一两分钟来处理它或 b)通过某种完整性检查,它将每个文件和文件夹从一个地方移动到另一个地方。这会使日志泛滥并需要相当长的时间才能完成。因此,额外增加了40多分钟。

我在网上找不到任何可以解释导致ANT / OS做出决定的原因。选项A将是理想的全职情况。

我试过复制,单独删除。我尝试过同步任务。所有人似乎都有这种缓慢的表现。

所以我真的要问的是那些比我更有经验的人对这种规模的部署做了什么。您对如何改进/加快此过程有任何提示/提示吗?任何想法移动正在做什么,以及是否有更好的方法来做这一切?

非常感谢, 詹姆斯

2 个答案:

答案 0 :(得分:1)

感谢所有输入。

为了给这个添加一个答案,我做了以下修改,似乎已经敲了几分钟。

第一个是我改变了我之前提到的评论背后的交换方式。似乎ANT会尝试执行以下操作: -

“如果目标目录尚不存在,Ant将重命名该目录。但是如果目标目录存在,它会复制到目录中并从源目录中删除。”

我认为发生的事情是ANT试图在旧版本被完全删除之前放入新版本。因此,我没有尝试重命名旧的,而是将其移动到临时文件夹中,并在构建结束时将其删除。这似乎在这方面有稳定的东西。


我添加了一些使ANT有点聪明的事情: - )

1)我已经设置好了,所以ANT不会部署与当前存在的部分相同的构建部分。因此,如果选择了第1部分并且已经在测试环境中,那么它将从构建和SVN导出中删除。

2)随着服务关闭/启动,我有ANT读取回来的响应。如果一个服务告诉它它已经在调用时启动,有时会发生一个服务依赖于其他Windows自动启动它们,那么我告诉ANT要闲逛并转移到下一个。


像这样的小步骤似乎已经改善了一些东西。我还是想尝试从中获得更多,但这些确实给了他们一大步。

再次感谢, 詹姆斯

答案 1 :(得分:0)

即使我们遇到了自动部署脚本在我们的组织中花费更长时间的问题。所以最初我们的脚本运行顺序像清理,停止tomcats,更新,启动tomcats并确保所有webapps都已正确部署。

所以我们做了以下事情: 1.平行清洁和停止所有的雄猫 svn swith 3.平行开始所有的雄猫 4.确保使用jmx

正确部署所有Web应用程序

这是一段代码:

    <target name="all_clean_parallel">
      <parallel>
        <antcall target="x1_clean"/>
        <antcall target="x2_clean"/>
        <antcall target="x3_clean"/>            
    </parallel>  
  </target> 

  <target name="all_start_parallel">
    <parallel>
      <antcall target="x1_start"/>
      <antcall target="x2_start"/>
      <antcall target="x3_start"/>        
   </parallel>
  </target>

使用jmx help检查是否正确部署webapp的代码:

 <macrodef name="mStatus">
   <attribute name="aModule" />
   <attribute name="aHost" default="localhost"/>
   <attribute name="aPort" default="9012"/>
   <attribute name="aMaxWait" default="240"/>
   <attribute name="aTomcat" default=""/>
   <attribute name="aState" default="1"/>
   <sequential>
     <waitfor maxwait="@{aMaxWait}" maxwaitunit="second" timeoutproperty="@{aHost}.@{aTomcat}.@{aModule}.@{aPort}.server.timeout" >
     <and>
       <jmx:equals
                host="@{aHost}"
                port="@{aPort}"
                ref="@{aHost}.@{aTomcat}.@{aModule}.@{aPort}"
                        name="Catalina:j2eeType=WebModule,name=//localhost/@{aModule},J2EEApplication=none,J2EEServer=none" 
                attribute="state"
                value="@{aState}"
    />
  </and>

</waitfor>
<if>
  <equals arg1="${@{aHost}.@{aTomcat}.@{aModule}.@{aPort}.server.timeout}" arg2="true" />
  <then>
    <var name="failBuild" value="true"/>
    <echo message="*************************Host.Tomcat.Module = @{aHost}.@{aTomcat}.@{aModule} is not deployed into the tomcat" />
  </then>
  <else>
    <echo message="@{aHost}.@{aModule} is deployed into the tomcat" />
  </else>
 </if>
</sequential>