TD 01 - Livrer une application
Ce TD est consacré au déploiement d’une application Spring Boot sur un serveur distant. Pour ce faire vous devrez empaqueter une application et utiliser des variables d'environnements.
Objectifs
À l’issue de ce TD, vous serez capable :
- D'empaqueter (package) une application Java sous forme de fichier JAR exécutable.
- Créer un compte AlwaysData et de configurer un environnement d’hébergement.
- Générer une clé SSH pour sécuriser les échanges avec AlwaysData.
- Déployer une application Spring Boot sur AlwaysData.
- Connaissance de base en Spring Boot et des commandes shell.
- Un environnement de travail prêt avec Git, Java (JDK 21 minimum) et un IDE (VS Codium).
Analyse de l'application à déployer
Commencez par récupérer l'application Spring-Boot à déployer via la commande
git clone https://git.esi-bru.be/4dop1dr-ressources/demo-no-db.git
Cette application est composée du contrôleur suivant :
@RestController
public class ServiceRestController {
@Autowired
private Environment environment;
@GetMapping("/config")
public Map<String, String> getEnvironmentDetails() {
Map<String, String> envDetails = new HashMap<>();
// Récupération des propriétés système
String javaVersion = System.getProperty("java.version");
String osName = System.getProperty("os.name");
String userName = System.getProperty("user.name");
// Ajouter les propriétés systèmes
envDetails.put("Java Version", javaVersion);
envDetails.put("Operating System", osName);
envDetails.put("User Name", userName);
// Récupération des propriétés de configuration Spring Boot
// depuis application.properties
String appName = environment.getProperty("spring.application.name");
String port = environment.getProperty("server.port");
// Ajouter les propriétés dans la réponse
envDetails.put("Application Name", appName);
envDetails.put("Port Number", port);
return envDetails;
}
}
Ce contrôleur expose un service REST qui retourne des détails sur la configuration de l'environnement dans lequel l'application s'exécute.
Le contrôleur récupère en premier les propriétés systèmes java.version, os.name et user.name.
Les propriétés systèmes ou Java system property sont
initialisées lors du démarrage du JDK et dépendent de la
configuration de l'environnement ("de la machine") de travail.
La liste des propriétés initialisées est disponible dans la
javadoc de la méthode System.getProperty(). Consultez cette liste via ce lien et vérifiez si il est possible de récupérer le dossier de travail courant.
Ensuite le contrôleur via la classe
org.springframework.core.env.Environment récupère les valeurs
des propriétés de configuration Spring Boot, c'est à dire les
variables du fichier application.properties.
spring.application.name=demo pour devops
server.port=8080
La première variable est un String représentant le nom associé à
l'application. La seconde variable est le numéro de port associé à
l'application.
Exécution de l'application
Rappelez-vous, pour exécuter l'application vous avez besoin de l'outil maven.
Pour vérifier que l'outil est installé sur la machine, vous pouvez tenter de l'exécuter.
mvn --version
Vous devez obtenir un résultat proche de
Maven home: C:\Program Files\apache-maven-3.9.10
Java version: 24.0.1, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk-24
Default locale: en_US, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
Si maven n'est pas installé sur votre machine, vous pouvez l'installer
ou utiliser la version embarquée dans le projet.
Dans ce cas, il faudra remplacer partout la commande mvn par ./mvnw.
Dans tous les cas, ne continuez pas tant qu'une erreur persiste.
Une erreur classique est l'absence de la variable d'environnement système JAVA_HOME voir l'absence du chemin vers le JDK dans le
PATH de votre machine.
Une variable d'environnement système est définie au niveau du système d'exploitation et est accessible par tous les processus. JAVA_HOME et PATH sont des variables d'environnement système.
On définit ces variables pour la session courante via la commande export MY_VAR=value.
Pour rendre la valeur permanente :
- Sous Linux/MacOS : on ajoute l'instruction au fichier
~/.bashrc - Sous Windows : on la définit via la fenêtre Edit environment variables for your account dans les settings.
Vous pouvez désormais démarrer l'application avec la commande
mvn spring-boot:run
Consommer le service REST
Pour consulter le résultat de la consommation du service rest, vous pouvez utiliser votre browser préféré, mais il est préférable d'apprendre à effectuer toutes vos actions via le terminal. L'objectif de cette démarche est d'apprendre un des piliers des pratiques DevOps, réussir à automatiser toutes les actions entreprises pour déployer une application.
Utilisez la commande curl (installée à l'école) ou curl pour consommer
le service localhost:8080/config. N'hésitez pas à tester les
différentes options de ces commandes. Le résultat de la commande
doit ressembler à
{"User Name":"g12345","Java Version":"23.0.1","Operating System":"Linux","Application Name":"demo pour devops","Port Number":"8080"}
Un format plus agréable est possible en redirigeant le contenu
JSON dans python -m json.tool par exemple.
{
"User Name": "g12345",
"Java Version": "23.0.1",
"Operating System": "Linux",
"Application Name": "demo pour devops",
"Port Number": "8080"
}
Vous pouvez à présent arrêter l'application.
Empaqueter l'application
L'empaquetage (package) en développement logiciel consiste à regrouper tous les fichiers nécessaires au fonctionnement d'une application dans un seul fichier exécutable ou déployable. Pour les applications Java, cela se traduit souvent par la création d’un fichier JAR (Java ARchive). Dans un projet Spring Boot, l'empaquetage produit généralement un fichier JAR autonome, contenant le code de l’application, toutes ses dépendances et un serveur embarqué Tomcat.
Un serveur Tomcat est un conteneur de servlets open-source développé par la fondation Apache. Il est conçu pour exécuter des applications web basées sur les technologies Java. Lors de l'exécution d'une application Spring Boot, le serveur Tomcat embarqué démarre automatiquement et prend en charge les requêtes HTTP. Cela simplifie énormément le déploiement, car il n'y a pas besoin de configurer un serveur externe.
Ce fichier JAR exécutable peut ensuite être lancé directement ou déployé sur un serveur, simplifiant le processus de distribution et d’exécution de l’application.
Pour réaliser l'empaquetage de l'application, exécutez la commande :
mvn package
Vérifiez la présence du fichier demo-1.0.0.jar dans le dossier
target/ et validez l'étape d'empaquetage en démarrant
l'application via la commande
java -jar target/demo-1.0.0.jar
Consultez le résultat de la consommation du service rest via la
commande wget ou curl puis arrêtez votre serveur.
Dans un même terminal :
- Définissez la variable d'environnement
système via
export SERVER_PORT=8081. - Démarrez le serveur avec
java -jar demo-1.0.0.jar.
Prenez note de l'url à laquelle répond votre application :
localhost:8080/config ou localhost:8081/config ?
Arrêtez votre serveur et dans le même terminal, lancez la commande ajoutant une Java System Property
java -jar -Dserver.port=8082 demo-1.0.0.jar
À quelle url répond votre application ?
Finalement lancez la commande qui ajoute en plus une propriété de configuration Spring Boot
java -jar -Dserver.port=8082 demo-1.0.0.jar --server.port=8083
Déduisez l'ordre de priorité entre les différentes variables (variable d'environnement système, Java System Property et propriété de configuration Spring Boot).
Comprendre la différence entre la portée de ces variables et leurs priorités est utile lorsqu'il faudra, dans le prochain TD, faire correspondre un numéro de port défini sur un serveur en ligne avec celui de notre application.
Préparer l’infrastructure
AlwaysData est une plateforme qui permet d'héberger des sites web, des applications et des bases de données en ligne. Elle prend en charge de nombreuses technologies telles que PHP, Python, Node.js, Ruby et Java. Elle est compatible avec des systèmes de bases de données comme MySQL, PostgreSQL, SQLite et MongoDB. De plus, elle offre un accès SSH pour une gestion avancée.

