Files
Pluto-SDR/.gitea/workflows/04-cross-build.yml
Maxim a4eab6296e ci: offline-тесты на Gitea runner (smoke/guardrails/gftest/cross-build)
Четыре workflow по образу и подобию runner-tests/examples, уровень C:
- 01-smoke — runner жив, какие инструменты/либы есть в образе
- 02-guardrails — grep-страж жёстких правил CLAUDE.md (rate 1920000,
  header_len=12 на TX и RX, только local:, static/ARM-флаги, нет тяжёлых
  зависимостей); логика в scripts/ci_guardrails.sh, гоняется и локально
- 03-gftest — make gftest: нативная (не кросс-) сборка group_fec.c
  с -DGF_SELFTEST, 774 400 кейсов GF(256)
- 04-cross-build — make check-env && make all под armhf; приёмка
  ARM-тулчейна проверяется реальной компиляцией + разбором e_machine
  из ELF-заголовка (od), а не command -v — на Alpine/musl наличие
  файла ничего не доказывает, если это glibc-бинарь без ld-linux

E2E по радио и деплой на платы сознательно вне CI — нужны две живые
Pluto-платы, это остаётся ручным чек-листом (scripts/test_file_link.sh).
2026-07-15 10:32:38 +03:00

104 lines
4.8 KiB
YAML
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.

# 04-cross-build — проверочный workflow. Приёмочный тест ARM-тулчейна в
# образе runner: пока он не заведён — job закономерно красный, и это его
# основная роль (по аналогии с их 04-toolchain).
#
# arm-linux-gnueabihf-gcc и статические либы $XARM собраны под glibc
# (build_deps.sh гоняется на Debian), а базовый образ act_runner — Alpine/
# musl. glibc-хостовый cross-gcc на musl не запустится вовсе, либо запустится,
# но даст бинарь, слинкованный не тем, чем ожидается — поэтому "файл лежит"
# и "command -v нашёл" ничего не доказывают (см. RUNNER-IMAGE.md про
# обманчивый "not found" без ld-linux). Доказательство здесь только одно:
# реальная кросс-компиляция крошечной программы + проверка машинного типа
# результата по ELF-заголовку (e_machine == EM_ARM), а затем настоящая
# сборка tx/rx/bench штатным make all.
name: 04-cross-build
on:
push:
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
defaults:
run:
shell: bash
jobs:
cross-build:
runs-on: host
timeout-minutes: 15
steps:
- name: Проверить кросс-тулчейн (реальная ARM-компиляция, не command -v)
run: |
if ! command -v arm-linux-gnueabihf-gcc >/dev/null 2>&1; then
echo "ОШИБКА: arm-linux-gnueabihf-gcc нет в образе runner."
echo "Нужен отдельный flavor образа (Debian-база с gcc-arm-linux-gnueabihf"
echo "или Alpine + релокейтный prebuilt-тулчейн) — см. план в docs/."
exit 1
fi
tmp=$(mktemp -d)
printf 'int main(void){return 0;}\n' > "$tmp/hello.c"
if ! arm-linux-gnueabihf-gcc -static -o "$tmp/hello" "$tmp/hello.c" 2>"$tmp/err.log"; then
echo "ОШИБКА: arm-linux-gnueabihf-gcc не смог собрать даже hello world."
echo "Типичная причина на Alpine/musl: сам gcc — glibc-бинарь без ld-linux."
cat "$tmp/err.log"
rm -rf "$tmp"
exit 1
fi
# e_machine — байты 18-19 ELF-заголовка (little-endian uint16).
# EM_ARM = 0x0028 → байты "28 00".
machine=$(od -An -tx1 -j 18 -N 2 "$tmp/hello" | tr -d ' \n')
if [ "$machine" != "2800" ]; then
echo "ОШИБКА: результат не ARM (e_machine=0x$machine, ожидали 0x0028)."
echo "Тулчейн собирает не под ту архитектуру — заведён неверный flavor образа."
rm -rf "$tmp"
exit 1
fi
echo "OK: arm-linux-gnueabihf-gcc реально собрал ARM-бинарь (e_machine=0x$machine)"
rm -rf "$tmp"
- name: Получить код репозитория
env:
REPO_TOKEN: ${{ github.token }}
run: |
rm -rf repo
git clone --quiet "http://x-access-token:${REPO_TOKEN}@localhost:3000/${GITHUB_REPOSITORY}.git" repo
git -C repo checkout --quiet "$GITHUB_SHA"
- name: make check-env ($XARM статические либы)
run: make -C repo check-env
- name: make all (transmitter, receiver, ofdm_bench под armhf)
run: |
make -C repo all 2>&1 | tee /tmp/build.log
echo ""
echo "=== Проверка архитектуры собранных бинарников ==="
for bin in transmitter receiver ofdm_bench; do
machine=$(od -An -tx1 -j 18 -N 2 "repo/build/$bin" | tr -d ' \n')
if [ "$machine" != "2800" ]; then
echo "ОШИБКА: repo/build/$bin не ARM (e_machine=0x$machine)"
exit 1
fi
echo " [OK] $bin — ARM-бинарь (e_machine=0x$machine)"
done
- name: Нет предупреждений компилятора (-Wall -Wextra уже в CFLAGS)
run: |
if grep -q "warning:" /tmp/build.log; then
echo "ОШИБКА: сборка прошла с предупреждениями:"
grep "warning:" /tmp/build.log
exit 1
fi
echo "OK: предупреждений нет"
- name: Убрать за собой
if: always()
run: rm -rf repo /tmp/build.log