ant远程发布

来源:互联网 发布:日语 推荐信 知乎 编辑:程序博客网 时间:2024/05/20 16:14

公司做的是台湾的外包,每次发布都要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?

回答的很干脆:不可以!

靠!!

 

  
原创粉丝点击