Pour déployer une application Spring Boot sur cette plateforme, utilisez le lien disponible sur la page PoEsi de l'unité afin de vous inscrire.
Inscrivez-vous en renseignant votre adresse e-mail étudiante dans le champ "Adresse email", puis choisissez un mot de passe.
Attention : l’option "Se connecter avec Google" ne permet pas de bénéficier des avantages réservés aux étudiants de l’établissement.

Choisissez le plan gratuit, fournissez un mot de passe et indiquez g12345 (un g suivi de votre matricule) comme login.
Installer le JDK
Une fois connecté, la page d’accueil affiche les Sites associés à votre compte. Un premier site web est créé et à la forme g12345.alwaysdata.net.

Testez et constatez que le site contient juste une page d'accueil basique par défaut.
Par défaut la machine qui héberge votre site ne dispose pas d'une version du JDK installée. Consultez la documentation de Alwaysdata avant de passer à la suite afin de comprendre les étapes suivantes.
Appuyez sur le bouton permettant de modifier le site ⚙️
- Changez le Type en User program.
- Ajoutez dans le champs Command
java -jar demo-1.0.0.jar --server.address=:: --server.port=$PORT. - Dans le champs Working directory ajoutez
www, qui est le dossier de travail prévu pour votre application.
Activer SSH
SSH (Secure Shell) est un protocole réseau sécurisé qui permet d'établir une connexion à distance entre deux machines, généralement un ordinateur local et un serveur. Il offre une communication chiffrée pour garantir la confidentialité et la sécurité des échanges.
Pour pouvoir déposer le fichier JAR de l'application, il faut définir le protocole de communication entre la machine de développement et la machine hébergée chez Alwaydata. Les deux machines vont communiquer via SSH.
- Sur la page de votre compte, sélectionnez le menu
Remote access > SSHdans le menu de navigation. Cette page liste les utilisateurs SSH associés à votre compte. - Vérifiez que l'utilisateur créé peut bien se connecter avec un mot de passe.
- Vérifiez que l'activation SSH fonctionne en ouvrant sur votre machine de travail un terminal et en exécutant la commande
ssh g12345@ssh-g12345.alwaysdata.net. - Si nécessaire, confirmez cette première connexion en répondant à la question
Are you sure you want to continue connecting (yes/no/[fingerprint])?. Le mieux est de vérifier, grâce à un copier-coller, l'empreinte (fingerprint) correspondante fournie sur la page web. Si la sécurité ne vous intéresse pas, vous pouvez aussi répondreyes. - Entrez votre mot de passe quand il vous est demandé.
- Si la connexion est un succès, le prompt de votre terminal a changé pour
g12345@ssh2:~$et vous pouvez consulter le contenu de la machine associée à votre compte vials -l. - Vous devez voir deux dossier
adminetwww. Le dossierwwwva bientôt accueillir votre fichier JAR. - Entrez la commande
exitpour vous déconnecter.
Créer une clé SSH
Une pratique courante consiste à configurer une clé SSH. Cette clé permet de se connecter automatiquement aux serveurs sans nécessiter de mot de passe à chaque connexion, offrant ainsi une solution pratique pour les utilisateurs réguliers. De plus, les clés SSH sont indispensables pour automatiser des tâches avec des scripts ou des outils comme Git, garantissant une connexion sécurisée sans intervention humaine.
Créez une clé SSH sur votre machine en suivant la marche à suivre via ce lien.. Même sous Windows, la procédure donnée pour Linux est plus simple.
Vérifiez la connexion via ssh g12345@ssh-g12345.alwaysdata.net.
Si la connexion échoue, utilisez l'option -v (verbose) de la commande ssh pour obtenir des informations détaillées.
Déployer l'application
L’infrastructure en place, le déploiement se résume à copier l'application empaquetée dans le dossier d’accueil sur la machine hébergée en ligne en utilisant le protocole SSH.
Utilisez la commande scp pour copier le fichier JAR dans le dossier www et déployer l'application.
Après le déploiement tester le résultat via la commande wget ou curl via l'url http://g12345.alwaysdata.net/config.
Note: il y aura peut-être un petit délai, le temps que l'application démarre sur le serveur. Vous pouvez aussi forcer un redémarrage via le bon bouton sur la page de gestion du site. Un autre bouton permet quant à lui de consulter les logs.