Este script injeta uma versão de firmware baseada em git no firmware PlatformIO ESP32
Este é um script Python que você pode usar em seu processo de build PlatformIO para injetar uma string de versão de firmware baseada na tag e commit Git atuais no seu binário de firmware ESP32. Isso é útil para rastrear qual versão do firmware está rodando no seu dispositivo.
Um exemplo de versão que ele poderia injetar é v1.0.0-123-gabc1234@2025-08-27T02:06:15.
inject_git_version.py
#!/usr/bin/env python3
import subprocess
from datetime import datetime
import argparse
import sys
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument("-e", "--environment", help="O ambiente de build a usar")
parser.add_argument("--chip", default="esp32", help="O chip a usar (para esptool.py elf2image)")
parser.add_argument("--flash_freq", default="40m", help="A frequência de flash (para esptool.py elf2image)")
parser.add_argument("--flash_mode", default="dio", help="O modo de flash (para esptool.py elf2image)")
args = parser.parse_args()
# Determinar versão git e data de build
version = subprocess.check_output("git describe --long --tags --dirty", shell=True).strip().decode("utf-8")
date = datetime.utcnow().isoformat()
# Juntar versão e data
full_version_string = f"{version}@{date}".encode("utf-8")
firmware_version_template = b"================================================================================"
# Se nenhum ambiente for especificado, apenas imprimir a versão e sair
if not args.environment:
print(f"Version: {version}")
print("No --environment specified, exiting...")
sys.exit(1)
with open(f".pio/build/{args.environment}/firmware.elf", "rb") as infile:
firmware_binary = infile.read()
# As strings de substituição devem ter exatamente o tamanho certo!
version_replacement = full_version_string.ljust(len(firmware_version_template), b'\0')
# Substituir!
firmware_binary = firmware_binary.replace(firmware_version_template, version_replacement, 1)
# Escrever de volta no arquivo
with open(f".pio/build/{args.environment}/firmware-versioned.elf", "wb") as outfile:
outfile.write(firmware_binary)
# Escrever versão no arquivo
with open(f".pio/build/{args.environment}/version.txt", "w", encoding="utf-8") as outfile:
outfile.write(version)
# Converter para ELF
subprocess.check_output(f"esptool.py --chip {args.chip} elf2image --flash_freq {args.flash_freq} --flash_mode {args.flash_mode} .pio/build/{args.environment}/firmware-versioned.elf", shell=True)If this post helped you, please consider buying me a coffee or donating via PayPal to support research & publishing of new posts on TechOverflow