docs: описать offline CI (два runner'а, что тестируется, нюансы)

This commit is contained in:
Maxim
2026-07-15 13:45:29 +03:00
parent 738fd4a19c
commit d0babf2041
3 changed files with 232 additions and 6 deletions

View File

@@ -54,20 +54,28 @@ PHY: OFDM (liquid-dsp) + RS(255,223) FEC. Весь сигнальный трак
pluto-link/
├── README.md # этот файл
├── CLAUDE.md # краткие правила для Claude Code
├── makefile # цели: all, tx, rx, bench, deploy, clean
├── makefile # цели: all, tx, rx, bench, gftest, deploy, clean
├── toolchain.env # CROSS=arm-linux-gnueabihf-, SYSROOT=$HOME/xarm
├── .gitea/workflows/ # offline CI (см. §4.5, docs/CI.md)
│ ├── 01-smoke.yml # runner жив, что есть в образе
│ ├── 02-guardrails.yml # grep-страж жёстких правил CLAUDE.md
│ ├── 03-gftest.yml # юнит-тест group-FEC (774 400 кейсов)
│ └── 04-cross-build.yml # приёмка ARM-тулчейна + сборка tx/rx/bench
├── src/
│ ├── common.h # параметры OFDM/RS, дефолты, прототипы
│ ├── common.c # pluto_init (local:), pluto_configure
│ ├── transmitter.c # stdin → OFDM → AD9361 TX
│ ├── receiver.c # AD9361 RX → OFDM sync → stdout
│ ├── group_fec.c # GF(256) 16+2 erasure FEC + offline self-test
│ └── ofdm_bench.c # бенчмарк CPU (не удалять!)
├── scripts/
│ ├── build_deps.sh # кросс-сборка FFTW + liquid-dsp → $HOME/xarm
│ ├── deploy.sh # scp -O бинарей в /tmp обеих плат
── test_file_link.sh # e2e: файл → эфир → md5-сверка
── test_file_link.sh # e2e: файл → эфир → md5-сверка
│ └── ci_guardrails.sh # логика 02-guardrails.yml, гоняется и локально
└── docs/
├── BENCHMARK.md # методика и результаты замеров CPU
├── CI.md # два runner'а, что тестируется, нюансы
└── NOTES.md # FDD, регуляторика, известные грабли
```
@@ -121,11 +129,16 @@ liquid молча падает на встроенный FFT (бюджет CPU
arm-linux-gnueabihf-gcc -O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=hard \
-ffast-math -static src/receiver.c src/common.c -o receiver \
-I$HOME/xarm/include -L$HOME/xarm/lib \
-lad9361 -liio -lliquid -lfec -lfftw3f -lm
-Wl,--start-group -lad9361 -liio -lliquid -lfec -lfftw3f -lm -lpthread -Wl,--end-group
```
Порядок библиотек критичен при статической линковке: зависимый идёт раньше
(`-lad9361` перед `-liio`, `-lliquid` перед `-lfec`).
Библиотеки завёрнуты в `-Wl,--start-group ... -Wl,--end-group`: у
`libad9361.a`/`libiio.a` есть циклическая зависимость символов друг на друга,
и однопроходный порядок слева направо её не всегда разрешает — компоновщику
нужно несколько проходов по кругу. Баг был не виден на бумаге и всплыл
только на реальной кросс-сборке в CI (`04-cross-build.yml`, см. §4.5); без
`--start-group`/`--end-group` `make all` изредка падает на undefined
reference в зависимости от версии тулчейна.
### 4.4 Деплой
@@ -137,6 +150,30 @@ scp -O transmitter receiver root@<pluto_B>:/tmp/ # Pluto B
rootfs Pluto живёт в RAM: `/tmp` очищается при ребуте — это нормально,
`deploy.sh` заливает заново.
### 4.5 CI / автотесты (offline Gitea Actions)
На каждый push гоняются 4 workflow на self-hosted-runner'ах сервера, без
доступа в интернет и без `actions/checkout` (Marketplace офлайн недоступен).
Два независимых runner'а: `host` (Alpine, только grep/bash-проверки) и
`armhf` (нативный x86-64 Debian-контейнер с ARM-кросс-тулчейном — **не**
эмуляция ARM, обычная кросс-компиляция).
| Workflow | Runner | Проверяет |
|---|---|---|
| `01-smoke` | `host` | runner жив, какие инструменты есть в образе |
| `02-guardrails` | `host` | grep-страж жёстких правил CLAUDE.md (§5): rate, `header_len=12`, `local:`, static-флаги |
| `03-gftest` | `armhf` | `make gftest` — 774 400 кейсов GF(256) group-FEC |
| `04-cross-build` | `armhf` | `make check-env && make all` — реальная кросс-сборка tx/rx/bench |
Локально без runner'а: `scripts/ci_guardrails.sh`, `make gftest`, `make
check-env && make all`. Полное описание архитектуры двух runner'ов,
почему это не эмуляция ARM, и разбор реальных ловушек (musl vs glibc,
group-linking из §4.3, параллелизм между runner'ами) — **`docs/CI.md`**.
Зелёные 0104 подтверждают компилируемость и статические инварианты. Они
**не** подтверждают передачу данных по эфиру — это по-прежнему ручной
чек-лист: `scripts/test_file_link.sh`, деплой, бенчмарк на плате (§8.2).
## 5. Правила кода (конституция)
1. Язык — **C**. Python/GNU Radio в тракте данных запрещены.