[tuto] dev et debug de Jeedom sous windows avec VSCode et Docker

Bonjour,

Ce tuto a vocation à aider ceux d’entre vous qui voudraient se lancer dans la formidable aventure du développement :slight_smile: ou qui ont déjà sauté le pas, mais galèrent avec Notepad++ FTP et la multiplication des outils nécessaires à éditer et copier les fichiers sources - je suis passé par la aussi, c’est fastidieux…

Aujourd’hui on peut développer et débugger jeedom avec uniquement 2 logiciels à installer, et cerise sur le gâteau c’est possible directement sous Windows, donc oui on va installer jeedom sous Windows! ça reste du DEV donc je ne garantis pas le fonctionnement optimal de tous vos plugins, mais en tout cas pour le core, c’est bien.

Allergiques à la ligne de commande, ce tuto est pour vous :smiley:

Prérequis

Pour Docker en particulier il faut un PC récent et assez costaud (indiqué dans la procédure d’installation, Windows 10 64-bit: Home or Pro 2004 (build 19041) or higher, or Enterprise or Education 1909 (build 18363) or higher WSL2 activé, 4GB de ram …)

Je ne détaille pas l’installation, c’est assez standard, télécharger / exécuter / … laisser les options par défaut normalement il n’y a pas de piège.

Les 2 logiciels sont également disponible pour Linux & Mac, je ne l’ai testé que sous Windows.

Installation
Il s’agit maintenant de configurer l’environnement de travail, et faire venir les containers docker.
image La configuration se trouve dans ce dépot git à cloner, ça doit être possible avant même d’installer la moindre extention sur VSCode :


Cloner un dépôt, et coller cette URL:
GitHub - pifou25/docker-jeedom: Docker config for Jeedom

Pour Visual Studio Code, nous devons ajouter quelques plugins nécessaires, les extentions :
image c’est cette icône ou le raccourcis ctrl+maj+x

Une fois le dépôt cloné, VSCode vous proposera peut être automatiquement certaines extensions, sinon vous devez les rechercher:

  • PHP Debug
  • PHP Intelephense
  • Docker

AVANT de lancer la machine Docker, il faut copier le fichier .env.default en .env et le modifier - ou pas : il contient des variables (user et mot de passe SQL pour Jeedom) vous pourrez laisser les valeurs par défaut pour du test, du moment que le fichier .env existe.

Vous pouvez aussi créer un répertoire backup et mettre un backup de Jeedom (zippé au format tar.gz) celui-ci sera installé au premier démarrage du container docker.

Démarrage
On va maintenant démarrer l’étape de création et exécution des containers Docker, il y en a 4 :

Vous n’avez pas besoin de comprendre tout ça, grâce à VSCode le démarrage se fait en 1 clic droit sur le fichier docker-compose.yml celui à la racine du projet, puis dans le menu contextuel : compose up (c’est l’équivalent de la commande docker-compose up -d en ligne de commande mais je vous avais bien dit qu’on n’aurait pas besoin d’écrire une ligne :wink: )

Attendre le temps qu’il faut, pendant ce temps vous pourrez ouvrir Docker Desktop si ce n’est déjà fait pour observer les containers se créer.

image Dans VSCode dans l’onglet Docker vous devriez voir ceci:
image
et quelque chose de similaire dans Docker Desktop

Lorsque le container jeedom est vert, il doit encore lui même faire une installation (clone Jeedom dans le répertoire du même nom, initialisation de la db ou restauration du backup c’est selon)

Lorsque c’est terminé, vous avez donc le répertoire jeedom qui contient le code source de jeedom-core. Et vous pouvez jouer avec votre jeedom en local sous windows: http://localhost

Debug

Plusieurs possibilités pour débugger:

  • Vous mettez un « point d’arrêt » sur la ligne à débugger : ex, dans le fichier index.php je met un point d’arrêt au tout début - au moins, je suis sûr d’y passer : c’est le petit point rouge devant les numéros de ligne
  • ou alors, j’ai une erreur php à débugger, un plantage quelconque, mais je ne sais pas où il plante, et dans ce cas je vais directement dans l’onglet Debug, le petit insecte
    image
    et dans le cadre d’en bas, je sélectionne Errors et Exceptions :
    image

ET, dans les 2 cas je lance le débuggeur ‹ listen fox Xdebug › , la configuration pour cela est dans le .vscode/launch.json que VSCode devrait trouver tout seul :
image

