Gastaldi's Blog

Mais um blog sobre Java …

Criando uma solução para atualização de aplicações remotas

Imagine o seguinte: Você desenvolve uma aplicação (web ou não) e ela roda em um ambiente remoto (o ambiente de produção do seu cliente, seja em um servidor de aplicação JBoss ou Tomcat instalado no ambiente remoto) e você precisa garantir que a cada nova release da sua aplicação, o cliente tenha sempre a última versão. Neste post pretendo mostrar como você pode fazê-lo utilizando o Apache Maven e o Apache Ant para gerenciamento das versões do seu projeto e automatização de tarefas.

Não pretendo demonstrar uma solução completa, mas apresentar uma prova de conceito que pode ser melhorado. Para quem não conhece o Maven ou o Ant, sugiro ler as respectivas documentações. Para que funcione, você já deve ter um repositório remoto Maven configurado (sugiro o Sonatype Nexus) e (obviamente) a sua aplicação já deve estar “mavenizada”.

Você pode instalar o Apache Ant na sua maquina que vai rodar o script e adicionar o JAR do Maven Tasks for Ant no lib ou então seguir os passos abaixo para criar uma distribuição do Ant já com as bibliotecas necessárias. Se você não gosta de Maven, então sugiro passar pro passo 3 (onde está o início do script)

1) Queremos que esta solução seja instalável pelo cliente, logo deve ser ao menos distribuída em um arquivo ZIP que pode ser descompactado. Começamos a criar um projeto Maven e logo teremos o seguinte pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.george.app</groupId>
	<artifactId>george-atualizador</artifactId>
	<version>1.0.0-SNAPSHOT</version>
	<name>George :: Atualizador</name>
	<packaging>pom</packaging>
	<dependencies>
		<dependency>
			<groupId>org.apache.ant</groupId>
			<artifactId>ant</artifactId>
			<version>1.8.1</version>
		</dependency>
		<dependency>
			<groupId>org.apache.maven</groupId>
			<artifactId>maven-ant-tasks</artifactId>
			<version>2.1.1</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-assembly-plugin</artifactId>
				<version>2.2</version>
				<executions>
					<execution>
						<id>gera-zip</id>
						<phase>package</phase>
						<goals>
							<goal>single</goal>
						</goals>
						<inherited>false</inherited>
						<configuration>
							<descriptors>
								<descriptor>src/main/assembly/instalador.xml</descriptor>
							</descriptors>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

Este pom.xml é a base do nosso projeto. Ele tem como dependência o Apache Ant e uma extensão que permite invocar tarefas do Maven dentro de um script Ant.

2) Note que é usado também um plugin (assembly) para montagem do ZIP. Ele tem a seguinte estrutura:

<assembly
	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
	<id>instalador</id>
	<formats>
		<format>zip</format>
	</formats>
	<fileSets>
		<fileSet>
			<directory>src/main/assembly/bin</directory>
			<outputDirectory>bin</outputDirectory>
		</fileSet>
		<fileSet>
			<directory>src/main/assembly/conf</directory>
			<outputDirectory>conf</outputDirectory>
		</fileSet>
		<fileSet>
			<directory>src/main/assembly</directory>
			<includes>
				<include>build.xml</include>
			</includes>
			<outputDirectory>/</outputDirectory>
		</fileSet>
	</fileSets>
	<dependencySets>
		<dependencySet>
			<outputDirectory>lib</outputDirectory>
			<useProjectArtifact>false</useProjectArtifact>
			<outputFileNameMapping>${artifact.artifactId}.${artifact.extension}
			</outputFileNameMapping>
		</dependencySet>
	</dependencySets>
</assembly>

3) Agora você só precisa do arquivo build.xml (o mais importante – que vai conter as ações de atualização da aplicação) e os executáveis (Arquivos BAT) do Apache Ant (para invocá-lo quando necessário).


<?xml version="1.0" encoding="UTF-8"?>
<project name="project" default="default" xmlns:artifact="antlib:org.apache.maven.artifact.ant">
	<!-- ================================= 
          target: default              
         ================================= -->
	<target name="default" depends="resolver-dependencias" description="description">
		<copy todir="temp">
			<fileset refid="dependency.fileset" />
			<mapper classname="org.apache.maven.artifact.ant.VersionMapper" from="${dependency.versions}" to="flatten" />
		</copy>
	</target>

	<target name="resolver-dependencias">
		<artifact:dependencies filesetId="dependency.fileset" versionsId="dependency.versions" settingsFile="conf/settings.xml">
			<dependency groupId="com.george.app" artifactId="minha-app-maven" version="[1.0.0,2.0.0)" />
		</artifact:dependencies>
	</target>
</project>

Este script vai conectar no seu repositório remoto (está especificado no seu arquivo conf/settings.xml – veja como criar um aqui), baixar a última versão disponível que esteja entre a versão 1.0.0 e menor que a 2.0.0 (mais informações sobre o versionamento maven aqui) e gravar em uma pasta temp sem a informação de versão (que é o padrão do Maven).

A partir daí, você pode incrementar o seu script para copiar o WAR para o seu Tomcat ou JBoss e até mesmo agendá-lo (usando cron ou o agendador do windows mesmo, ou porque não o Hudson) para executá-lo toda noite, enfim, as possibilidades são muitas.

Enfim, este post teve a intenção de mostrar que o Apache Maven não é só mais uma ferramenta de builld, mas que usado em conjunto com o Apache Ant, chega a agradar gregos e troianos ! :)

About these ads

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: