wuxj888 2007-12-25 15:11
关于CruiseControl的问题讨论
大家好:
现在我们正用cuisecontrol工具,版本是2.7.1,感觉不错,我们是使用ant进行自动构建的,目前出现一个问题:
在build.xml中如果执行完tomcat没未关闭的话,cc就会停止,不会再执行,如果执行完关闭tomcat就可以自动执行,不知道什么原因
这是我其中的一段脚本,简化其间
<target name="quickstart" depends="war" description="santation程序">
<echo message="打包部署开始..."/>
<antcall target="tomcat.stop" />
<delete dir="${server.deploy}/${ant.project.name}" />
<delete file="${server.deploy}/${ant.project.name}.war" />
<copy todir="${server.deploy}" file="${release.warfile}" />
<echo message="打包部署结束..."/>
[color=magenta][b] <antcall target="tomcat.start" />[/b] [/color]
<echo message="tomcat启动完毕..."/>
大家请看红色加粗部分,如果把这句去掉,系统运行就正常,否则执行完毕就不再执行,请大家看一下
i子休 2007-12-25 17:15
你的tomcat.start是怎么写的?
如果不是在后台启动的话,CruiseControl当然要等Tomcat返回才能继续执行
wuxj888 2007-12-25 17:23
i子休,谢谢你的回复!
我的tomcat.star写法如下:
[color=red][b]<target name="tomcat.start">
<fail message="Must Set the right catalina.dir in build.properties">
<condition>
<not>
<available file="${catalina.dir}" type="dir" />
</not>
</condition>
</fail>
<if>
<not>
<http url="http://${tomcat.server}:${tomcat.port}" />
</not>
<then>
<echo message="启动Tomcat Web Server..." />
<java classname="org.apache.catalina.startup.Bootstrap" spawn="true" fork="true">
<jvmarg value="-Djava.endorsed.dirs=${catalina.dir}/common/endorsed" />
<jvmarg value="-Dcatalina.base=${catalina.dir}" />
<jvmarg value="-Dcatalina.home=${catalina.dir}" />
<jvmarg value="-Djava.io.tmpdir=${catalina.dir}/temp" />
<arg value="start" />
<classpath>
<pathelement location="${catalina.dir}/bin/bootstrap.jar" />
</classpath>
</java>
<waitfor maxwait="10" maxwaitunit="minute" checkevery="1" checkeveryunit="second">
<and>
<http url="http://${tomcat.server}:${tomcat.port}" />
</and>
</waitfor>
<echo message="Tomcat Web Server已启动" />
</then>
</if>
</target>[/b][/color]但是我在单独执行ant tomcat.start时候很快就给我返回了,而cc一直就不返回,难道是我这个tomcat.start需要做什么修改吗?谢谢
i子休 2007-12-26 12:58
试着直接调用Tomcat的启动脚本,startup.sh或者startup.bat
通常不建议用手动加载Bootstrap类的方式来启动Tomcat
wuxj888 2007-12-26 16:48
改变tomcat方式,cc还是不能轮循执行
谢谢i木子的回复,我已经换成启动startup.bat脚本方式来运行,build.xml配置如下:
[color=red][b]<target name="tomcat.start" description="tomcat starting.....">
<exec executable="${catalina.dir}/bin/startup.bat" spawn="true" vmlauncher="false">
<!--设置环境变量。比如JAVA_HOME等-->
<env key="CATALINA_HOME" value="${catalina.dir}" />
<arg line="/c start ${catalina.dir}/bin/startup.bat" />
</exec>
</target>[/b][/color]
目前我已经换成这种方式,经过我测试cc执行一遍完成之后后台抛出一个异常,然后也不再继续轮循执行了,异常如下:
[cc]十二月-26 16:31:20 ScriptRunner - java.lang.NullPointerException
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.XmlLogger$TimedE
lement.access$200(XmlLogger.java:111)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.XmlLogger.messag
eLogged(XmlLogger.java:430)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.Project.fireMess
ageLoggedEvent(Project.java:2009)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.Project.fireMess
ageLogged(Project.java:2029)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.Project.log(Proj
ect.java:357)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.Project.demuxOut
put(Project.java:1084)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.DemuxOutputStrea
m.processBuffer(DemuxOutputStream.java:171)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.DemuxOutputStrea
m.write(DemuxOutputStream.java:146)
[cc]十二月-26 16:31:20 ScriptRunner - at org.apache.tools.ant.DemuxOutputStrea
m.write(DemuxOutputStream.java:240)
[cc]十二月-26 16:31:20 ScriptRunner - at java.io.PrintStream.write(PrintStream
.java:412)
[cc]十二月-26 16:31:20 ScriptRunner - at sun.nio.cs.StreamEncoder$CharsetSE.wr
iteBytes(StreamEncoder.java:336)
[cc]十二月-26 16:31:20 ScriptRunner - at sun.nio.cs.StreamEncoder$CharsetSE.im
plFlushBuffer(StreamEncoder.java:404)
[cc]十二月-26 16:31:20 ScriptRunner - at sun.nio.cs.StreamEncoder$CharsetSE.im
plFlush(StreamEncoder.java:408)
[cc]十二月-26 16:31:20 ScriptRunner - at sun.nio.cs.StreamEncoder.flush(Stream
Encoder.java:152)
[cc]十二月-26 16:31:20 ScriptRunner - at java.io.OutputStreamWriter.flush(Outp
utStreamWriter.java:213)
[cc]十二月-26 16:31:20 ScriptRunner - at java.util.logging.StreamHandler.flush
(StreamHandler.java:225)
[cc]十二月-26 16:31:20 ScriptRunner - at java.util.logging.ConsoleHandler.clos
e(ConsoleHandler.java:98)
[cc]十二月-26 16:31:20 ScriptRunner - at java.util.logging.LogManager.resetLog
ger(LogManager.java:658)
[cc]十二月-26 16:31:20 ScriptRunner - at java.util.logging.LogManager.reset(Lo
gManager.java:641)
[cc]十二月-26 16:31:20 ScriptRunner - at java.util.logging.LogManager$Cleaner.
run(LogManager.java:204)
但我在自己执行ant启动tomcat命令没有问题,相关问题我也查过,但没有发现具体答案,请大家给予看一下,谢谢!
wuxj888 2007-12-26 17:28
手工关闭tomcat命令窗口,问题解决,如何回传信息
i木子,你好,我刚才又测试了一下,如果在tomcat启动之后我手工把弹出的命令窗体关闭的话(手工停止tomcat),cc就可以立即执行了,
如果不手工关闭他就不执行,您提到的
[color=red][b]你的tomcat.start是怎么写的?
如果不是在后台启动的话,CruiseControl当然要等Tomcat返回才能继续执行[/b][/color]
请问我如何把这这个传给cc,表明已经执行完毕,让他继续轮循呢?
这是我启动tomcat的脚本
<target name="tomcat.start" description="tomcat starting.....">
<exec executable="${catalina.dir}/bin/startup.bat" spawn="true" vmlauncher="false">
<!--设置环境变量。比如JAVA_HOME等-->
<env key="CATALINA_HOME" value="${catalina.dir}" />
<arg line="/c start ${catalina.dir}/bin/startup.bat" />
</exec>
</target>
谢谢!
i子休 2007-12-27 09:16
[code]
<target name="tomcat.start">
<exec executable="start">
<env key="CATALINA_HOME" value="${catalina.dir}" />
<arg value="${catalina.dir}/bin/startup.bat" />
</exec>
</target>
[/code]
你写成这样试试看
wuxj888 2007-12-27 10:12
关于cc中启动tomcat问题,cc不继续执行
十分感谢i木子回复!
我使用您给的启动tomcat的写法,启动后后台报
[cc]十二月-27 09:51:02 ScriptRunner - D:\cruisecontrol-bin-2.7.1\projects\sanit
ation\build.xml:372: Execute failed: java.io.IOException: CreateProcess: start t
omcat/bin/startup.bat error=2
的错误,tomcat也无法启动,我查了原因是在 executable="start"里面需要指定路径,如果改成这样
<target name="tomcat.start">
[color=red]<exec executable="${catalina.dir}/bin/startup.bat">[/color]
<env key="CATALINA_HOME" value="${catalina.dir}" />
<arg value="${catalina.dir}/bin/startup.bat" />
</exec>
</target>
在后台单独执tomcat.start就可以启动,但启动后后台一直等待不返回
tomcat.start:
[exec] Using CATALINA_BASE: tomcat
[exec] Using CATALINA_HOME: tomcat
[exec] Using CATALINA_TMPDIR: tomcat\temp
[exec] Using JRE_HOME: C:\Java\jdk1.5.0_11
但在cc中还是报相同错误
[cc]十二月-27 10:01:24 ScriptRunner - D:\cruisecontrol-bin-2.7.1\projects\sanit
ation\build.xml:458: The following error occurred while executing this line:
[cc]十二月-27 10:01:24 ScriptRunner - D:\cruisecontrol-bin-2.7.1\projects\sanit
ation\build.xml:372: Execute failed: java.io.IOException: CreateProcess: tomcat\
bin\startup.bat tomcat/bin/startup.bat error=2
所以目前看不是这个问题,现在用了很多方法,各种启动tomcat的方式都试过了,但还是不行,最好方式就是执行完后CC收不到返回信息,不再继续执行,只能手工关闭启动的窗口cc就能继续执行,
<target name="tomcat.start" description="tomcat starting.....">
<exec executable="${catalina.dir}/bin/startup.bat" spawn="true" vmlauncher="false">
<!--设置环境变量。比如JAVA_HOME等-->
<env key="CATALINA_HOME" value="${catalina.dir}" />
<arg line="/c start ${catalina.dir}/bin/startup.bat" />
</exec>
</target>
怀疑是不是cc对这种server启动是不是不支持呢?请给予解答!
i子休 2007-12-27 11:01
噢,你需要把catalina.dir改成绝对路径,或者在exec任务中加一个dir参数
我那个写法应该没问题的,start是Windows用来在后台运行程序的命令
wuxj888 2007-12-27 18:10
tomcat启动,cc不继续执行
已经试过了,还是不行,tomcat启动了,但还是没返回信息给cc,cc还是不执行,
估计是cc不支持这种方式???
网上有一个帖子
[url]http://confluence.public.thoughtworks.org/display/CC/Starting+a+server+with+cc[/url]
说可以解决,试过它的方法也不是
wangwen 2008-4-3 09:41
从来没做过这种方式启动tomcat 为什么要用CC调用ANT启动它?