Введение

В данной статье я хочу показать как автоматизировать процесс деплоймента web-приложения (WAR архива) на сервер приложений Oracle WebLogic 10.3.x используя Ant.

WebLogic поставляет для этой задачи несколько Ant-тасков, которые мы будем использовать, поэтому нам понадобится либо установленный WebLogic, либо можно из существующей инсталляции вытащить необходимые библиотеки. О том как это сделать я напишу в отдельной статье.

Приступим

Типичный процесс деплоймента выглядит следующим образом:

  1. Проверить установлено ли приложение на сервере
  2. Если приложение установлено, то его необходимо удалить
  3. Установить новое приложение

WebLogic имеет в наличии Ant-задачу wldeploy, которая позволяет выподнять следующие действия (http://docs.oracle.com/cd/E14571_01/web.1111/e13706/wldeploy.htm):

  • deploy
  • undeploy
  • redeploy
  • listapps
  • start
  • stop

На первый взгляд может показаться, что redeploy – все, что нам нужно, но это решение не работает в том случае, если установка приложения на сервер иногда делается вручную через административную консоль. В этом случае сервер возвращает ошибку, что приложение устанавливается из другого пути, нежели установленное в данный момент на сервере.

Поэтому я рекомендую использовать последовательное вызовы действий undeploy и deploy как показано ниже:

<?xml version="1.0" encoding="UTF-8"?>
<project name="WebLogic Deploy" basedir="." default="deploy">
	<property name="weblogic.application.name" value="MyApplication"/>
	<property name="weblogic.application.archive" value="Application.war"/>
	<property name="weblogic.home" value=""/>
	<property name="weblogic.domain" value="domain"/>
	<property name="weblogic.adminurl" value="t3s://adminurl:7777"/>
	<property name="weblogic.targets" value="target"/>

	<taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
		<classpath>
			<fileset dir="${weblogic.home}" includes="server/lib/weblogic.jar"/>
		</classpath>
	</taskdef>

	<target name="undeploy">
		<wldeploy name="LEO" action="undeploy" adminurl="${weblogic.adminurl}" userconfigfile="weblogic.id" userkeyfile="weblogic.key" targets="${weblogic.targets}"/>
	</target>

	<target name="deploy" depends="undeploy">
		<wldeploy name="${weblogic.application.name}" source="${weblogic.application.name}" action="deploy" remote="true" upload="true" adminurl="${weblogic.adminurl}" userconfigfile="weblogic.id" userkeyfile="weblogic.key" targets="${weblogic.targets}"/>
	</target>
</project>

Пройдемся по параметрам:

  • action – выполняемая команда (deploy, undeploy, start, stop и т.д.)
  • name – имя приложения, которое мы установливаем/удаляем
  • adminurl – URL-административной консоли, только в качестве протокола указываем не http://, а t3 (или t3s:// если у вас используется https://)
  • user – имя пользователя, под которым будем устанавливать/удалять приложения
  • password – пароль пользователя
  • targets – список названий серверов (нод), кластеров, на которые устанавливаем приложение. Название  можно посмотреть в административной консоли (Environment => Servers, колонка Name или Cluster)
  • source – путь к архиву устанавливаемого приложения
  • upload – это флаг говорит о том, что архив приложения source необходимо загрузить на сервер, в противном случае архив нужно загружать на сервер другими способами, например SCP
  • remote – это флаг говорит о том, что сервер приложений установлен на другом физическом сервере

Проверка наличия установленного приложения

Приведенный выше сценарий подходит только для ситуации, когда на сервере уже имеется установленное приложение, причем установленное при помощи wldeploy, а не вручную, через административную консоль, иначе WebLogic откажется устанавливать приложение. А что же делать в случае первоначальной установки приложения?

Чтобы скрипт установки работал независимо он наличия установленного приложения у него необходимо довавить проверку. Тогда последовательность действий будет выглядеть следующим образом:

  • проверить установлено приложение на сервере
  • если приложение установлено, тогда удаляем предыдущую версию
  • установливаем новую версию приложения

Сказано-сделано! Для проверки мы будем использовать Ant-задачу wlconfig, при помощи которой можно конфигурировать сервер (например, создавать источники данных) и выполнять различные административные действия, в том числе и получить список установленных приложений.

Ниже представлен модифицированный Ant-скрипт:

<?xml version="1.0" encoding="UTF-8"?>
<project name="WebLogic Deploy" basedir="." default="deploy">
	<property name="weblogic.application.name" value="MyApplication"/>
	<property name="weblogic.application.archive" value="Application.war"/>
	<property name="weblogic.home" value=""/>
	<property name="weblogic.domain" value="domain"/>
	<property name="weblogic.adminurl" value="t3s://adminurl:7777"/>
	<property name="weblogic.targets" value="target"/>

	<taskdef name="wlconfig" classname="weblogic.ant.taskdefs.management.WLConfig">
		<classpath>
			<fileset dir="${weblogic.home}" includes="server/lib/weblogic.jar"/>
		</classpath>
	</taskdef>

	<taskdef name="wldeploy" classname="weblogic.ant.taskdefs.management.WLDeploy">
		<classpath>
			<fileset dir="${weblogic.home}" includes="server/lib/weblogic.jar"/>
		</classpath>
	</taskdef>

	<target name="check">
		<echo>Checking if application is already deployed</echo>
		<wlconfig url="${weblogic.adminurl}" userconfigfile="weblogic.id" userkeyfile="weblogic.key">
			<query pattern="bwag:Name=MyApplication,Type=Application" property="weblogic.application.installed"/>
		</wlconfig>
		<echo message="${weblogic.application.installed}"/>
	</target>

	<target name="undeploy" depends="check" if="weblogic.application.installed">
		<wldeploy name="LEO" action="undeploy" adminurl="${weblogic.adminurl}" userconfigfile="weblogic.id" userkeyfile="weblogic.key" targets="${weblogic.targets}"/>
	</target>

	<target name="deploy" depends="undeploy">
		<wldeploy name="${weblogic.application.name}" source="${weblogic.application.name}" action="deploy" remote="true" upload="true" adminurl="${weblogic.adminurl}" userconfigfile="weblogic.id" userkeyfile="weblogic.key" targets="${weblogic.targets}"/>
	</target>
</project>

Для проверки наличия установленного приложения при помощи wlconfig выполняется следующий запрос:

bwag:Name=MyApplication,Type=Application

Если приложение установлено, по будет установлено свойство weblogic.application.installed, при помощи которого мы определяем нужно запускать задачу undeploy или нет (см. свойство if задачи undeploy в приведенном выше примере).

Аналогичным образом можно получить список всех установленных приложений, достаточно вместо имени приложения подставить маску:

bwag:Name=*,Type=Application