0

I am just wondering what the solution is to setting up SVN and having it deploy to an external server with just the JSP and class files. How do you rid the src folder when deploying. What is the proper set up for this. I just want to be able to have multiple users commit work including src files but when they are deployed onto the production server i would like the file structure to exclude the src folder, .project, .classpath, etc files that I don't need.

1
  • 2
    I'm not sure your are asking the right question. SVN is not intended as a deployment solution. You would normally use some kind of build tool to extract your project from SVN, build the application artifacts and deploy them. Commented Feb 25, 2010 at 16:51

2 Answers 2

2

Write a script (I use ant for such java projects) that promotes/copies to your production environment exactly what you want.

In my case, the ant scripts:

  1. Create a tmp directory,
  2. Copies specific files from the source trees into the new file structure (often exactly the same as the source, just not in the source folders, and excluding .svn and other files I wouldn't want (.java files rather than .class files or jars etc)
  3. Compiles and jars what's needed
  4. Does search/replace in configuration files (to allow deployment to staging, dev, qa or production environments which may differ
  5. Zips the whole thing up and copies (scp) to the target server if remote
  6. Stops any existing running applications
  7. unpacks the new version
  8. Starts the new application

I have, on some projects, options to upload just changed files rather than redeploying whole applications, but that's a design choice you'll get to make yourself. For the larger projects I've worked on I've gravitated to deploying the whole project for each update rather than copying individual files/changes to the server. This way I can ensure the integrity of the build process and the production environment and not have to worry about random files possibly being out of sync with the rest of the project.

Generally for anything other than trivially simple project, you'll want a real make/build environment ... which you'll have to write your self.

Ant

Maven

shell scripts

make

all are possible solutions.

<!-- **************** 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>

Sign up to request clarification or add additional context in comments.

2 Comments

Can you post that ant script just so I can see the procedure. Thanks for the posted answer. Just wondering how svn comes into play with this though.
Sure.... I'll add it to the answer. I'll have to heavily edit an existing one I use to fit there. It may not work as edited, but will show you the general idea.
1

An easy solution would be to create an Ant build file that can build the source, JSPs and package everything up into a .war file that can then be deployed into your application server.

If you want to go with an Eclipse only solution, look at creating your project using the "Dynamic Web Project" project template. This should allow Eclipse to package your project as a .war file which you can then deploy. I believe Eclipse also allows you to configure an application server which it can then use to deploy your project (I've personally never tried this).

If I had to choose, I would go with an Ant build file, because it's less future work if you decide to move to continuous / automated builds.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.