#!/usr/bin/env bash # # Сборка выбранных прошивок через build.sh — тот же путь, что и при локальной сборке, # поэтому CI не дублирует логику (версия, merge-bin, uf2, каталог out/). # Скрипт годится и для запуска руками на VPS или локально. # # Переменные окружения: # TARGETS список env через запятую (перебивает набор по умолчанию) # MATCH подстрока имени env — собрать все подходящие (регистронезависимо) # FIRMWARE_VERSION версия прошивки (по умолчанию ci) # OUT_DIR каталог артефактов (по умолчанию out, его использует build.sh) # # Примеры: # bash ci/build-firmwares.sh # TARGETS="Heltec_t096_companion_radio_ble,ProMicro_companion_radio_ble" bash ci/build-firmwares.sh # MATCH=heltec_t096 FIRMWARE_VERSION=v1.2.3 bash ci/build-firmwares.sh # # Один упавший env не отменяет остальные: в конце печатается список несобравшихся, # и скрипт возвращает ненулевой код, чтобы CI пометил сборку красной. set -uo pipefail cd "$(dirname "${BASH_SOURCE[0]}")/.." # На Windows в Git Bash команда python3 — это заглушка Microsoft Store, из-за которой # build.sh не может определить платформу env. Если PYTHON3 задан, подставляем рабочий # интерпретатор (нужен и самому скрипту, и вызываемому build.sh): # PYTHON3=/c/Espressif/tools/python/python.exe bash ci/build-firmwares.sh if [[ -n "${PYTHON3:-}" ]]; then python3() { "$PYTHON3" "$@"; } export -f python3 fi # Набор по умолчанию — устройства этого форка. DEFAULT_TARGETS=( # companion Heltec_t096_companion_radio_ble ProMicro_companion_radio_ble ProMicro_SH1106_companion_radio_ble Heltec_v3_companion_radio_ble heltec_v4_tft_companion_radio_ble heltec_tracker_v2_companion_radio_ble LilyGo_TDeck_companion_radio_ble LilyGo_T-Echo_Card_companion_radio_ble Heltec_t114_companion_radio_ble Heltec_T190_companion_radio_ble_ ThinkNode_M9_companion_radio_ble_ Meshadventurer_sx1262_companion_radio_ble Meshadventurer_sx1262_e22p_868m30s_companion_radio_ble Meshadventurer_e22p_433m30s_companion_radio_ble # repeater / room server / sensor Heltec_t096_repeater Heltec_t096_room_server Heltec_t096_sensor ProMicro_repeater ProMicro_room_server ) export FIRMWARE_VERSION="${FIRMWARE_VERSION:-ci}" OUT_DIR="${OUT_DIR:-out}" DIST_DIR="${DIST_DIR:-dist}" # накопитель: build.sh чистит out/ на каждом запуске mkdir -p "$OUT_DIR" rm -rf "$DIST_DIR" mkdir -p "$DIST_DIR" targets=() if [[ -n "${MATCH:-}" ]]; then # список env берём тем же способом, что и build.sh list while IFS= read -r env; do [[ -n "$env" ]] && targets+=("$env") done < <(bash build.sh list | grep -i -- "$MATCH" || true) elif [[ -n "${TARGETS:-}" ]]; then IFS=',' read -r -a parts <<< "$TARGETS" for part in "${parts[@]}"; do part="$(printf '%s' "$part" | xargs)" [[ -n "$part" ]] && targets+=("$part") done else targets=("${DEFAULT_TARGETS[@]}") fi if [[ ${#targets[@]} -eq 0 ]]; then echo "Нечего собирать: проверьте TARGETS/MATCH" >&2 exit 1 fi echo "Версия прошивки: $FIRMWARE_VERSION" echo "К сборке: ${#targets[@]}" printf ' %s\n' "${targets[@]}" failed=() for env in "${targets[@]}"; do echo echo "===== $env =====" if bash build.sh build-firmware "$env"; then echo "----- $env: OK" # build.sh в начале своей работы делает `rm -rf out`, поэтому файлы каждой # следующей платы затирают предыдущие: копим их в отдельном каталоге cp -f "$OUT_DIR"/* "$DIST_DIR"/ 2>/dev/null || true else echo "----- $env: ОШИБКА" failed+=("$env") fi done # возвращаем накопленное в привычный out/ (его читают CI-артефакты и скрипты) mkdir -p "$OUT_DIR" cp -f "$DIST_DIR"/* "$OUT_DIR"/ 2>/dev/null || true echo echo "===== итог =====" echo "собрано ${#targets[@]} - ${#failed[@]} ошибок" if [[ ${#failed[@]} -gt 0 ]]; then printf 'не собрались: %s\n' "${failed[@]}" fi echo "артефакты в $OUT_DIR:" ls -1 "$OUT_DIR" 2>/dev/null || echo " (пусто)" [[ ${#failed[@]} -eq 0 ]]