Récemment, j’ai voulu créer une box Vagrant contenant un environnement de développement Java prêt à l’usage. Sur GNU/Linux, il existe deux possibilités pour le JDK :

Souhaitant rester au plus proche de la version de production, j’ai décidé d’installer la version d’Oracle. Cette version n’est pas disponible sur les dépôts officiels d’Ubuntu. Il faut passer par les dépôts PPA.

Création de la VM

Déclaration

La déclaration de la box est assez simple avec le fichier VagrantFile :

Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/trusty32"
  config.vm.provision :shell, :path => "scripts/provision_java.sh"
end

Provisionning

Comme je n’ai pas encore eu le temps de me pencher sur Puppet ou Chef, l’installation automatique du JDK 8 d’Oracle est réalisée au travers d’un simple script shell qui se charge de réaliser les tâches suivantes :

  1. vérifie si le provisionnement de Java a déjà été fait
  2. configure les dépôts APT les plus rapides
  3. ajoute le dépôt PPA
  4. lance l’installation automatique de Java 8
  5. configure la variable d’environnement JAVA_HOME
  6. nettoie le système (utile en cas d’échec de l’installation)

Voici le contenu du fichier scripts/provision_java.sh :

echo "[vagrant provisioning] Checking if the box was already provisioned..."
if [ -e "/home/vagrant/.provision_java_check" ]
then
  echo "[vagrant provisioning] The box is already provisioned..."
  exit
fi
echo "[vagrant provisioning] Updating mirrors in sources.list"
sudo sed -i -e '1ideb mirror://mirrors.ubuntu.com/mirrors.txt trusty main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-updates main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-backports main restricted universe multiverse\ndeb mirror://mirrors.ubuntu.com/mirrors.txt trusty-security main restricted universe multiverse\n' /etc/apt/sources.list
sudo apt-get update
echo "[vagrant provisioning] Installing Java..."
sudo apt-get -y install python-software-properties
sudo add-apt-repository -y ppa:webupd8team/java
sudo apt-get update
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 seen true | sudo /usr/bin/debconf-set-selections
sudo apt-get -y install oracle-java8-set-default
export JAVA_HOME="/usr/lib/jvm/java-8-oracle/jre"
echo "[vagrant provisioning] Java installed"
sudo dpkg --configure -a
apt-get autoremove -y
echo "[vagrant provisioning] Creating .provision_java_check file..."
touch .provision_java_check

Avec ces deux fichiers, vous pouvez lancer les commandes suivantes :

$ vagrant up
$ vagrant ssh

Une fois la VM créée et une fois connecté sur celle-ci, vous pouvez vérifier que le Java est correctement installé :

$ echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle

$ java -version
java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) Client VM (build 25.20-b23, mixed mode)

Votre environnement de développement Java 8 est prêt !

Packaging de la box

Vous avez pu remarquer que le provisionnement de cette VM a pris un certain temps (une dizaine de minutes lors de mon test) entre la mise à jour des dépôts APT et le téléchargement du Java 8. Afin que la création des prochaines VM soit plus rapide, vous pouvez packager celle-ci. Dans un premier temps, il faut effacer l’empreinte mémoire pour réduire au maximum la taille de la box avant de l’arrêter :

$ sudo dd if=/dev/zero of=/EMPTY bs=1M
$ sudo rm -f /EMPTY
$ sudo shutdown -h now

Il existe des articles qui expliquent une ou deux méthodes pour réduire significativement la taille d’une box Vagrant.

Ensuite, il faut créer la box avec la commande suivante :

$ vagrant package --output trusty32-java8-oracle.box

Installation de la box

Cette dernière étape est très simple et s’effectue avec la commande :

$ vagrant box add trusty32/java8/oracle trusty32-java8-oracle.box

Réutilisation de la box

Pour réutiliser cette box dans de nouvelles VM Vagrant, il suffit d’exécuter les commandes suivantes :

$ vagrant init trusty32/java8/oracle
$ vagrant up

Ou bien de créer le fichier VagrantFile suivant :

Vagrant.configure("2") do |config|
  config.vm.box = "trusty32/java8/oracle"
end

Cette fois, la création et le démarrage de la VM a pris moins de 3 minutes !

Vous êtes maintenant équipé pour créer à la demande des environnements de développement Java 8 très très rapidement.