O objetivo desse artigo é mostrar um exemplo de geração de uma release da sua aplicação Java utilizando um subversion client juntamente com o plugin maven:release.
É necessário que o leitor já tenha instalado na máquina Maven 2 (http://maven.apache.org/download.html) e um subversion client (http://downloads.open.collab.net/collabnet-subversion.html).
É necessário que o leitor também já tenha experiência com a configuração do maven 2 (settings.xml, pom.xml, etc.).
Com esse plugin é possível evitar uma série de tarefas repetitivas e “braçais” na hora de se gerar uma nova versão da sua aplicação. Esse processo se divide em 2 etapas, basicamente: prepare e perform.
Para obter mais informações sobre esse plugin visite http://maven.apache.org/plugins/maven-release-plugin/index.html.
Prepare
Preparar a release consiste em realizar os seguintes passos:
Verificar se não há alterações a versionar.
Garantir que não há dependências com outros componentes na versão SNAPHOST.
Mudar a versão dos componentes no arquivo pom.xml
Utilizar a tag scm do arquivo pom para incluir a tag da versão a ser gerada.
Executar os testes unitários do projeto após a alteração do pom.xml.
Versionar os poms modificados.
Aplicar a tag da versão aos artefatos de implementação.
Para executar essa série de tarefas basta apenas executar o comando
mvn release:prepare
Caso algum erro ocorra e a goal prepare for executada novamente, ele continua a partir do ponto aonde o erro aconteceu. Caso queira executar novamente, desde o início, execute o comando
mvn release:prepare –Dresume=false ou
mvn relase:clean release:prepare
Porém se no ponto aonde ocorreu o erro algum arquivo de implementação já tiver sido alterado é necessário fazer um rollback das mudanças. Faça isso utilizando o comando
mvn release:rollback
Perform
Gerar a nova release consiste dos seguintes passos:
Fazer checkout dos componentes com uma tag específica.
Executar deploy e site-deploy.
Exemplo
Abaixo segue um exemplo do arquivo pom.xml de configuração de um componente.
<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>br.edu.ucb.rotagro</groupId>
<version>1.1-SNAPSHOT</version>
<artifactId>rotagro</artifactId>
<name>rotagro</name>
<packaging>pom</packaging>
<modules>
<module>rotagro-pojo</module>
<module>rotagro-web</module>
</modules>
<scm>
<connection>scm:svn:https://rotagro.dev.java.net/svn/rotagro/</connection>
<developerConnection>scm:svn:https://username:password@rotagro.dev.java.net/svn/
rotagro/</developerConnection>
<url>https://rotagro.dev.java.net/svn/rotagro/</url>
</scm>
<build>
<finalName>rotagro</finalName>
<plugins>
<plugin>
<artifactId>maven-release-plugin</artifactId>
<configuration>
<tagBase>
https://usuario:password@rotagro.dev.java.net/svn/rotagro/tags
</tagBase>
</configuration>
</plugin>
</plugins>
</build>
<distributionManagement>
<repository>
<id>rotagro-repository</id>
<name>Repository Name</name>
<url>
https://rotagro.dev.java.net/svn/rotagro/builds
</url>
</repository>
<site>
<id>rotagro-website</id>
<url> https://rotagro.dev.java.net/svn/rotagro/site</url>
</site>
</distributionManagement>
</project>
Todos os comandos devem ser executados no diretório do arquivo pom.xml que contém a configuração acima.
Ao executar o comando mvn release:prepare será perguntado qual a versão da release do seu componente. Se estiver na versão 1.1 SNAPSHOT será sugerido pelo plugin que o nome da release seja 1.1.
Após confirmar o nome da versão do projeto e de seus modules será perguntado qual o nome da tag que deverá ser criada no svn na url especificada em tagbase. Se o nome da sua release é 1.1, é sugerido o nome da tag como o nome do projeto – nome da versão.
Após confirmar todos os dados da sua release é hora de preparar o novo ambiente para desenvolvimento. Para isso o release:prepare pergunta qual o nome da nova versão de desenvolvimento do seu projeto e do seus modules. Se a versão anterior era a 1.1 SNAPSHOT é sugerido criar a 1.2 SNAPHOST.
Após setar todas as configurações os novos pom.xml são gerados, os testes unitários serão executados (caso houverem), o componente é gerado e seu novo pom.xml é versionado e os artefatos da release também serão versionados com a tag especificada.
Nesse momento é gerado um arquivo release.properties que será utilizado pelo goal release:perform. Esse arquivo é utilizado, também, caso se queira fazer o rollback.
#release configuration
#Mon Jun 25 11:28:48 BRT 2007
scm.commentPrefix=[maven-release-plugin]
project.rel.br.edu.ucb.rotagro\:rotagro=1.1
project.scm.br.edu.ucb.rotagro\:rotagro-web.empty=true
scm.tag=rotagro-1.1
scm.tagBase=https\://username\:password@rotagro.dev.java.net/svn/rotagro/tags
project.dev.br.edu.ucb.rotagro\:rotagro-pojo=1.2-SNAPSHOT
project.scm.br.edu.ucb.rotagro\:rotagro.tag=HEAD
scm.url=scm\:svn\:https\://username\:password@rotagro.dev.java.net/svn/rotagro/
project.rel.br.edu.ucb.rotagro\:rotagro-pojo=1.1
preparationGoals=clean integration-test
project.scm.br.edu.ucb.rotagro\:rotagro.url=https\://rotagro.dev.java.net/svn/rotagro/
project.dev.br.edu.ucb.rotagro\:rotagro=1.2-SNAPSHOT
project.scm.br.edu.ucb.rotagro\:rotagro.connection=scm\:svn\:https\://rotagro.dev.java.net/
svn/rotagro/
project.scm.br.edu.ucb.rotagro\:rotagro.developerConnection=scm\:svn\:https\://username
\:password@rotagro.dev.java.net/svn/rotagro/
project.dev.br.edu.ucb.rotagro\:rotagro-web=1.2-SNAPSHOT
project.rel.br.edu.ucb.rotagro\:rotagro-web=1.1
completedPhase=run-preparation-goals
project.scm.br.edu.ucb.rotagro\:rotagro-pojo.empty=true
Agora que já preparamos a release é hora de gerá-la. Executando o mvn release:perform, será feito o checkout do projeto com a tag 1.1 no diretório checkout na raiz do seu projeto.
Após isso o projeto será gerado e o deploy será feito no diretório especificado em distributionManagement, no arquivo pom.xml.
Conclusão
Gerar a release de um software é difícil e sujeito a falhas, pois geralmente, é cheio de passos manuais que devem ser seguidos, e em uma ordem definida.
Com o maven:release é possível automatizar esse processo tornando as builds consistentes e facilitando o controle de configuração e mudança do seu software.
Referências
Maven Release Plugin - http://maven.apache.org/plugins/maven-release-plugin/index.html
Maven Continuum – http://maven.apache.org/continuum/
SubVersion – http://subversion.tigris.org/
Maven Release Process – http://docs.codehaus.org/display/MAVEN/Maven+Release+Process