ant的远程发布
程序员文章站
2022-03-06 18:34:52
...
以前公司做的是*的外包,每次发布都要remote到*的几台机器,经常有人抢机器用。每次要手动去check out,再执行ant,非常麻烦 。研究了一段时间的ant,有几种远程发布的方法。
一是用FTP,用ant的ftp命令把要发布的文件远程的复制过去,这样要在那边机器上装FTP服务器,还要分配账号,挺讨厌的。
二是用tomcat给的ant任务:deploy,可以把本地WAR文件传送到远程tomcat下,当然,tomcat要运行,也要设置好
tomcat的manager用户。我在本地局域网试一下,成功。
ant脚本简写如下,可能有些property没有复制过来
<property name="project.war.filename" value="${project.name}.war"/>
<property name="project.war.filepath" location="${dist.dir}/${project.war.filename}"/>
<property name="tomcat.server" value="192.168.0.117"/>
<property name="tomcat.username" value="admin"/>
<property name="tomcat.password" value="admin"/>
<property name="tomcat.port" value="8080"/>
<property name="tomcat.project.path" value="${project.name}"/>
<property name="tomcat.server.url" value="http://${tomcat.server}:${tomcat.port}"/>
<property name="tomcat.deploy.url" value="http://${tomcat.server}:${tomcat.port}/manager"/>
<target name="deploy-web" >
<echo message="deploy start" />
<deploy url="${tomcat.deploy.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="${tomcat.project.path}"
war="file:${project.war.filepath}"
update="true" />
<echo message="deploy end" />
</target>
本地速度很快,但是,传到*就比较烦了,WAR档几十MB速度太慢了,看着那边的机器tomcat老是一行行的打印出来正在接受远程发布,极其不爽.
最后研究了一下ant的telnet任务,这个初始的时候我根本就用不起来,可以telnet成功,但提示无法执行命令,google搜的头都大了,有老外说这个命令对windows支持不好,最好用linux,这个又不太现实.我反复尝试,最后发现是可以执行的,脚本如下:
<property name="telnet.server" value="192.168.0.103"/>
<property name="telnet.userid" value="administrator"/>
<property name="telnet.password" value=""/>
<property name="telnet.prompt" value="[done]" />
<property name="telnet.timeout" value="3" />
<property name="telnet.port" value="23"/>
<property name="telnet.cd.directory" value="D:\xxxx\xxxx"/>
<target name="unix-prompts" if="target.isUnix">
<property name="telnet.prompt.command"
value="export PS1=${telnet.prompt}"/>
<property name="telnet.initial.prompt" value="$"/>
</target>
<target name="windows-prompts" unless="target.isUnix">
<property name="telnet.prompt.command"
value="PROMPT ${telnet.prompt}"/>
<property name="telnet.initial.prompt" value=">"/>
</target>
<target name="deploy-remote"
depends="unix-prompts,windows-prompts"
unless="is.localhost">
<telnet server="${telnet.server}" port="${telnet.port}"
userid="${telnet.userid}" password="${telnet.password}"
timeout="${telnet.timeout}" >
<read string="${telnet.initial.prompt}"/>
<write>${telnet.prompt.command}</write>
<read string="${telnet.prompt}"/>
<write>cd ${telnet.cd.directory}</write>
<read string="${telnet.prompt}"/>
<read string="${telnet.prompt}"/>
<write>ant -buildfile=${telnet.cd.directory}\build.xml</write>
<read string="${telnet.prompt}"/>
</telnet>
</target>
公司不用CVS,用的是starteam,于是再用starteam为提供的命令写个自动check out的脚本,如下:
<property name="starteam.servername" value="***.***.tw"/>
<property name="starteam.serverport" value="49222"/>
<property name="starteam.projectname" value="***_PROJECT"/>
<property name="starteam.viewname" value="***_PROJECT"/>
<property name="starteam.rootlocalfolder" value="D:\***_PROJECT"/>
<property name="starteam.rootstarteamfolder" value="***_PROJECT"/>
<property name="starteam.forced" value="false"/>
<property name="starteam.includes" value="*.*"/>
<property name="starteam.deleteuncontrolled" value="false"/>
<property name="starteam.recursive" value="true"/>
<property name="starteam.username" value="someuser"/>
<property name="starteam.password" value="*****"/>
<target name="check-out">
<stcheckout
servername="${starteam.servername}"
serverport="${starteam.serverport}"
username="${starteam.username}"
password="${starteam.password}"
projectname="${starteam.projectname}"
viewname="${starteam.viewname}"
recursive="${starteam.recursive}"
includes="${starteam.includes}"
forced="${starteam.forced}"
deleteuncontrolled="${starteam.deleteuncontrolled}"
rootlocalfolder="${starteam.rootlocalfolder}"
/>
</target>
注意starteam*.jar的版本要与自己机器上的starteam客户端版本一致,不然会出现unknown.
再加上个测试有没有发布成功的脚本
<target name="test-url">
<waitfor maxwait="5" maxwaitunit="second" timeoutproperty="project.missing">
<http url="${project.url}"/>
</waitfor>
<fail if="project.missing">No project found</fail>
</target>
再加上个如果成功发布则为项目成员发mail通知:
<target name="send-mail">
<mail from="***@***.com.cn"
bcclist="${addres.list}"
mailhost="192.168.0.9"
subject="deploy success"
message="${success.message}"
>
</mail>
</target>
判断tomcat是否在运行,如果没有则启动之,如下:
<target name="wait-for-server">
<waitfor maxwait="5" maxwaitunit="second" timeoutproperty="server.missing">
<http url="${tomcat.server.url}"/>
</waitfor>
</target>
<target name="start-tomcat" depends="wait-for-server" if="server.missing">
<exec dir="${tomcat.home}/bin" executable="${tomcat.home}/bin/startup.bat" />
</target>
再设置好依赖关系与选择性执行任务,局域网内测试通过.
到时我们只要在本机执行deploy-remote,就可以让*那边机器自己去check out编译打包启动tomcat发布测试发布联接是否有效有效则发mail通知开发人员发布成功,再也不用remote到*机器上远程操作,打开starteam手工check out再打开控制台执行ant了,生活是多么美好啊!!
OK,万事具备,MSN上找到*人:可不可以在测试服务器上开通telnet?
回答的很干脆:不可以!
靠!!
一是用FTP,用ant的ftp命令把要发布的文件远程的复制过去,这样要在那边机器上装FTP服务器,还要分配账号,挺讨厌的。
二是用tomcat给的ant任务:deploy,可以把本地WAR文件传送到远程tomcat下,当然,tomcat要运行,也要设置好
tomcat的manager用户。我在本地局域网试一下,成功。
ant脚本简写如下,可能有些property没有复制过来
<property name="project.war.filename" value="${project.name}.war"/>
<property name="project.war.filepath" location="${dist.dir}/${project.war.filename}"/>
<property name="tomcat.server" value="192.168.0.117"/>
<property name="tomcat.username" value="admin"/>
<property name="tomcat.password" value="admin"/>
<property name="tomcat.port" value="8080"/>
<property name="tomcat.project.path" value="${project.name}"/>
<property name="tomcat.server.url" value="http://${tomcat.server}:${tomcat.port}"/>
<property name="tomcat.deploy.url" value="http://${tomcat.server}:${tomcat.port}/manager"/>
<target name="deploy-web" >
<echo message="deploy start" />
<deploy url="${tomcat.deploy.url}"
username="${tomcat.username}"
password="${tomcat.password}"
path="${tomcat.project.path}"
war="file:${project.war.filepath}"
update="true" />
<echo message="deploy end" />
</target>
本地速度很快,但是,传到*就比较烦了,WAR档几十MB速度太慢了,看着那边的机器tomcat老是一行行的打印出来正在接受远程发布,极其不爽.
最后研究了一下ant的telnet任务,这个初始的时候我根本就用不起来,可以telnet成功,但提示无法执行命令,google搜的头都大了,有老外说这个命令对windows支持不好,最好用linux,这个又不太现实.我反复尝试,最后发现是可以执行的,脚本如下:
<property name="telnet.server" value="192.168.0.103"/>
<property name="telnet.userid" value="administrator"/>
<property name="telnet.password" value=""/>
<property name="telnet.prompt" value="[done]" />
<property name="telnet.timeout" value="3" />
<property name="telnet.port" value="23"/>
<property name="telnet.cd.directory" value="D:\xxxx\xxxx"/>
<target name="unix-prompts" if="target.isUnix">
<property name="telnet.prompt.command"
value="export PS1=${telnet.prompt}"/>
<property name="telnet.initial.prompt" value="$"/>
</target>
<target name="windows-prompts" unless="target.isUnix">
<property name="telnet.prompt.command"
value="PROMPT ${telnet.prompt}"/>
<property name="telnet.initial.prompt" value=">"/>
</target>
<target name="deploy-remote"
depends="unix-prompts,windows-prompts"
unless="is.localhost">
<telnet server="${telnet.server}" port="${telnet.port}"
userid="${telnet.userid}" password="${telnet.password}"
timeout="${telnet.timeout}" >
<read string="${telnet.initial.prompt}"/>
<write>${telnet.prompt.command}</write>
<read string="${telnet.prompt}"/>
<write>cd ${telnet.cd.directory}</write>
<read string="${telnet.prompt}"/>
<read string="${telnet.prompt}"/>
<write>ant -buildfile=${telnet.cd.directory}\build.xml</write>
<read string="${telnet.prompt}"/>
</telnet>
</target>
公司不用CVS,用的是starteam,于是再用starteam为提供的命令写个自动check out的脚本,如下:
<property name="starteam.servername" value="***.***.tw"/>
<property name="starteam.serverport" value="49222"/>
<property name="starteam.projectname" value="***_PROJECT"/>
<property name="starteam.viewname" value="***_PROJECT"/>
<property name="starteam.rootlocalfolder" value="D:\***_PROJECT"/>
<property name="starteam.rootstarteamfolder" value="***_PROJECT"/>
<property name="starteam.forced" value="false"/>
<property name="starteam.includes" value="*.*"/>
<property name="starteam.deleteuncontrolled" value="false"/>
<property name="starteam.recursive" value="true"/>
<property name="starteam.username" value="someuser"/>
<property name="starteam.password" value="*****"/>
<target name="check-out">
<stcheckout
servername="${starteam.servername}"
serverport="${starteam.serverport}"
username="${starteam.username}"
password="${starteam.password}"
projectname="${starteam.projectname}"
viewname="${starteam.viewname}"
recursive="${starteam.recursive}"
includes="${starteam.includes}"
forced="${starteam.forced}"
deleteuncontrolled="${starteam.deleteuncontrolled}"
rootlocalfolder="${starteam.rootlocalfolder}"
/>
</target>
注意starteam*.jar的版本要与自己机器上的starteam客户端版本一致,不然会出现unknown.
再加上个测试有没有发布成功的脚本
<target name="test-url">
<waitfor maxwait="5" maxwaitunit="second" timeoutproperty="project.missing">
<http url="${project.url}"/>
</waitfor>
<fail if="project.missing">No project found</fail>
</target>
再加上个如果成功发布则为项目成员发mail通知:
<target name="send-mail">
<mail from="***@***.com.cn"
bcclist="${addres.list}"
mailhost="192.168.0.9"
subject="deploy success"
message="${success.message}"
>
</mail>
</target>
判断tomcat是否在运行,如果没有则启动之,如下:
<target name="wait-for-server">
<waitfor maxwait="5" maxwaitunit="second" timeoutproperty="server.missing">
<http url="${tomcat.server.url}"/>
</waitfor>
</target>
<target name="start-tomcat" depends="wait-for-server" if="server.missing">
<exec dir="${tomcat.home}/bin" executable="${tomcat.home}/bin/startup.bat" />
</target>
再设置好依赖关系与选择性执行任务,局域网内测试通过.
到时我们只要在本机执行deploy-remote,就可以让*那边机器自己去check out编译打包启动tomcat发布测试发布联接是否有效有效则发mail通知开发人员发布成功,再也不用remote到*机器上远程操作,打开starteam手工check out再打开控制台执行ant了,生活是多么美好啊!!
OK,万事具备,MSN上找到*人:可不可以在测试服务器上开通telnet?
回答的很干脆:不可以!
靠!!
上一篇: jdbc原生
下一篇: jdbc 大数据量下载