2010-02-25 31 views
0

我只是想知道什麼解決方案是設置SVN,並將其部署到只有JSP和類文件的外部服務器。部署時如何清除src文件夾。什麼是適當的設置這個。我只是希望能夠讓多個用戶提交包括src文件在內的工作,但是當他們部署到生產服務器上時,我希望文件結構能夠排除我不需要的src文件夾,.project,.classpath等文件。SVN,Eclipse和Java

+2

我不確定你是否在問正確的問題。 SVN不打算作爲部署解決方案。您通常會使用某種構建工具從SVN中提取項目,構建應用程序工件並進行部署。 – ChrisH 2010-02-25 16:51:43

回答

2

編寫一個腳本(我用這個java項目的ant),將你想要的東西提升/複製到你的生產環境。

在我的情況下,ant腳本:

  1. 創建tmp目錄,
  2. 從源代碼樹到新的文件結構(通常是完全相同的源
  3. 複製特定的文件,只是沒有源文件夾,並排除.svn文件和其他文件,我不希望(.java文件而不是.class文件或罐等)
  4. 編譯和什麼需要
  5. 是否搜索/配置文件中更換瓶(允許部署升級,開發,QA或生產環境可能不同
  6. 拉鍊整個事情並複製(SCP)到路由器的遠程
  7. 目標服務器停止任何現有的運行的應用程序
  8. 解壓新版本
  9. 啓動新的應用程序

我有,在某些項目中,選擇上傳剛剛修改過的文件,而不是重新部署整個應用程序,但是這是一個設計選擇,你會得到讓自己。對於我工作過的大型項目,我傾向於爲每個更新部署整個項目,而不是將單個文件/更改複製到服務器。這樣我就可以確保構建過程和生產環境的完整性,而不必擔心隨機文件可能與項目其餘部分不同步。

一般來說,除了普通的簡單項目之外,您都需要一個真正的make/build環境......您必須自己編寫自己的環境。

螞蟻

Maven的

shell腳本

使

都是可能的解決方案。

<!-- **************** USAGE (DEFAULT) --> 
<target name="usage"> 
    <!-- echo detailed usage instructions here --> 
</target> 


<!-- ************************************************** --> 
<!-- ******************* WAS 4.0 WORKER TARGETS --> 
<target name="init" depends="validenvironment"> 
    <tstamp/> 
    <echo>Build of ${ant.project.name} started at ${TSTAMP} on ${TODAY} </echo> 

</target> 

<target name="inittomcat"> 
    <delete dir="tomcatdeploy" /> 
    <mkdir dir="tomcatdeploy" /> 
</target> 
<target name="initapache"> 
    <delete dir="apacheconfig" /> 
    <mkdir dir="apacheconfig" /> 
</target> 

<!-- validates that you've specified an environment (production, dev, staging etc.) from an allowed list --> 
<target name="validenvironment"> 
    <condition property="valid.environment"> 
     <or> 
      <equals arg1="${penvironment}" arg2="dev" /> 
      <equals arg1="${penvironment}" arg2="qa" /> 
      <equals arg1="${penvironment}" arg2="staging" /> 
      <equals arg1="${penvironment}" arg2="prod" /> 
     </or> 
    </condition> 
    <fail message="Invalid target ${penvironment}." unless="valid.environment" /> 
</target> 

<!-- validates that you've specified a target server to deploy to. Only checks to see if the propery is set, not actual values --> 
<target name="validserver"> 
    <condition property="valid.server"> 
     <isset property="pserver" /> 
    </condition> 
    <fail message="Invalid server ${pserver}. You must specifiy a server for this target." unless="valid.server" /> 
</target> 

<target name="initwar"> 
    <delete dir="tmp/war" /> 
    <mkdir dir="tmp/war" /> 
    <mkdir dir="tmp/war/WEB-INF" /> 
    <mkdir dir="tmp/war/WEB-INF/classes" /> 
    <mkdir dir="tmp/war/WEB-INF/lib" /> 
    <mkdir dir="tmp/war/tags" /> 
    <mkdir dir="tmp/war/images" /> 
    <mkdir dir="tmp/war/javascript" /> 
    <mkdir dir="tmp/war/html" /> 
    <mkdir dir="tmp/war/components" /> 
</target> 

<target name="war" depends="initwar" if="penvironment"> 
    <echo>Compiling source files...</echo> 

    <ant antfile="build.xml" dir="classes/" target="compile" inheritAll="false" > 
     <property name="penvironment" value="${penvironment}" /> 
    </ant> 

    <echo>Compile done.</echo> 

    <copy todir="tmp/war/WEB-INF/classes" preservelastmodified="true" > 
     <fileset dir="classes/build" includes="**/*.class" /> 
    </copy> 
    <copy todir="tmp/war/WEB-INF/controller_jsp" preservelastmodified="true" > 
     <fileset dir="controller" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/WEB-INF" preservelastmodified="true" > 
     <fileset dir="build" includes="**/*.xsl" /> 
    </copy> 
    <copy todir="tmp/war/WEB-INF/lib" preservelastmodified="true" > 
     <fileset dir="build/lib${penv}" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/html" preservelastmodified="true" > 
     <fileset dir="html" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/components" preservelastmodified="true" > 
     <fileset dir="components" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/" preservelastmodified="true" > 
     <fileset dir="root" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/pages" preservelastmodified="true" > 
     <fileset dir="pages" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/tags" preservelastmodified="true" > 
     <fileset dir="tags" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/images" preservelastmodified="true" > 
     <fileset dir="images" includes="**/*.*" /> 
    </copy> 
    <copy todir="tmp/war/javascript" preservelastmodified="true" > 
     <fileset dir="javascript" includes="**/*.*" /> 
    </copy> 

    <!-- copy the web.xml for the target environment into the temp war directory --> 
    <copy tofile="tmp/war/WEB-INF/web.xml" file="xonfig/$penvironment}.web.xml" preservelastmodified="true" > 
    </copy> 
    <!-- now replace all properties in the web.xml file with their values from ${penvironment}.properties --> 
    <echo>Replacing all properties in the web.xml file with their values from ${penvironment}.properties</echo> 
    <replace 
     file="tmp/war/WEB-INF/web.xml" 
     propertyFile="config/${penvironment}.properties"> 
     <replacefilter token="%%HOSTNAME%%" property="webxml.hostname" /> 
    </replace> 

    <copy tofile="tmp/war/WEB-INF/application.properties" file="config/application.properties" preservelastmodified="true" > 
    </copy> 
    <!-- now replace all properties in the application.properties file with their values from ${penvironment}.properties --> 
    <echo>Replacing all properties in the crm.properties file with their values from ${penvironment}.properties</echo> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/war/WEB-INF/application.properties" 
     propertyFile="build/${penvironment}.properties"> 
     <replacefilter token="%%HOSTNAME%%" property="hostname" /> 
     <replacefilter token="%%EMAILADDRESS%%" property="emailaddress" /> 
     <replacefilter token="%%LOGFILE%%" property="logfile" /> 
     <replacefilter token="%%LOGLEVEL%%" property="loglevel" /> 
     <replacefilter token="%%DEFAULTPAGE%%" property="defaultpage" /> 
     <replacefilter token="%%MAILSERVER%%" property="mailserver" /> 
     <replacefilter token="%%SUPPORTEDLANGUAGES%%" property="supportedlanguages" /> 
     <replacefilter token="%%LDAPHOST%%" property="ldaphost" /> 
     <replacefilter token="%%LDAPHOSTBACKUP%%" property="ldaphostbackup" /> 
     <replacefilter token="%%LDAPPORT%%" property="ldapport" /> 
     <replacefilter token="%%LDAPVER%%" property="ldapver" /> 
     <replacefilter token="%%LDAPDC%%" property="ldapdc" /> 
     <replacefilter token="%%LDAPPW%%" property="ldappw" /> 
     <replacefilter token="%%LDAPUSERDC%%" property="ldapuserdc" /> 
     <replacefilter token="%%LDAPSEARCH%%" property="ldapsearch" /> 
     <replacefilter token="%%DATASCHEMA%%" property="dataschema" /> 

    </replace>  

    <copy tofile="tmp/war/WEB-INF/navigation.properties" file="config/${penvironment}.maxnavigation.properties" preservelastmodified="true" > 
    </copy> 

    <copy todir="tmp/war/WEB-INF" preservelastmodified="true" > 
     <fileset dir="config/bundle" includes="**/*.*" /> 
    </copy> 

    <!-- Create war file NOT USED right now as we're building this directly into the tomcat directory--> 
    <!--jar jarfile="tmp/${penvironment}.war" basedir="tmp/war" --> 
</target> 

<target name="buildtomcat" depends="war,inittomcat,validenvironment" if="penvironment">   
    <mkdir dir="tmp/tomcatdeploy/${penvironment}" /> 
    <delete> 
     <fileset dir="tomcat/6.x/logs" includes="**/*.log"/> 
    </delete> 
    <copy todir="tmp/tomcatdeploy/${penvironment}/tomcat" preservelastmodified="true" > 
     <fileset dir="tomcat/6.x" includes="**/*.*" /> 
    </copy> 
    <mkdir dir="tmp/tomcatdeploy/${ppenvironment}/tomcat/logs" /> 
    <mkdir dir="tmp/tomcatdeploy/${penvironment}/tomcat/webapps/${tomcat.contextroot}" /> 
    <copy todir="tmp/tomcatdeploy/${penvironment}/tomcat/webapps/${tomcat.contextroot}" preservelastmodified="true" > 
     <fileset dir="tmp/war" includes="**/*.*" /> 
    </copy> 

    <!-- now copy the tomcat config files --> 
    <copy tofile="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" overwrite="true" file="config/context.xml" preservelastmodified="true" > 
    </copy> 
    <!-- now replace all variables in context.xml --> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" 
     token="%%JDBCNAME%%" value="${context.jdbcname}" /> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" 
     token="%%JDBCUSER%%" value="${context.jdbcuser}" /> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" 
     token="%%JDBCPASSWORD%%" value="${context.jdbcpassword}" /> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" 
     token="%%JDBCDRIVER%%" value="${context.jdbcdriver}" /> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/conf/context.xml" 
     token="%%JDBCURL%%" value="${context.jdbcurl}" /> 
    <!-- now replace all variables/ports in server.xml --> 
    <copy tofile="tmp/tomcatdeploy/${penvironment}/tomcat/conf/server.xml" overwrite="true" file="config/server.xml" preservelastmodified="true" > 
    </copy> 
    <!-- deleted for this example --> 

    <!-- END replace all variables/ports in server.xml --> 
    <!-- Now, replace CONTEXT in catalina.sh and catalina.bat --> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/bin/catalina.sh" 
     propertyFile="/config/${penvironment}.properties"> 
     <replacefilter token="%%CONTEXT%%" property="tomcat.contextroot" /> 
    </replace> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/tomcatdeploy/${penvironment}/tomcat/bin/catalina.bat" 
     propertyFile="/config/${penvironment}.properties"> 
     <replacefilter token="%%CONTEXT%%" property="tomcat.contextroot" /> 
    </replace> 
</target> 

<target name="deployfullapplication" depends="validenvironment,validserver" > 
    <antcall target="deploytomcat" /> 
    <antcall target="deployapacheconfig" /> 
    <antcall target="restartapache" /> 
</target> 

<target name="deploytomcat" depends="buildtomcat" > 

    <!-- zip the tomcatdeploy directoyr up --> 
    <zip destfile="tmp/${penvironment}.zip" basedir="tmp/tomcatdeploy" /> 
    <!-- now scp to the server --> 
    <echo>Copying "tmp/${penvironment}.zip" to "${webuser}@${pserver}:/opt/www"</echo> 
    <scp remoteToDir="${webuser}@${pserver}:/opt/www" file="tmp/${penvironment}.zip" verbose="true" failonerror="true" trust="true"> 
    </scp>  

    <!-- now kill existing process on the server --> 
     <antcall target="stoptomcat" /> 
    <!-- now archive the existing deployed application on the server to ${penvironment}.${currenttimestamp} --> 
     <antcall target="archivetomcat" /> 
    <!-- now uncompress the zipped archive into the deployed location /opt/www/${penvironment} --> 
     <antcall target="unzipremotetomcat" /> 
    <!-- now start the application --> 
     <antcall target="starttomcat" /> 
    <!-- cool. thats it. good job. --> 

    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="restarttomcat" depends="validenvironment,validserver" > 
    <antcall target="stoptomcat"/> 
    <antcall target="starttomcat"/> 
</target> 

<target name="starttomcat" unless="pnostart" if="pserver" depends="validenvironment,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="unzipremotetomcat" if="pserver" depends="validenvironment,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="archivetomcat" if="pserver" depends="validenvironment,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="stoptomcat" unless="pnokill" if="pserver" depends="validenvironment,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="killtomcatprocessonecall" depends="validenvironment,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 


<target name="restartapache" depends="validenvironment,validserver" > 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="deployapacheconfig" depends="configapache,validserver"> 
    <!-- all the remote tasks have been deleted in this example.... just to get the idea of what to do. --> 
</target> 

<target name="configapache" if="penv" depends="init,validenvironment"> 
    <mkdir dir="tmp/apacheconfig" /> 
    <mkdir dir="tmp/apacheconfig/vhosts.d" /> 
    <mkdir dir="tmp/apacheconfig/ssl.crt" /> 
    <mkdir dir="tmp/apacheconfig/ssl.key" /> 
    <mkdir dir="tmp/apacheconfig/extra" /> 
    <mkdir dir="tmp/apacheconfig/passwords" /> 

    <echo>Copying http base config files...</echo> 
    <copy tofile="tmp/apacheconfig/vhosts.d/${penvironment}.conf" file="config/apache/vhosts/http.conf" preservelastmodified="true" /> 

    <echo>http only replace in http config file...</echo> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/apacheconfig/vhosts.d/${penvironment}.conf" 
     propertyFile="config/${penvironment}.properties"> 
     <replacefilter token="%%SERVERADMIN%%" property="httpd.serveradmin" /> 
     <replacefilter token="%%LOGFILE%%" property="httpd.logfile" /> 
     <replacefilter token="%%HOSTNAME%%" property="httpd.hostname" /> 
     <replacefilter token="%%ROOT%%"  property="httpd.root" /> 
     <replacefilter token="%%HOSTIP%%" value="*" /> 
     <replacefilter token="%%PORT%%"  value="80" /> 
     <replacefilter token="%%PROTOCOL%%" value="http" /> 
     <replacefilter token="%%SSL%%"  value="off" /> 
     <replacefilter token="%%SSLCERT%%" value="" /> 
     <replacefilter token="%%SSLKEY%%" value="" /> 
     <replacefilter token="%%SSLCACERT%%" value="" /> 
     <replacefilter token="%%CONTEXTROOT%%" property="tomcat.contextroot" /> 
     <replacefilter token="%%AJPPORT%%" property="port.ajp13" /> 
     <replacefilter token="%%DEFAULTPAGE%%" property="http.defaultpage" /> 
     <replacefilter token="%%ERRORPAGE%%" property="http.errorpage" /> 
    </replace> 
    <condition property="dossl"> 
     <and> 
      <isset property="${penvironment}.ssl.ip" /> 
     </and> 
    </condition> 

    <antcall target="apachessl" /> 

</target> 

<target name="apachessl" if="dossl"> 

    <copy tofile="tmp/apacheconfig/vhosts.d/${penvironment}.s.conf" file="apache/vhosts/http.conf" preservelastmodified="true" /> 

    <echo>https only replace in https config file...</echo> 
    <replace 
     encoding="ISO-8859-1" 
     file="tmp/apacheconfig/vhosts.d/${penvironment}.s.conf" 
     propertyFile="config/${penvironment}.properties"> 
     <replacefilter token="%%SERVERADMIN%%" property="httpd.serveradmin" /> 
     <replacefilter token="%%LOGFILE%%" property="httpd.logfile" /> 
     <replacefilter token="%%HOSTNAME%%" property="httpd.hostname" /> 
     <replacefilter token="%%ROOT%%"  property="httpd.root" /> 
     <replacefilter token="%%PORT%%"  value="443" /> 
     <replacefilter token="%%PROTOCOL%%" value="https" /> 
     <replacefilter token="%%SSL%%"  property="httpd.ssl" /> 
     <replacefilter token="%%SSLCERT%%" property="https.sslcert" /> 
     <replacefilter token="%%SSLKEY%%" property="https.sslkey" /> 
     <replacefilter token="%%SSLCACERT%%" property="https.sslcacert" /> 
     <replacefilter token="%%CONTEXTROOT%%" property="tomcat.contextroot" /> 
     <replacefilter token="%%AJPPORT%%" property="port.ajp13" /> 
     <replacefilter token="%%JKWORKER%%" property="tomcat.jkworker" /> 
     <replacefilter token="%%DEFAULTPAGE%%" property="http.defaultpage" /> 
     <replacefilter token="%%ERRORPAGE%%" property="http.errorpage" /> 
    </replace> 
    <copy tofile="tmp/apacheconfig/ssl.crt/${penvironment}.cert" file="config/apache/ssl.crt/${penvironment}.cert" failonerror="false" preservelastmodified="true" /> 
    <copy tofile="tmp/apacheconfig/ssl.crt/verisign.intermediate.cert" file="config/apache/ssl.crt/verisign.intermediate.cert" failonerror="false" preservelastmodified="true" /> 
    <copy tofile="tmp/apacheconfig/ssl.crt/network.solutions.ca.cert" file="config/apache/ssl.crt/network.solutions.ca.cert" failonerror="false" preservelastmodified="true" /> 
    <copy tofile="tmp/apacheconfig/ssl.key/${penvironment}.key" file="config/apache/ssl.key/${penvironment}.key" failonerror="false" preservelastmodified="true" /> 
</target> 

+0

您可以發佈該螞蟻腳本,以便我可以看到該過程。感謝您發佈的答案。只是想知道svn如何發揮這一點,雖然。 – kbrin80 2010-02-25 17:09:42

+0

當然......我會將其添加到答案中。我將不得不大量編輯一個現有的我用來適應的地方。它可能無法編輯,但會向您顯示一般想法。 – SuperMagic 2010-02-25 17:24:45

1

一個簡單的解決方案是創建可以構建源,JSP和包裝都成,然後可以部署到應用服務器.war文件的Ant構建文件。

如果您想使用僅限Eclipse的解決方案,請查看使用「Dynamic Web Project」項目模板創建項目。這應該允許Eclipse將您的項目打包爲.war文件,然後您可以部署它。我相信Eclipse還允許你配置一個應用服務器,然後它可以用它來部署你的項目(我個人從未嘗試過)。

如果我不得不選擇,我會選擇一個Ant構建文件,因爲如果您決定轉向連續/自動構建,那麼未來的工作就會少一些。