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.

 

gnmaven2rfig01.jpg 

 

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