From 1e1d53ecd86d696c7b903dd2eeefd0ff4d12c391 Mon Sep 17 00:00:00 2001 From: Bastian de Byl Date: Sat, 25 Jul 2026 12:01:16 -0400 Subject: [PATCH] feat(gitea-actions): install jq in the ESP-IDF CI image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit esp32-stm32-vcu's scripts/release.sh uses jq to rewrite the protocol manifest before publishing it to S3. The image did not have it, so the release aborted at: ./scripts/release.sh: line 61: jq: command not found The failure mode is nastier than a red job. jq is only reached *after* the firmware .bin and version.json have already been uploaded, so clients were served the new build while the git tag, the Gitea release and the protocol manifest were never written — the repo still showed the previous release as latest while production served a newer one. Only jq was missing; aws and sha256sum are already present (verified in the rebuilt image: jq-1.7, aws-ok, sha256sum-ok). This surfaced when the skudak firmware jobs were moved into this image (they previously ran on the default gitea-ci image, which has jq). --- .../gitea-actions/templates/Containerfile.espidf.j2 | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/ansible/roles/gitea-actions/templates/Containerfile.espidf.j2 b/ansible/roles/gitea-actions/templates/Containerfile.espidf.j2 index b849d61..6a64850 100644 --- a/ansible/roles/gitea-actions/templates/Containerfile.espidf.j2 +++ b/ansible/roles/gitea-actions/templates/Containerfile.espidf.j2 @@ -1,16 +1,23 @@ # ESP-IDF firmware job image (managed by ansible: roles/gitea-actions). # Adds node (required by actions/checkout and other JS actions), the AWS CLI -# (firmware artifacts ship to S3), and the common-yaml header generator's Python -# deps on top of the official Espressif toolchain. +# (firmware artifacts ship to S3), jq (the release script rewrites the protocol +# manifest with it), and the common-yaml header generator's Python deps on top +# of the official Espressif toolchain. # IDF lives at /opt/esp/idf — firmware jobs source /opt/esp/idf/export.sh. # python3-yaml + python3-jinja2 are installed as distro packages so the # common-yaml generator runs with a plain `python3 generate.py` — no pip at job # time (the base image's system Python is PEP 668 externally-managed) and no # need to source the IDF venv just to generate headers. +# +# jq is required by esp32-stm32-vcu scripts/release.sh, which publishes the +# protocol manifest and BLE_API.md to S3 after the firmware upload. Without it +# the release aborts *after* the firmware and version.json are already live — +# clients get the new build while the tag, Gitea release and protocol manifest +# are never written. Keep it installed. FROM espressif/idf:{{ esp_idf_version }} RUN apt-get update && apt-get install -y --no-install-recommends \ - curl ca-certificates unzip python3-yaml python3-jinja2 \ + curl ca-certificates unzip jq python3-yaml python3-jinja2 \ && curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \ && apt-get install -y --no-install-recommends nodejs \ && rm -rf /var/lib/apt/lists/*