Comment automatiser la compilation

Depuis 4D v19, vous pouvez lancer la compilation d’un projet avec une simple commande. Vous vous demandez peut-être à quoi cela peut vous servir !

Votre équipe peut être composée de plusieurs développeurs, alors pourquoi ne pas automatiser la compilation à chaque poussée de code sur votre serveur de contrôle de source ? Il est toujours plus facile d’identifier une erreur lorsqu’elle est rapidement détectée.

Un autre cas est celui où votre projet est constitué de plusieurs composants. Vous pouvez écrire une méthode qui compile, construit, puis copie le composant dans la base de données hôte.

Ce blog abordera les différents points techniques qui sont très utiles pour créer vos propres outils d’automatisation, ainsi qu’un exemple d’application.

Lancer une application 4D avec une ligne de commande

Vous pouvez lancer 4D via la ligne de commande en spécifiant le projet à ouvrir et en choisissant les options à activer. Voici un rappel de quelques options qui peuvent être très utiles pour automatiser une action.

Headless

Pour l’exécution de tâches répétitives et déclenchées automatiquement, la présence d’une interface est inutile. Si vous passez l’option« –headless » dans la ligne de commande, votre application 4D, 4D Server ou fusionnée s’exécutera sans interface.

Pour plus de détails, vous pouvez lire cet article de blog : Headless applications 4D.

Dataless

L’option« –dataless » vous permet de demander à 4D de ne pas ouvrir un fichier de données. Par exemple, le chargement d’un fichier de données est inutile si vous créez un script pour lancer une compilation.

Pour être clair, le mode dataless est rarement utilisé. Si vous ouvrez 4D en mode sans données, vous ne pouvez pas ouvrir un fichier de données à l’aide des commandes 4D après avoir lancé 4D. Vous trouverez tous les détails dans la documentation.

Paramètres de l’utilisateur

Automatiser des tâches répétitives ne signifie pas faire exactement la même chose à chaque fois. Par exemple, vous pouvez déclencher une tâche toutes les heures avec des options pour une vérification rapide et facile, et chaque nuit, exécuter une autre tâche qui prend plus de temps et de ressources.

L’option« –user-param » vous permet de passer une chaîne de caractères dans la ligne de commande. Ensuite, avec la commande Get database parameter et la constante user param value, vous pouvez obtenir la chaîne passée dans la ligne de commande.

$result:=Get database parameter(User param value;$userParam)

Pour plus de détails, vous pouvez lire cet article de blog.

Compiler un projet en utilisant une commande

Grâce à la commande Compile project vous pouvez lancer la compilation d’un projet en passant son chemin. La commande accepte également un objet options qui vous permet de paramétrer votre compilation. Par exemple, vous pouvez spécifier les dépendances de votre projet, la cible Intel et Silicon, etc.

$status:=Compile project($file; $options)

En cas d’erreur, la commande retourne un objet avec la liste des erreurs composée du message d’erreur, du nom de la méthode et du numéro de ligne. Pour rappel, vous pouvez utiliser la commande METHOD OPEN PATH pour ouvrir l’éditeur de code directement sur la ligne concernée. Pour découvrir toutes les options de cette commande, nous vous recommandons de lire ce billet de blog ou la documentation.

Il est important de connaître les possibilités offertes par cette commande et de savoir comment l’utiliser correctement. Mais l’autre grande nouvelle est que vous pouvez l’exécuter dans un projet en mode interprété, avec les options« –dataless » et« –headless« , sans licence de développement ! Ainsi, si vous utilisez une solution serveur externe pour compiler votre application, par exemple en utilisant l’action git sur GitHub, vous n’avez pas besoin d’injecter votre licence sur le serveur tiers.

Générer un fichier Log

Avec les tâches automatiques, il est indispensable d’avoir des logs pour savoir que la tâche a été exécutée, et pour récupérer les erreurs en cas de problème. Mais dans la réalité, ce n’est pas si simple. La gestion est différente entre macOS et Windows. L’architecture des fichiers sur les serveurs peut être différente. Et le script peut être exécuté sur l’un de vos serveurs ou sur un serveur externe.

