Tutoriel : Développer avec une machine virtuelle

Introduction

L’utilisation d’ordinateurs privés (BYOD) pour le développement dans le cadre de l’entreprise ou de l’école pose le problème de la configuration des machines. En effet, si l’installation d’un environnement est, en principe, une tâche relativement simple lorsque tout se passe bien, elle peut vite s’avérer délicate dès lors qu’un problème survient. En outre, il n’est pas envisageable d’imposer un système d’exploitation particulier. Or, si la plupart des outils de développement sont disponibles pour la plupart des systèmes d’exploitation, ce n’est pas toujours le cas et les fonctionnalités ainsi que la configuration peuvent varier sensiblement d’un système à l’autre. L’utilisation d’une machine virtuelle préconfigurée permet de minimiser ces difficultés et d’avoir rapidement un environnement de développement prêt à l’emploi.

Une première possibilité consiste à utiliser une machine virtuelle équipée d’un environnement de bureau et d’un EDI (VSCode, NetBeans, IntelliJ, etc.), soit directement, soit en utilisant un système de bureau à distance tel que VNC. Toutefois, cette solution est particulièrement gourmande en ressource. En effet, un environnement de bureau est généralement plutôt lourd et celui de la machine virtuelle fait double emploi avec celui de l’ordinateur hôte. De plus, la mise à jour de la machine virtuelle ne peut pas se faire en remplaçant simplement l’ancienne machine par une nouvelle sans écraser les préférences de l’utilisateur.

Une deuxième possibilité est d’utiliser une machine sans environnement de bureau. Cela permet d’avoir des machines virtuelles beaucoup plus légères ou même l’utilisation de conteneur. On peut alors utiliser un émulateur de terminal de l’ordinateur hôte et le protocole ssh pour se connecter à la machine virtuelle. Le désavantage de cette solution est qu’elle nous contraint à utiliser exclusivement des logiciels fonctionnant en mode texte. Or, même si un tel environnement permet une productivité aussi bonne, voire meilleure qu’avec un environnement graphique, sa prise en main est plus difficile et sa maîtrise demande beaucoup de temps et de pratique. Il est bien sûr possible d’utiliser des logiciels dotés d’une interface utilisateur graphique avec le protocole X11. Toutefois, l’installation, la configuration et l’utilisation d’un serveur X11 sous Windows et macOS nous ramènent au problème de départ.

Enfin, une troisième possibilité consiste à utiliser un EDI dans l’environnement de bureau de l’ordinateur hôte et une fenêtre de terminale connectée avec ssh à une machine virtuelle sans environnement de bureau pour compiler, exécuter et déboguer. Visual Studio Code supporte particulièrement bien cette solution avec le extension Remote Development.

C’est cette troisième solution que nous recommandons d’utiliser pour les modules de développement. En outre, nous recommandons l’utilisation de Vagrant pour automatiser la création et faciliter la gestion de la machine virtuelle. Ce tutoriel a pour but de vous aider à mettre en œuvre cette solution.

Vagrant et VirtualBox

Installation

D’une manière générale, nous vous recommandons d’utiliser, autant que possible, un gestionnaire de paquets pour l’installation de logiciel sur votre système. En particulier, nous vous recommandons Chocolatey sous Windows et Homebrew sous macOS. Si vous ne savez pas ce dont il s’agit ou si vous ne disposez pas encore d’un gestionnaire de paquets, veuillez suivre le tutoriel : Installer et utiliser un gestionnaire de paquets.

VirtualBox est un hyperviseur de type II, il s’agit d’un système logiciel permettant de faire fonctionner un système d’exploitation invité (guest OS) sur un système d’exploitation hôte (host OS) à l’aide de machines virtuelles.

Vagrant est un outil qui permet d’automatiser la création de machines virtuelles à l’aide de scripts et de gérer ces machines virtuelles depuis la ligne de commande. Pour créer une machine virtuelle avec Vagrant, il suffit de créer ou d’obtenir un script sous la forme d’un fichier nommé Vagrantfile, de copier ce fichier dans un répertoire, et de lancer la commande vagrant up dans ce répertoire.

