我已经构建了一组通用的部署脚本,它们对我们的大多数东西都很有效。然而,我们刚刚将我们最大的项目引入到设置中,现在我们发现时间太多太长了,不符合我们的喜好。
目前的项目大小为33226个文件,大小为400Mb以上。时间目前在13分钟到55分钟(上次部署时间)之间,这取决于ANT做出的某些决定(更多信息见下文)。
就我们目前在x2服务器上执行的步骤而言:
1) ANT将项目从SVN导出到两台服务器(由3部分组成)。
2)它开始关闭1号服务器上的Web服务。这是我们用来阻止Windows (2003)文件锁定失败部署的变通方法。
3) ANT在当前版本(所有部分)上运行“移动”任务到临时文件夹中,并将导出的新版本移动到其位置。
4)运行定制的部署代码-一部分是将永久功能从临时文件夹移动到新文件夹(即系统文件/ Web服务器管理工具)。
5)删除临时文件夹。
6)使Web服务重新联机
..。冲洗并对第二台服务器重复步骤2 -> 6。
7)保存蚂蚁日志。
我遇到的主要问题是,蚂蚁移动任务似乎做出了两个决定中的一个。它也可以:
a)非常简单地交换版本并继续-花费一两分钟来处理它或b)通过某种完整性检查,它将每个文件和文件夹从一个位置移动到另一个位置。这会淹没日志,并需要相当长的时间才能完成。因此增加了额外的40+分钟数。
我在网上找不到任何东西来解释是什么导致ANT/OS做出这个决定。选项A将是理想的全职情况。
我试过分别复制和删除。我已经尝试过同步任务。所有这些似乎都有这种缓慢的性能。
所以我真的在问,其他比我更有经验的人在这种规模的部署中会做些什么。关于如何改进/加速此过程,您有什么建议/建议吗?你知道move在做什么吗?是否有更好的方法来做这一切?
非常感谢,詹姆斯
发布于 2011-11-01 21:54:50
感谢所有人的投入。
为了给这个问题增加一个答案,我做了以下更改,似乎已经影响了它的几分钟。
第一个是我在前面提到的评论后面改变了交换的方式。看起来蚂蚁会尝试做以下事情:
“如果目标目录不存在,Ant将重命名目录。但如果目标目录存在,它会复制到目录中并从源目录中删除。”
我认为发生的事情是ANT试图在旧版本被完全移除之前放入新版本。因此,我现在将其移到一个临时文件夹中,并在构建结束时将其删除,而不是尝试重命名旧的。这似乎稳定了这方面的情况。
为了让ANT变得更聪明,我还添加了其他一些东西:-)
1)我已经设置了它,这样ANT就不会部署任何与当前存在的构建相同的部分。因此,如果选择了第1部分,并且该部分已经在测试环境中,则将其从构建和SVN导出中删除。
2)随着服务的关闭/启动,我让ANT读取返回的响应。如果一个服务在调用时告诉它它已经启动了,就像有时一个服务依赖于其他Windows自动启动它们时发生的那样,那么我已经告诉ANT挂起并转移到下一个。
像这样的小步骤似乎已经改善了相当多的事情。我仍然想尝试从他们身上获得更多,但这些肯定已经给了他们很大的一步。
再次感谢你,詹姆斯
发布于 2012-08-28 16:05:47
甚至我们也面临着自动部署脚本在我们组织中花费更长时间的问题。所以一开始我们的脚本是按顺序运行的,比如清理,停止tomcats,更新,启动tomcats,并确保所有的we应用程序都被正确部署。
因此,我们做了如下工作: 1.并行清理和停止所有tomcat 2.使用svn sv3.并行启动所有tomcat 4.确保所有we应用使用jmx正确部署。
下面是这段代码:
<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>https://stackoverflow.com/questions/7889943
复制相似问题