ant에서 tomcat / weblogic 조정하기 by 오리대마왕

웹 개발 프로젝트에서 Continuous Integration의 가장 마지막 단계는 역시 서버 deploy일 것이다. 내가 CI를 구성해본 container는 tomcat과 weblogic 이다. 이 글은 ant에서 이들 container에 deploy 하는 방법에 대해 설명한다. 참고로 이 설정은 CTIP(Continuous Test & Integration Platform) - 빌드환경 구성에 이미 적용되어 있다. 참고로 tomcat 은 6.x, weblogic은 10 을 기반으로 작업했다.

1. tomcat
친절한 tomcat은 ant용 task를 기본 제공한다. tomcat 설치 디렉터리 밑에 /lib/catalina-ant.jar 가 이 녀석이다. 묶어서 하나의 task로 제공하진 않고 별도의 class 하나하나로 제공하기 때문에 ant task를 등록해주기 조금 귀찮다. 일일이 taskdef 를 사용해서 등록하던가, 별도의 property 파일에 task 목록을 주고 이것을 읽어들이게 하면 된다. 전체 build.xml 내용은 다음과 같다. 참고로 undeploy 부분에서 일부러 tomcat 서비스를 내렸다 올렸다. 자꾸 undeploy 과정에서 load된 class들이 메모리를 붙잡고 늘어지는 경우가 생겼기 때문이다. net start/stop 명령어는 windows용이다.


<!-- 기본 property 정의. 물론 별도의 property 파일에 기술하고, file 통째로 읽어들일 수도 있다.  -->
<property name="tomcat.home" value="E:/tomcat_home_dir"/>
<property name="tomcat.deploy.jar.path" value="${tomcat.home}/lib/catalina-ant.jar"/>
<property name="tomcat.deploy.url" value="http://tomcat_server:8080/manager"/>
<property name="tomcat.deploy.path" value="/context_root_name" />
<property name="tomcat.deploy.username" value="admin_user"/>
<property name="tomcat.deploy.password" value="admin_passwd"/>
<property name="tomcat.svc.name" value="tomcatsvc"/>

<!-- task 를 정의한다. 두가지 방법이 있는데, 하나는 별도의 property 파일에 몽창 적어넣는 방법, 다른 하나는 일일이 등록하는 방벙이다. 나는 일일이 등록했다. 몽창 적는 방법은 TomcatAntTasks 를 참고. -->
    <taskdef name="tomcatundeploy" classname="org.apache.catalina.ant.UndeployTask" classpath="${tomcat.deploy.jar.path}"/>
    <taskdef name="tomcatremove" classname="org.apache.catalina.ant.RemoveTask" classpath="${tomcat.deploy.jar.path}"/>
   <taskdef name="tomcatdeploy" classname="org.apache.catalina.ant.DeployTask" classpath="${tomcat.deploy.jar.path}"/>
   <taskdef name="tomcatstart" classname="org.apache.catalina.ant.StartTask" classpath="${tomcat.deploy.jar.path}"/>

<!-- deploy WAR -->
    <target name="tomcat_deploy">
       <tomcatdeploy url="${tomcat.deploy.url}" username="${tomcat.deploy.username}" password="${tomcat.deploy.password}" path="${tomcat.deploy.path}" war="file:${war.path}" />
       <tomcatstart url="${tomcat.deploy.url}" username="${tomcat.deploy.username}" password="${tomcat.deploy.password}" path="${tomcat.deploy.path}" />
    </target>

<!-- undeploy -->
    <target name="tomcat_undeploy">
       <tomcatundeploy  url="${tomcat.deploy.url}" username="${tomcat.deploy.username}" password="${tomcat.deploy.password}"
              path="${tomcat.deploy.path}" failonerror="false" />
       <tomcatremove  url="${tomcat.deploy.url}" username="${tomcat.deploy.username}" password="${tomcat.deploy.password}"
              path="${tomcat.deploy.path}" failonerror="false" />      
       <!-- restart tomcat to prevent memory leak -->
       <exec executable="net">
        <arg value="stop"/>
        <arg value="${tomcat.svc.name}"/>
       </exec>
       <exec executable="net">
        <arg value="start"/>
        <arg value="${tomcat.svc.name}"/>
       </exec>                    
    </target>

2. weblogic
weblogic도 tomcat 과 마찬가지로 별도의 ant task 를 제공한다. weblogic도 undeploy를 깔끔하게 하기 위해선 서버를 아얘 내렸다 올리는 것이 좋을 것이라 생각한다. 그 부분은 위의 tomcat용 script에서 exec 부분을 그대로 따서 쓰면 됨. 참고로 나는 remote 서버가 아닌 local 서버에 exploded 된, 즉 war 형태가 아닌 풀어헤쳐진 형태로 deploy 했다. 만약 remote 서버 혹은 war 형태로 deploy 할 경우, wldeploy Ant Task Reference를 참고하여 적절히 task의 option을 조정하면 된다. (참고로, 링크한 문서는 10.3 버전이므로 타 버전을 사용할 경우 버전에 맞는 문서를 참고한다. weblogic 문서 홈페이지의 topic 중 deploy ... > ..ant task 로 찾아들어갈 수 있다.)

<!-- 기본 property 정의. 물론 별도의 property 파일에 기술하고, file 통째로 읽어들일 수도 있다.  -->
<property name="weblogic.deploy.jar.path" value="/weblogic_home_path/wlserver_10.0/server/lib/weblogic.jar"/>
<property name="weblogic.deploy.url.admin" value="t3://localhost:7001"/>
<property name="weblogic.deploy.user" value="admin_user"/>
<property name="weblogic.deploy.password" value="admin_passwd"/>
<property name="weblogic.deploy.name" value="app_name"/>

<!-- task 정의. 단순하다. -->
    <taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy" classpath="${weblogic.deploy.jar.path}"/>
    <taskdef name="wlserver" classname="weblogic.ant.taskdefs.management.WLServer" classpath="${weblogic.deploy.jar.path}"/>

<!-- undeploy -->
    <target name="weblogic_undeploy">
        <wldeploy
          action="undeploy" verbose="true" debug="false"
          name="${weblogic.deploy.name}"
          user="${weblogic.deploy.user}" password="${weblogic.deploy.password}"
          adminurl="${weblogic.deploy.url.admin}"
          failonerror="false"  />
    </target>

<!-- deploy -->
    <target name="weblogic_deploy">
 <!-- exploded war 형태에 nostage 형태를 가정하였다. 상황에 따라 옵션을 조정한다. -->
          <wldeploy
          action="deploy"  verbose="true" debug="false"
          name="${weblogic.deploy.name}" source="${weblogic.deploy.dir}"
          user="${weblogic.deploy.user}" password="${weblogic.deploy.password}"
          adminurl="${weblogic.deploy.url.admin}" nostage="true"/>
        <wldeploy
          action="start"  verbose="true" debug="false"
          name="${weblogic.deploy.name}"
          user="${weblogic.deploy.user}" password="${weblogic.deploy.password}"
          adminurl="${weblogic.deploy.url.admin}"/>
    </target>

그럼 오늘도 즐deploy!