Pour mettre en œuvre notre solution, nous aurons besoin de VirtualBox pour faire fonctionner la machine virtuelle et de Vagrant pour automatiser la création et gérer (démarrer, arrêter, mettre à jour, etc.) cette machine virtuelle.

Lancez l’une des séries de commandes ci-après pour installer VirtualBox et Vagrant dans sur votre système.

1
2
3
# Installer VirtualBox et Vagrant sous Windows.
choco install virtualbox -y --params "/NoDesktopShortcut /ExtensionPack" --version=6.0.14
choco install vagrant -y
1
2
3
4
# Installer VirtualBox et Vagrant sous macOS.
brew cask install virtualbox
brew cask install virtualbox-extension-pack
brew cask install vagrant

Création d’une machine virtuelle de développement

Si vous effectuez cette opération en classe, assurez-vous d’être connecté au réseau de l’école avec un câble Ethernet afin de réduire le temps de téléchargement de la machine.

Pour créer votre machine virtuelle de développement, ouvrez une fenêtre de terminal sans privilège, rendez-vous dans le répertoire où vous stockez vos projets et lancez les commandes ci-dessous pour récupérer le projet Vagrant depuis le gestionnaire de dépôt git de l’école :

1
2
# Récupérer le projet Vagrant depuis le gitlab de l’école
git clone https://gitlab.epai-ict.ch/m133/dev-vm.git

Si la commande ne fonctionne pas, veuillez vous assurer que git est correctement installé. Si ce n’est pas le cas, veuillez suivre le tutoriel Installer git et Visual Studio Code.

Exécutez ensuite les commandes ci-après. La commande cd permet de vous rendre dans le répertoire de dev-vm que vous venez de créer et qui contient le fichier Vagrantfile. La commande vagrant up permet de créer la machine virtuelle décrite dans le fichier Vagrantfile, si celle-ci n’existe pas déjà, et lancer cette machine virtuelle. Le téléchargement de la machine virtuelle et sa création peuvent prendre plusieurs minutes.

1
2
3
4
# Aller dans le répertoire dev-vm
cd dev-vm
# Créer et démarrer la machine virtuelle
vagrant up

Le système d’exploitation de la machine virtuelle est Debian 10 et est installé sans interface utilisateur graphique, elle ne peut donc être utilisée qu’en ligne de commande. Les logiciels préinstallés sont les suivants :

  • Git
  • OpenJdk 11
  • Maven
  • MariaDB (mysql -u root -pepai123)

La machine est créée avec un utilisateur nommé «vagrant» qui se trouve dans le groupe sudoer. Le répertoire projects, qui se trouve dans le répertoire personnel de cet utilisateur, correspond au répertoire parent du répertoire dev-vm de votre machine physique.

Lorsque la machine est prête, assurez-vous de vous trouver dans le répertoire dev-vm et lancez la commande ci-après pour ouvrir une session avec le protocole ssh. La commande vagrant ssh ouvre une session sur la machine virtuelle avec l’utilisateur vagrant et utilise une clé publique pour l’authentification. Vous n’avez donc pas à saisir un mot de passe.

1
vagrant ssh

Vous pouvez fermer la session à l’aide de la commande exit.

Gestion de la machine virtuelle de développement

Pour gérer votre machine virtuelle de développement, prenez l’habitude d’utiliser vagrant en ligne de commande et non l’interface utilisateur de VirtualBox. Pour effectuer une action sur votre machine virtuelle, ouvrez une fenêtre de terminal sans privilège et rendez-vous dans le répertoire du projet vagrant (dev-vm).

Les commandes principales sont :

1
2
3
4
5
6
7
8
# Démarrer la machine virtuelle
vagrant up

