Files
MeshCore/ci/build-firmwares.sh
T

120 lines
4.8 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 ]]