Automatisation de tâches dans un OS virtualisé

5 décembre 2019 · 4 min de lecture

Ou comment effectuer des actions dans une machine virtuelle sans quitter le terminal…

Depuis Linux, je cherchais le moyen d’automatiser la compilation d’un logiciel sur Windows, et sans utiliser Wine qui n’a rien d’officiel.

VirtualBox est un logiciel de virtualisation multi-plateformes. Il est livré avec VBoxManage, un outil en ligne de commande qui permet de manipuler et gérer les machines virtuelles.

Prenons un cas concret : voici pour exemple, l’exécution d’un script bash sous Linux qui va effectuer des actions dans une machine virtuelle Windows 10, afin de compiler un logiciel, l’exécuter, faire une capture d’écran et le copier sur l’hôte.

Voilà le résultat : on est bien dans un terminal Linux qui affiche le résultat de commandes DOS !

Compilation sur Windows via la VM 'Win10'

Démarrage de la VM Win10
Waiting for VM "Win10" to power on...
VM "Win10" has been successfully started.

Création du dossier c:/users/jeff/desktop/travail
Copie main.js
Copie package.json
Copie du dossier app/

yarn install
yarn install v1.19.2
info No lockfile found.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 49.30s.

yarn run buildwin64
yarn run v1.19.2
$ electron-builder -w --x64
  • electron-builder version=20.44.4
  • loaded configuration file=package.json ("build" field)
  • no native production dependencies
  • packaging       platform=win32 arch=x64 electron=4.2.12 appOutDir=c:\Users\jeff\Desktop\dist\win-unpacked
  • building        target=portable file=c:\Users\jeff\Desktop\dist\app.exe archs=x64
Done in 67.88s.

Démarrage de l'application
Screenshot pour le fun
Récupération du fichier compilé
Cleanup
Extinction VM
0%...10%...20%...30%...40%...50%...60%...70%...80%...90%...100%

Code source du script bash pour télécommander Windows, dont le résultat est affiché ci-dessus :

#!/bin/bash

# Automatisation de tâches dans un OS VirtualBox

# dossier à créer dans l'OS virtualisé pour y copier l'app et la compiler
GUEST_PATH="c:/users/jeff/desktop"

# login OS virtualisé
GUEST_USER="jeff"

# mot de passe de l'utilisateur
GUEST_PASSWD="123456"

echo "Compilation sur Windows via la VM 'Win10'"
echo # saut de ligne

# Démarrage de la VM sans interface graphique
# INFO: pour afficher les VM disponibles tapez: VBoxManage list vms
echo "Démarrage de la VM Win10"
VBoxManage startvm "Win10" --type headless
echo

# Création d'un dossier dans la VM
echo "Création du dossier ${GUEST_PATH}/travail"
VBoxManage guestcontrol "Win10" mkdir "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD

echo "Copie main.js"
VBoxManage guestcontrol "Win10" copyto main.js --target-directory "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD

echo "Copie package.json"
VBoxManage guestcontrol "Win10" copyto package.json --target-directory "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD

echo "Copie du dossier app/"
VBoxManage guestcontrol "Win10" mkdir "${GUEST_PATH}/travail/app" --username $GUEST_USER --password $GUEST_PASSWD
VBoxManage guestcontrol "Win10" copyto -R app/ --target-directory "${GUEST_PATH}/travail/app" --username $GUEST_USER --password $GUEST_PASSWD
echo

# Création d'un script DOS qui sera exécuté dans Windows pour installer les dépendances du projet
cat > install.bat <<EOL
@echo off
chdir /d c:\\Users\\jeff\\desktop\\travail
yarn install
EOL
VBoxManage guestcontrol "Win10" copyto install.bat --target-directory "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD

# Création d'un script DOS qui sera exécuté dans Windows pour compiler le projet
cat > build.bat <<EOL
@echo off
chdir /d c:\\Users\\jeff\\desktop\\travail
yarn run buildwin64
EOL
VBoxManage guestcontrol "Win10" copyto build.bat --target-directory "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD

# Exécution du 1er script BAT dans la VM
echo "yarn install"
VBoxManage guestcontrol "Win10" run --exe "${GUEST_PATH}/travail/install.bat" --username $GUEST_USER --password $GUEST_PASSWD --wait-stdout --wait-stderr
echo

# Exécution du 2nd script BAT dans la VM
echo "yarn run buildwin64"
VBoxManage guestcontrol "Win10" run --exe "${GUEST_PATH}/travail/build.bat" --username $GUEST_USER --password $GUEST_PASSWD --wait-stdout --wait-stderr
echo

echo "Démarrage de l'application dans la VM"
VBoxManage guestcontrol "Win10" start --exe "${GUEST_PATH}/dist/app.exe" --username $GUEST_USER --password $GUEST_PASSWD

# Faire une capture d'écran (on peut faire aussi une vidéo)
echo "Screenshot pour le fun"
VBoxManage controlvm "Win10" screenshotpng 01.png

echo "Récupération du fichier compilé"
VBoxManage guestcontrol "Win10" copyfrom -R "${GUEST_PATH}/dist/" ../dist --username $GUEST_USER --password $GUEST_PASSWD

# INFO: pour fermer une application, il faut d'abord trouver son processus et l'id de session avec :
# VBoxManage guestcontrol "Win10" list processes
# Pour quitter l'application :
# VBoxManage guestcontrol "Win10" closeprocess --session-id 1 2484

# Suppression des fichiers de travail, sur l'hôte et la VM
echo
echo "Cleanup"
rm install.bat
rm build.bat
VBoxManage guestcontrol "Win10" rmdir -R "${GUEST_PATH}/travail" --username $GUEST_USER --password $GUEST_PASSWD
VBoxManage guestcontrol "Win10" rmdir -R "${GUEST_PATH}/dist" --username $GUEST_USER --password $GUEST_PASSWD

# Extinction
echo "Extinction VM"
VBoxManage controlvm "Win10" savestate
PARTAGER

A LIRE EGALEMENT