# Arrêter la machine virtuelle
vagrant halt

# Ouvrir une session ssh (la machine doit déjà être démarrée)
vagrant ssh

Développement à distance avec VSCode

Il est possible d’utiliser Visual Studio Code pour développer sur une machine Linux distante à l’aide du protocole ssh. La machine peut être une machine physique ou une machine virtuelle. Nous allons tirer parti de cette fonctionnalité pour développer avec la machine virtuelle que vous venez de créer.

Configurer VSCode pour le développement à distance

Pour commencer, assurez-vous que l’extension Remote Development est bien installée en lançant la commande ci-après dans une fenêtre de terminal sans privilège.

1
code --install-extension ms-vscode-remote.vscode-remote-extensionpack

Si la commande ne fonctionne pas, assurez-vous d’avoir installé Visual Studio Code. Si ce n’est pas le cas, veuillez suivre le tutoriel Installer git et Visual Studio Code.

Toujours dans la fenêtre de terminal, rendez-vous dans le répertoire dev-vm qui se trouve dans votre répertoire de projet et lancez l’une des commandes ci-après pour vous assurer que votre machine virtuelle est prête à être utilisée.

1
vagrant up

Lancer ensuite la commande ci-dessous pour récupérer la configuration ssh de votre machine virtuelle de développement dans un fichier nommé ssh.config.

1
2
3
4
5
# Commande pour Windows CMD et macOS bash
vagrant ssh-config > ssh.config

# Commande pour PowerShell
vagrant ssh-config | Out-File -Encoding UTF8 -FilePath ./ssh.conf

Ouvrez le fichier pour vous assurer que le contenu est similaire au texte ci-après.

1
2
3
4
5
6
7
8
9
10
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/frossardj/work/test/dev-vm/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL

Copiez ce fichier dans votre répertoire personnel et ouvrez Visual Studio Code. Pressez ensuite Shit-Ctrl-P et cherchez la commande Remote-SSH: Settings (fig. 1).

Remote-SSH: Settings
Fig. 1 – Remote-SSH: Settings

Dans la zone de texte prévue à cet effet (voir fig. 2), saisissez le chemin du fichier ssh.conf que vous venez de créer.

Fichier de configuration
Fig. 2 – Fichier de configuration

Enfin redémarrez Visual Studio Code pour terminer la configuration.

Connecter VSCode à votre machine virtuelle

Lancer VSCode et ouvrez le panneau de développement à distance et faite un click droit sur l’icône du serveur nommé « default » pour ouvrir le menu contextuel. Ouvrez une session sur la machine virtuelle avec le menu « Connect to Host in Current Window » (voir fig. 3).

Connecter la machine virtuelle
Fig. 3 – Connecter la machine virtuelle

Après quelques instants, votre fenêtre est maintenant connectée à votre machine virtuelle. Vous pouvez voir le nom de la machine à laquelle vous êtes connecté en bas à droite dans le rectangle vert. Dans votre cas, vous devriez voir « SSH: default ».

Il reste encore à installer le pack d’extension pour Java dans la machine virtuelle. Pour cela, ouvrez le panneau des extensions et installez le Java Extension Pack (voir fig. 4) .

Connecter la machine virtuelle
Fig. 4 – Ouvrir le panneau des extensions et installer Java Extension Pack

Vous pouvez désormais travailler avec VSCode tout à fait normalement. Lorsque vous utilisez le menu « Open… », vous parcourez le système de fichier de la machine virtuelle et le terminal intégré vous permet d’utiliser le bash de la machine virtuelle.

Ouvrir un répertoire
Fig. 5 – Ouvrir un répertoire de la machine virtuelle

Conclusion

Avec ce tutoriel, vous avez créé une machine virtuelle de développement à l’aide de vagrant et appris à la démarrer et l’arrêter. Vous avez ensuite configuré Visual Studio Code pour le développement à distance et appris à ouvrir une session de développement à distance sur la machine virtuelle.