120 lines
4.8 KiB
Bash
120 lines
4.8 KiB
Bash
#!/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 ]]
|