La solution que nous proposons est d’utiliser la commande LOG EVENT avec la constante Into system standard outputs. Vous pouvez alors rediriger le flux standard et le flux d’erreur vers un ou plusieurs fichiers dans la ligne de commande. Il est donc simple de s’adapter à votre environnement sans modifier le script.

Enfin, il peut être utile de savoir quand le script a été exécuté, quand l’erreur s’est produite. La commande Timestamp est parfaite pour cela ; elle renvoie une chaîne de caractères qui peut facilement être ajoutée à un fichier journal avec une précision de l’ordre de la milliseconde.

LOG EVENT(Into system standard outputs; Timestamp+" - Je suis une information" ; Error information)
LOG EVENT (Into system standard outputs; Timestamp+" - Je suis une erreur" ; Error message)

Exemples concrets

Voilà ! En suivant tous les conseils précédents, nous avons créé un projet disponible sur GitHub pour compiler un projet. Nous passons un objet stringifié à« –user-param« , qui contient trois attributs :

  • path: le chemin du projet à compiler (attribut obligatoire)
  • options: objet d’options passé à la commande Compile Project (attribut facultatif)
  • quit: passez false pour ne pas fermer 4D après la compilation, utile pour les tests ; par défaut, 4D se ferme après l’exécution (attribut facultatif)

 

Automatiser la compilation du projet

Voici quelques exemples de lignes de commande, n’oubliez pas d’adapter les chemins.

Lancer un contrôle syntaxique :

  • macOS
/.../Contents/MacOS/4D 
--structure /.../Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\",\"options\":{\"targets\":[]}}"
--headless --dataless 
2>.../errlog.txt 1>.../infolog.txt
  • Windows
C:\...DD.exe 
--structure C:\...\Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\",\"options\":{\"targets\":[]}}"
--headless --dataless 
2>C:\...\errlog.txt 1>C:\...\infolog.txt

Voici le contenu de notre fichier infolog.txt ; le errlog.txt est vide :

2021-08-25T17:38:52.197Z - Start script
2021-08-25T17:38:54.961Z - user-param: {"path":"/.../myProject.4DProject","options":{"targets":[]}}
2021-08-25T17:38:54.964Z - {"success":true,"errors":[]}
2021-08-25T17:38:54.999Z - End script

Compilation avec les paramètres par défaut :

  • macOS
/.../Contents/MacOS/4D 
--structure /.../Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\"}" 
--headless --dataless 
2>.../errlog.txt 1>.../infolog.txt
  • Windows
C:\...DD.exe
--structure C:\...\Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\"}" 
--headless --dataless 
2>C:\...\errlog.txt 1>C:\...\infolog.txt

Compilation avec les options passées à la commande Compile project :

  • macOS
/.../Contents/MacOS/4D 
--structure /.../Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\",\"options\":{\"targets\":[\"x86_64_generic\"]}}" 
--headless --dataless 
2>.../errlog.txt 1>.../infolog.txt
  • Windows
C:\...DD.exe
--structure C:\...\Tool_Compilation.4DProject 
--user-param "{\"path\":\"/.../myProject.4DProject\",\"options\":{\"targets\":[\"x86_64_generic\"]}}" 
--headless --dataless 
2>C:\...\errlog.txt 1>C:\...\infolog.txt

Quelle est la suite ?

Maintenant, c’est à vous de jouer. N’hésitez pas à partager sur GitHub ou sur le forum vos idées ou solutions pour automatiser des tâches.

Vanessa Talbot
- Product Owner -Vanessa Talbot a rejoint l'équipe du programme 4D en juin 2014. En tant que Product Owner, elle est chargée de rédiger les user stories puis de les traduire en spécifications fonctionnelles. Son rôle est également de s'assurer que l'implémentation des fonctionnalités livrées répond aux besoins des clients.Depuis son arrivée, elle a travaillé à la définition des fonctionnalités clés de 4D. Elle a travaillé sur la plupart des nouvelles fonctionnalités de multithreading préemptif et aussi sur un sujet très complexe : la nouvelle architecture pour les applications enginées. Vanessa est diplômée de Telecom Saint-Etienne. Elle a commencé sa carrière à l'Institut de Recherche Criminelle en tant que développeur pour le département audiovisuel. Elle a également travaillé dans les domaines des médias et du médical en tant qu'experte en support technique, en production ainsi qu'en documentation de nouvelles fonctionnalités.