2
votes

Numéro de build d'incrémentation automatique à l'aide de PlatformIO

J'ai plusieurs projets de micro-contrôleurs pour la domotique. Chacun de mes nœuds a un numéro de version qui est défini manuellement dans le code. Ce numéro de version est signalé lors du démarrage du nœud pour m'informer du code en cours d'exécution.

Parfois, la modification du numéro de version est oubliée après quelques modifications dans le code. Il faut donc trouver une solution automatique.

J'ai une idée de la solution:

  1. créer un fichier (version.h): #define BUILDNO xxx
  2. incluez-le dans les codes c appropriés
  3. incrémentation automatique xxx avant chaque build

Peut-il être mis en œuvre? Ou existe-t-il d'autres solutions avec un résultat similaire?


2 commentaires

Aidez-moi, s'il vous plaît! Quel est le problème avec cette question? Beaucoup de votes négatifs.


Cela semble être une bonne question, à mon humble avis. À tout le moins, cela donne aux gens une introduction aux scripts personnalisés de PlatformIO. (Ça l'a fait pour moi, au moins!)


3 Réponses :


1
votes

Vous devrez dépendre de programmes pré-construits lors de l'utilisation de C ou C ++ (Arduino). Vous devez ajouter un programme pré-build qui met à jour un fichier avec un simple:

#define VERSION "1.0.0"

Votre programme d'incrémentation automatique doit stocker la version actuelle quelque part (de préférence dans la version.h pour qu'il ne se désynchronise pas) et le lit, l'incrémente et le stocke lors de la compilation.

Vous pouvez utiliser une solution comme celle-ci à partir de vurdalakov ou celui-ci sur cplusadd.blogspot.com qui utilise Makefiles.


1 commentaires

Merci pour votre contribution à la question. C'était très utile. Cela m'a donné des idées par où commencer. Étant donné que PlatformIO est multiplateforme, j'ai migré le code lié vers Python qui peut être exécuté sans problème à partir de la plate-forme. J'ai posté la solution finale ci-dessous.



6
votes

J'ai fait des recherches sur la base des réponses à ma question. PlatformIO peut exécuter des scripts personnalisés avant la compilation. Voici le processus pour générer un numéro de build et l'inclure dans votre code de projet:

  1. Créez un script Python dans le dossier du projet: buildscript_versioning.py
#include <version.h>
  1. Ajouter une ligne à platformio.ini :
    extra_scripts = 
        pre:buildscript_versioning.py

La construction de votre projet exécutera le script. 2 fichiers seront créés:

  • versioning : un simple fichier texte pour stocker le dernier numéro de build

  • include / version.h : fichier d'en-tête à inclure

Vous pouvez maintenant ajouter cette ligne à votre code C:

FILENAME_BUILDNO = 'versioning'
FILENAME_VERSION_H = 'include/version.h'
version = 'v0.1.'

import datetime

build_no = 0
try:
    with open(FILENAME_BUILDNO) as f:
        build_no = int(f.readline()) + 1
except:
    print('Starting build number from 1..')
    build_no = 1
with open(FILENAME_BUILDNO, 'w+') as f:
    f.write(str(build_no))
    print('Build number: {}'.format(build_no))

hf = """
#ifndef BUILD_NUMBER
  #define BUILD_NUMBER "{}"
#endif
#ifndef VERSION
  #define VERSION "{} - {}"
#endif
#ifndef VERSION_SHORT
  #define VERSION_SHORT "{}"
#endif
""".format(build_no, version+str(build_no), datetime.datetime.now(), version+str(build_no))
with open(FILENAME_VERSION_H, 'w+') as f:
    f.write(hf)

J'ai démarré un dépôt gitlab avec de la documentation ici: https://gitlab.com/pvojnisek/buildnumber-for-platformio/tree/master D'autres idées sont les bienvenues!


4 commentaires

Selon les platformio docs , vous devez préfixer le nom du script avec "pre:" si le script doit s'exécuter avant la construction, sinon il sera par défaut "post:" s'il n'y a pas de préfixe. Exemple: extra_scripts = \ n pre: pre_extra_script.py \ n post: post_extra_script1.py \ n


Désolé pour le mauvais formatage du code, je ne vois pas comment formater du code multiligne dans un commentaire. Avez-vous également trouvé un moyen de (re) nommer le fichier en conséquence afin qu'il soit téléchargé avec le numéro de version correct dans le nom de fichier? c'est-à-dire firmware_0.1.2.bin


@EthanArnold Merci pour votre commentaire! Les préfixes pré et post sont utiles. Je pense que pré: est la meilleure solution dans ce cas. Je mettrai à jour la réponse et le projet gitlab également.


@EthanArnold avez-vous réussi à renommer le fichier bin? Cela peut être facilement fait dans le script python. Utilisez simplement les lignes suivantes: import os et os.rename (firmware.bin, f'firmware_ {VERSION} .bin ')



0
votes

J'aime votre solution au problème. Mais un numéro de version basé sur le code source ne serait-il pas plus utile? PlatformIO a une section sur les variables de construction dynamiques avec un exemple qui extrait un hachage de la version source de git https://docs.platformio.org/en/latest/projectconf/ section_env_build.html # id4 (faites défiler jusqu'à la section Dynamic Build Variables)


1 commentaires

Merci pour cette suggestion. Je l'aime beaucoup. Ici, le but était de générer un identifiant incrémentiel. Il est unique avec la date. L'identifiant de la tête est une autre histoire. Cela dépend de la branche actuelle. Vous devez le définir manuellement si vous changez de branche pendant le développement (j'ouvre personnellement des branches séparées pour chaque bogue et fonctionnalité). Une autre solution pourrait être d'utiliser l'indicateur $ UNIX_TIME .