Child pages
  • Uso do Ant no Logistic
Skip to end of metadata
Go to start of metadata

Visão geral do Ant

O Ant (http://ant.apache.org/) é usado nos sistemas Logistic para a automação de tarefas repetitivas envolvendo muitos passos, como a geração de pacotes para entrega e execução de testes automatizados.

O Ant é um aplicativo java que pode ser parametrizado com arquivos XML (o nome comum é "build.xml") e pode ser estendido acrescentando-se novos plugins (chamados tasks) também escritos em Java.

Uma vez configuradas as tarefas a serem executadas no arquivo XML, para executá-las basta invocar "ant <nome da tarefa>" no diretório onde se encontra o arquivo XML. Por exemplo, nos sistemas Logistic, para gerar um novo patch, o comando a ser executado é "ant patch".

O formato básico para um arquivo "build.xml" é:

 

<?xml version="1.0" encoding="ISO-8859-1"?>
<project name="bandeirabr">
<property name="xxx.dir" value="xxx"/>
    ....
	<target name="yyy">
		<task1/>
		<task2>
		....
		</task2>
	</target>
	....
</project>

As propriedades (property) são variáveis usadas ao longo do script de configuração, podendo representar diretórios, textos, valores booleanos ou mesmo variáveis de ambiente. Uma vez definidas, elas são referenciadas por ${<nome da propriedade>}, logo se uma propriedade for definida com o nome "bd_script" e o valor "atualiza_objetos_oracle.txt", ela poderá ser referenciada por "${bd_script}".

Os alvos (target) são as tarefas propriamente ditas a serem executadas. Exemplos de nomes de targets usadas no Logistic são: compile, clean, patch, update, exectest.

As tasks são os comandos disponíveis no Ant para executar os passos de cada tarefa. O Ant já disponibiliza uma série de tasks prontas (ver http://ant.apache.org/manual/tasklist.html), como "javac" (para compilar arquivos java), "copy" (para copiar arquivos ou diretórios), "junit" (para executar testes unitários), etc. Como já mencionado anteriormente, é possível criar novas tasks personalizadas. Consulte a documentação do Ant para isso.

Cada target pode depender de outras targets, isto é, ela pode depender que outras targets sejam executadas ANTES dela. Essa dependência é definida pelo atributo "depends", como no exemplo a seguir:

<target name="install" depends="dist,sign,prepare.install">

No exemplo acima, a target "install" só será executada APÓS as targets "dist", "sign" e "prepare.install" terem sido executadas.

Reuso de targets no Logistic

Como os sistemas Logistic possuem muitas tarefas em comum, foi criada uma forma de reaproveitamento do código das targets, para promover o reuso. Isso foi feito pela extração de todas as targets comuns em um novo arquivo "common_build.xml", o qual reside na raiz do Logistic e é importado em cada "build.xml" dos sistemas (inclusive do próprio framework Logistic) pela seguinte linha:

<import file="${logistic.dir}/common_build.xml"/>

O arquivo "common_build.xml" passou a concentrar então todos os passos das tarefas comuns aos sistemas, e tudo aquilo que era diferente, específico de cada projeto, permaneceu no "build.xml" do sistema, simplesmente parametrizando as targets do common_build.xml, com targets de mesmo nome e prefixo "prepare" nos arquivos "build.xml" de cada sistema. Isto é feito da seguinte forma, tomando como exemplo a target "compile": 

  • No "common_build.xml", a target "compile" possui uma dependência da target "prepare.compile" e uma referência para a variável "compile.classpath":
<target name="compile" depends="(...)prepare.compile">
	<javac (...)>
            <classpath refid="compile.classpath" />
	</javac>
</target>
  • Essa target é definida no arquivo "build.xml" de cada sistema. Como o classpath pode variar, cada sistema é livre para definir o classpath que deseja compilar:

 

<target name="prepare.compile">
	<path id="compile.classpath">
		...	  
		<fileset dir="${basedir}">
	  		<include name="${lib.dir}/**/*.jar"/>
		  	<include name="${bdtest.lib.dir}/**/*.jar"/>
		  	<include name="${guitest.lib.dir}/**/*.jar"/>
		</fileset>
		...
	</path>  	
  </target>	

Dependência do framework Logistic

Como todo sistema Logistic depende do framework (por exemplo, para compilar o Alope é preciso compilar o Logistic, para rodar os testes automatizados do Bandeira é também necessário rodar os testes do Logistic), essa dependência precisou ser refletida nos procedimentos Ant. O conceito de dependência entre projetos foi implementado da seguinte forma:

  • 1) Cada sistema, no início do seu "build.xml", define uma propriedade chamada "hasDependency" (com exceção do "build.xml" do Logistic, que não possui dependência):
<property name="hasDependency" value="true"/>
  • 2) As targets que precisam ser executadas tanto no Bandeira quanto no Logistic incluem em suas dependências chamadas a targets prefixadas com "depend" (arquivo "common_build.xml"):
<target name="compile" depends="(...)depend.compile">
  • 3) As targets "depend" são definidas no próprio "common_build.xml" e só são invocadas se a propriedade "hasDependency" tiver sido definida (isto é, só serão acionadas para os sistemas e não para o framework): elas invocam uma target especial chamada "depend.all", a qual possui um parâmetro "target" preenchido com a tarefa a ser invocada no framework:
<target name="depend.update" if="hasDependency">
	<ant antfile="${ant.file}" target="depend.all">
    	<property name="target" value="update" />
    </ant>
</target>
  • 4) A "depend.all" é definida no "build.xml" de cada sistema, e atualmente só invoca outra target "depend.logistic" (esta etapa é desnecessária na prática, ela foi criada somente com o propósito de generalização que não foi usado até o momento):
<target name="depend.all"
	depends="depend.logistic">
</target>
  • 5) Já a "depend.logistic" simplesmente invoca a target definida no parâmetro "target" do passo (3), no diretório do framework, isto é, usando o "build.xml" do Logistic. Com esse mecanismo, ao invocar uma tarefa com dependência em algum sistema, será invocada a mesma tarefa no framework ANTES da execução propriamente dita da tarefa no sistema.
<target name="depend.logistic">
	<ant dir="${logistic.dir}" target="${target}">
	...  	  
	</ant>
</target>

 

 

 

 

 

 

 

 

  • No labels