Files
MeshCore-Solo/.github/workflows/build-solo-firmwares.yml
T
JakubandClaude Opus 5 6d667d8bca fix(release): publish ESP32 solo binaries, add screenshot to Heltec envs
The solo release job only attached *.uf2 and *.zip, which covered every solo
board back when they were all nRF52. The Heltec V3/V4 .bin images were built
and then silently dropped, so tagging a release produced nothing downloadable
for those two boards.

Releases now carry a single -merged.bin per ESP32 board (bootloader +
partition table + app at 0x0). build.sh also writes an app-only .bin, but
that one needs offset 0x10000 and a bootloader already on the chip, so it's
deleted before upload rather than shipped next to the merged image — flashing
it at 0x0 looks exactly like a bricked device.

Also adds -D ENABLE_SCREENSHOT to both Heltec solo envs. Every other solo env
already had it, so Solo Tools couldn't capture these two boards' displays and
the README's "no special build flags required" was untrue for them. Both envs
rebuilt clean (V3: RAM 58.8%, Flash 43.2%).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 19:21:12 +02:00

108 lines
3.2 KiB
YAML

name: Build Solo Firmwares
permissions:
contents: write
on:
workflow_dispatch:
push:
tags:
- 'v*'
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
get-solo-envs:
runs-on: ubuntu-latest
outputs:
envs: ${{ steps.list-envs.outputs.envs }}
steps:
- name: Clone Repo
uses: actions/checkout@v4
- name: List solo_dual envs
id: list-envs
run: |
envs=$(grep -rh '^\[env:' platformio.ini variants/ \
| sed 's/\[env://;s/\]//' \
| grep '_solo_dual$' \
| jq -R -s -c 'split("\n") | map(select(length > 0))')
echo "envs=$envs" >> $GITHUB_OUTPUT
build:
needs: get-solo-envs
runs-on: ubuntu-latest
strategy:
matrix:
env: ${{ fromJson(needs.get-solo-envs.outputs.envs) }}
steps:
- name: Clone Repo
uses: actions/checkout@v4
- name: Setup Build Environment
uses: ./.github/actions/setup-build-environment
- name: Resolve build version
run: |
if [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "BUILD_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV
else
echo "BUILD_VERSION=dev-$(git rev-parse --short HEAD)" >> $GITHUB_ENV
fi
- name: Build Firmware
env:
FIRMWARE_VERSION: ${{ env.BUILD_VERSION }}
run: /usr/bin/env bash build.sh build-firmware ${{ matrix.env }}
- name: Rename firmware
run: |
DEVICE_NAME=$(echo "${{ matrix.env }}" | sed 's/_solo_dual$//;s/_companion$//' | tr '_' '-')
mv out/*.uf2 "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}.uf2" 2>/dev/null || true
# nRF52 DFU package (adafruit-nrfutil) — used for OTA / BLE-DFU updates.
mv out/*.zip "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}-ota.zip" 2>/dev/null || true
# ESP32 boards produce .bin instead of .uf2. Only the merged image
# (bootloader + partitions + app, flashed at 0x0) is published: build.sh also
# writes an app-only .bin, but that one needs offset 0x10000 and a bootloader
# already on the chip, so shipping it next to the merged image would only
# invite bricked-looking flashes. Anyone who wants it can build it locally.
mv out/${{ matrix.env }}-*-merged.bin "out/solo-${{ env.BUILD_VERSION }}-${DEVICE_NAME}-merged.bin" 2>/dev/null || true
rm -f out/${{ matrix.env }}-*.bin
- name: Upload Firmware
uses: actions/upload-artifact@v4
with:
name: solo-${{ matrix.env }}-firmware
path: out
release:
needs: build
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Extract Version from Git Tag
run: echo "GIT_TAG_VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV
- name: Download all solo firmwares
uses: actions/download-artifact@v4
with:
pattern: solo-*-firmware
merge-multiple: true
path: out
- name: Create Release
uses: softprops/action-gh-release@v2
with:
name: Solo ${{ env.GIT_TAG_VERSION }}
body: ""
draft: true
files: |
out/*.uf2
out/*.zip
out/*-merged.bin