欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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="&gt;"/>
   </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 大数据量下载