Usando Docker para criar os scripts do Gradle Wrapper

Usando Docker para criar os scripts do Gradle Wrapper

Eu sempre gosto de começar um projeto com a versão atual do Gradle para poder conhecer e explorar as novidades. Como boa prática eu também sempre uso o Gradle Wrapper para garantir a portabilidade do build e também porque com ele eu não preciso ter uma versão do Gradle previamente instalada no meu ambiente. O problema que surge é que para gerar o wrapper eu preciso do Gradle! É meio que o cachorro correndo atrás do rabo :-) Pois bem, como resolver esse problema?

A resposta mais simples para isso é: Docker! Isso mesmo, ao invés de instalarmos o Gradle vamos usar a imagem do Gradle para gerar o wrapper.

Caso você não ainda conheça o Docker eu recomendo que dê uma olhadinha nesse vídeo do Jeferson do LinuxTips: Docker Tutorial #1 - Docker, Containers, Images e muito mais! e depois volte aqui!! Nem vai doer, é rapidão!

Agora que já sabemos como usar o Docker, a coisa mais fácil do mundo é gerar o Wrapper! Faça o seguinte, vá para o diretório do seu projeto e execute o comando abaixo. Note que você pode executar esse comando em um diretório vazio inclusive, para começar um projeto do zero mesmo!

docker run -it -v ${PWD}:/app -w /app gradle:jre-alpine gradle wrapper  

Ok, esse comando mágico tem vários detalhes:

  • -v ${PWD}:/app: faz o mapeamento do diretório atual para o diretório /app dentro do container
  • -w /app: define o WORKDIR como sendo /app, o diretório onde os comandos serão executados dentro do container
  • gradle:jre-alpine: esse é a imagem e a tag do Gradle. Comento mais sobre isso abaixo
  • gradle wrapper: é o comando usado para criar o wrapper

Após executar o comando acima, olhe o que foi gerado no diretório corrente:

$ ls -FA
.gradle/     gradle/      gradlew*     gradlew.bat

O diretório .gradle/ é usada para os caches do Gradle, gradle/ contém o Jar do wrapper, gradlew é o script do wrapper para linux e gradlew.bat é o equivalente para Windows. Mamão com açúcar hein! Faça um teste simples executando o comando abaixo:

$ ./gradlew -version
------------------------------------------------------------
Gradle 3.5  
------------------------------------------------------------

Build time:   2017-04-10 13:37:25 UTC  
Revision:     b762622a185d59ce0cfc9cbc6ab5dd22469e18a6

Groovy:       2.4.10  
Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015  
JVM:          1.8.0_121 (Oracle Corporation 25.121-b13)  
OS:           Mac OS X 10.12.4 x86_64  

Ótimo, tudo funcionando!

Quando o comando gradle wrapper é executado, a versão do Gradle disponível na imagem é usada para o wrapper. Caso precisa usar uma versão específica do Gradle você poderá utilizar o parâmetro gradle-version para defini-la:

docker run -it -v ${PWD}:/app -w /app gradle:jre-alpine gradle wrapper --gradle-version 3.3  

Por fim, note que o wrapper foi criado usando a imagem de tag jre-alpine. Essa imagem em específico sempre conterá a última versão do Gradle, a última versão do Java (somente JRE no caso) para a qual o Gradle possui versão de produção disponível. Além disso, ela também usa o Alpine Linux, uma versão enxuta de Linux cuja imagem possui ridículos 4MB...na verdade é menos que isso! Como essa imagem é menor do que as outras imagens que não usam o Alpine o seu download será muito mais rápido. Só por questão de curiosidade, compare o tamanhos da imagem que usamos e outra similar que não usa o Alpine:

REPOSITORY:TAG             IMAGE ID             SIZE  
gradle:jre-alpine          db7bbda38d8e         168MB  
gradle:jre                 eae2d7891952         394MB  

É isso aí!! Abraços e bons builds.

Subscribe to