Concrete Logo
Hamburger button

Como fazer Integração Contínua no Android – parte 6 (final)

  • Blog
  • 23 de Junho de 2014
Share

Chegamos ao tão aguardado momento. Juntar tudo o que fizemos em um servidor de integração contínua. Se fizemos tudo correto até agora, essa será a parte mais fácil.

Apenas para lembrar aqueles que chegaram agora, dêem uma revisada em:

  • Parte 1: Apresentação e um pouco do histórico dos sistemas de build e IC no Android
  • Parte 2: Configuração das dependências e do ambiente
  • Parte 3: Criação do projeto inicial e mavenização
  • Parte 4: Criação do projeto de teste
  • Parte 5: Cobertura de testes

Bom, vamos lançar mão do nosso mordomo então, Jenkins. Este projeto é um dos mais utilizados servidores de integração contínua para as mais diversas plataformas (apesar de ter um foco em Java). Criado pelo Kohsuke Kawaguchi (que ainda mantém o projeto como o mais ativo commiter) esse servidor já vem por default com suporte a Maven. Daí nossa predileção 😀

Existem várias formas de instalar o Jenkins dependendo do seu sistema operacional.

Após uma instalação limpa, você poderá acessar a interface do Jenkins pelo browser. Se fizer uma instalação local, provavelmente o endereço será https://localhost:8080/.

O que vamos configurar no Jenkins serão os “jobs”. Criaremos um job para ilustrar um build com relatório de cobertura e como esse relatório é visualizado no Jenkins. Mas antes, precisamos baixar alguns plugins importantes!

Alguém com muita dedicação nessa vida criou um plugin para o Jenkins que facilitará muito a nossa vida. Apresento-lhes o Android Emulator Plugin. Para instalá-lo, basta ir na área de gerenciamento do Jenkins -> Gerenciar plugins e procurar por “Android Emulator Plugin”.

Android Emulator Plugin para o Jenkins

Existem vários plugins para facilitar nossas tarefas. Por exemplo, GIT Plugin, Chuck Norris Plugin (sensacional…) e etc. O mais comum é utilizar algum plugin de controle de versão. Assim, qualquer alteração no código pode disparar um “job”, garantindo a parte “contínua” de “integração contínua”.

Após reiniciar a máquina, vamos configurar o plugin de emulador. Novamente em Administrar Jenkins -> Configurar sistema. O plugin pode baixar os componentes da SDK do Android sozinho caso você esteja configurando uma máquina nova. Apenas marque a opção “Automatically install Android components when required”.

Quando tiver a SDK do Android configurada no ambiente, crie uma variável para que os builds possam encontrar a SDK. Isso é feito nessa mesma tela em “Environment Variables” (Variáveis de ambiente).

Variáveis globais do Jenkins

Com isso estamos prontos para criar nosso job na maior parte dos sistemas. Porém, encontrei alguns problemas ao configurar Macs. Foi necessário acrescentar uma propriedade global de Maven:

Ajustando o Maven para o Mac

Bom, com isso estamos prontos. Vamos à criação do job.

Na página inicial do Jenkins, selecione “New Item” (novo item). Vamos nomeá-lo como “ANDROID_COVERAGE_REPORT”. Selecione a opção “Build a maven2/3 project” (construa um projeto Maven 2/3).

A configuração de buscar o projeto de um repositório de código está fora do escopo desse post, mas não tem segredos. Dado que o servidor esteja configurado com permissão de leitura ao repositório, as opções são bem diretas: url do repositório, branch para qual apontar e etc.

Nosso ambiente de execução precisará de um emulador rodando para poder executar os testes. Para isso vamos configurar um pelo Android Emulator Plugin. Na sessão “ambiente do build”, marque a opção “Run an Android emulator during build” (execute um emulador Android durante o build). Com isso algumas opções aparecerão:

Opções do Android Emulator Plugin

Todas estas opções são bem diretas. Deve-se definir a versão do Android, a densidade e a resolução da tela entre outras opções não obrigatórias. Todas elas possuem um descritivo com exemplo ao clicar no ícone “?”.

Com isso, teremos um emulador executando durante nosso build. Precisamos definir como fazer o build agora. Isso fica na sessão, pasmem, “build”. Lá definiremos o nosso pom da raiz (pom.xml) e definiremos nossos goals como:

[code language=”shell”]
clean install android:deploy android:run -P emma
[/code]

Agora é só executar! O job já deve aparecer na tela inicial do Jenkins.

Ao executá-lo, você será levado para o log do build. Essa parte é MUITO importante! Por ela poderemos ver qual o estado do nosso emulador. Veja um exemplo:

Console log Jenkins build

O emulador foi criado e inicializado em 33 segundos. Uma boa forma para debuggar a inicialização do emulador é conectar ao mesmo adb que o processo está utilizando. Reparem na linha:

“* daemon not running. Starting it now on port 5655*” (daemon não está executando. Iniciando na porta 5655).

Essa porta é a porta do adb. Assim, podemos conectar ao mesmo executando:

[code language=”shell”]
adb -P 5655 devices
[/code]

Ao fazer isso, veremos a lista de devices que esse adb está enxergando. Durante o build o emulador deve aparecer com o status “online”. Caso isso não ocorra, verifique suas configurações para inicializar o emulador. Comece com um emulador que não consuma tanta memória (telas menores, com densidades menores) e versões do Android na arquitetura x86. Depois vá experimentando com outras opções!

Ao término do build, precisamos adicionar a geração do relatório de cobertura! Faremos isso com um “post-build step”. Podemos fazer isso com um shell step chamando o maven ou mesmo com um “invoke top-level Maven targets”.

Com shell teremos a seguinte implementação:

[code language=”shell”]
#!/bin/bash

cd $WORKSPACE

mvn org.sonatype.maven.plugin:emma4it-maven-plugin:1.3:report -pl NOME_DO_PROJETO_MAIN
[/code]

Isso irá gerar o html do relatório como vimos no passo 5 dessa série.

Bom, é isso! Temos um servidor de integração contínua executando builds de Android com cobertura de testes! Com essa base é possível ampliar para jobs do tipo Matriz que executam uma matriz de configurações. Nela poderíamos colocar várias versões do Android ou tamanhos de tela. Assim teríamos todo o fluxo de desenvolvimento coberto de testes em vários ambientes!

Dúvidas deixem nos comentários 😀

Happy Android coding!