Une fois démarré, XDebug propose une barre d’outils pour faire pause, avancer d’1 pas, entrer dans une procédure, sortir, ou recommencer. Et arrêter XDebug.
image
Donc, aller sur votre navigateur et recharger la page, et hop! XDebug prend la main et intercepte la requête (qui ne s’affiche donc pas dans le navigateur). Dans VSCode, cliquer sur la ‹ pile des appels › sur la ligne en pause (sur breakpoint, ou bien sur exception) :
image

C’est normal qu’il y ait plusieurs request en même temps, ça peut être des requêtes ajax en parallèle, ou même un cron qui tourne.

Exemple d’exception interceptée:

En laissant mon curseur au dessus de la variable $path je peux vérifier sa valeur. Mais, comme si ça ne suffisait pas, toujours en pause je peux inspecter l’ensemble des variables et leurs valeurs, dans le cadre de gauche:
image

Et si je veux savoir pourquoi on est dans cette fonction avec ces paramètres, alors dans la pile d’appels je clique sur la ligne précédente, c’est donc la fonction jeedomCoreAutoload qui est dans le fichier core.inc.php en ligne 55, ce clic va ouvrir le fichier sur la bonne ligne, et mettre à jour la liste des variables et leurs valeurs dans le cadre supérieur.
image

On peut ainsi remonter dans la pile des appels, jusqu’au {main} - sur cette exemple c’est jeeCron c’est donc une requête du cron qui a été interceptée. On peut aussi débugger de la même manière un plugin, il suffit de l’avoir installé au préalable, et mettre le point d’arrêt qui va bien.
On peut éditer en direct le code - c’est fait pour ça - il n’y a pas besoin de relancer ni le container docker ni le debugger, juste rafraichir le navigateur pour relancer la requête.

Conclusion
Il n’y en a pas.

A noter quand même que Jeedom + Xdebug activé est très long, ce qui est normal puisqu’il tente de joindre XDebug à chaque requête. Et ça génère des tonnes de log (http.error, xdebug, cron_execution)

Je cherche maintenant à faire la même chose pour python, car c’est assez fréquent d’avoir des plugins en python et c’est pénible à débugger (si quelqu’un a la solution je suis preneur)

J’ai fait le tuto de mémoire, comme j’ai déjà tout installé - et bien d’autres choses pas forcément utiles - n’hésitez pas à me dire que ça a marché du 1er coup si vous testez la manip, ça me fera plaisir :slight_smile:

9 « J'aime »

Magnifique!!!
C’est vrai que Docker Desktop est gourmand en ressources… surtout avec ma vieille machine qui a 10 ans.
Par contre, je n’arrive pas à me logguer (avec jeedom/jeedom ou admin/admin comme credential)

normalement, admin / admin si c’est une install neuve.
Par contre, si tu a mis un backup dans le répertoire backup il est possible que le container l’embarque au démarrage et du coup c’est ton login / password du backup.
Regarde sinon dans les logs du container s’il y a des erreurs. Mais si tu es sur l’accueil de Jeedom en principe tout va bien.

Je confirme que c’est un fresh install de ton github sans backup. C’est curieux!!!
J’ai juste copié .env.default en .env (du coup j’ai les 2).
Je vais essayer de screener les log.

Bon je vois pas grand chose dans le log docker si ce n’est ce warning pour le node-red-1:
[warn] Encrypted credentials not found

Ha, oui, node-red n’est pas utile j’aurais dû le supprimer. Je confirme admin / admin ça fonctionne chez moi par contre j’ai eu d’autres erreurs avant d’arriver sur la page Jeedom, des problèmes d’installation des packages composer, semble-t-il.

Idem pour moi admin/admin ne fonctionne pas sur fresh install, bizarre.

J’ai viré node-red avant.

Si je laisse adminer en 8080 il ne démarre pas, je l’ai mis en 8180 et c’est ok.

Donc toujours bloqué sur la page de connexion de Jeedom.

Edit :

En ouvrant adminer on voit que la base USER est vide. Comment créer un user ? ou plutôt comment se connecter à ce container en ssh pour créer un user ?

Bonjour,

il n’y a pas d’accès en ssh à l’intérieur d’un container. il faut se connecter sur l’host, puis ensuite entrer dans le container avec cette commande:
docker run -ti nom_du_container_jeedom bash
(trouver le nom du container jeedom avec docker ps)

Sinon, en mode 0 ligne de commande, avec Docker Desktop, click sur « actions » sur la ligne du container, puis « open in terminal »


D’ailleurs les logs du container sont aussi disponible via Docker Desktop (View details).

1 « J'aime »

Merci, entre temps jai trouvé comment se connecter depuis VSCode.

Et ensuite suffit de créér un user/mdp avec le code disponible dans la doc jeedom.

Merci pour l’astuce de docker desktop :+1: