gitea-actions: add PlatformIO CI image for Arduino-framework ESP32 builds

New opt-in job image localhost/gitea-ci-platformio:7.0.1 (pattern matches the
ESP-IDF image): PlatformIO core 6.1.19 with the espressif32@7.0.1 platform,
xtensa toolchain and Arduino framework pre-baked via a seed project so
ephemeral job containers download nothing. First consumer is
Skudak/esp32-web-interface.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bastian de Byl
2026-07-14 16:59:57 -04:00
parent 5588e81fb0
commit 9dfa812a80
3 changed files with 58 additions and 0 deletions
@@ -28,6 +28,12 @@ gitea_ci_image: localhost/gitea-ci:latest
# ESP-IDF firmware image tag tracks the upstream espressif/idf release we build from.
esp_idf_version: v5.4.1
gitea_ci_espidf_image: "localhost/gitea-ci-espidf:{{ esp_idf_version }}"
# PlatformIO image for Arduino-framework ESP32 builds (esp32-web-interface).
# Tag tracks the pre-baked espressif32 platform version; both pins match the
# hardware-validated local build.
platformio_core_version: "6.1.19"
pio_espressif32_version: "7.0.1"
gitea_ci_platformio_image: "localhost/gitea-ci-platformio:{{ pio_espressif32_version }}"
# Default labels for every runner — map runs-on values to the local CI image.
# Firmware jobs opt into the ESP-IDF image per-job via `container:` in their workflow.
@@ -41,6 +41,16 @@
XDG_RUNTIME_DIR: "/run/user/{{ gitea_runner_uid }}"
tags: gitea-actions
- name: stage PlatformIO CI Containerfile
become: true
become_user: "{{ gitea_runner_user }}"
ansible.builtin.template:
src: Containerfile.platformio.j2
dest: "{{ gitea_runner_home }}/ci-images/Containerfile.platformio"
mode: "0644"
register: platformio_containerfile
tags: gitea-actions
- name: build ESP-IDF CI image ({{ gitea_ci_espidf_image }})
become: true
become_user: "{{ gitea_runner_user }}"
@@ -53,3 +63,16 @@
environment:
XDG_RUNTIME_DIR: "/run/user/{{ gitea_runner_uid }}"
tags: gitea-actions
- name: build PlatformIO CI image ({{ gitea_ci_platformio_image }})
become: true
become_user: "{{ gitea_runner_user }}"
containers.podman.podman_image:
name: "{{ gitea_ci_platformio_image }}"
path: "{{ gitea_runner_home }}/ci-images"
build:
file: "{{ gitea_runner_home }}/ci-images/Containerfile.platformio"
force: "{{ platformio_containerfile is changed }}"
environment:
XDG_RUNTIME_DIR: "/run/user/{{ gitea_runner_uid }}"
tags: gitea-actions
@@ -0,0 +1,29 @@
# PlatformIO firmware job image (managed by ansible: roles/gitea-actions).
# For Arduino-framework ESP32 projects (e.g. Skudak/esp32-web-interface) that
# build with PlatformIO rather than raw ESP-IDF. Node is required by
# actions/checkout and other JS actions.
# The espressif32 platform, xtensa toolchain and Arduino framework are
# pre-baked into PLATFORMIO_CORE_DIR via a throwaway seed project so ephemeral
# job containers download nothing at build time. Versions are pinned to what
# was validated on hardware — bump pio_espressif32_version /
# platformio_core_version in defaults/main.yml to upgrade (the image tag
# tracks the platform version).
FROM python:3.12-slim-bookworm
ENV PLATFORMIO_CORE_DIR=/opt/platformio
RUN apt-get update && apt-get install -y --no-install-recommends \
git curl ca-certificates unzip \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get install -y --no-install-recommends nodejs \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir platformio=={{ platformio_core_version }}
# Seed project mirroring the real projects' platformio.ini so `pio pkg install`
# pulls the platform + toolchain + framework packages into the core dir.
RUN mkdir -p /tmp/seed/src \
&& printf '[env:seed]\nplatform = espressif32@{{ pio_espressif32_version }}\nframework = arduino\nboard = esp32dev\nboard_build.filesystem = spiffs\n' > /tmp/seed/platformio.ini \
&& pio pkg install -d /tmp/seed \
&& rm -rf /tmp/seed \
&& chmod -R a+rX ${PLATFORMIO_CORE_DIR}