Кукбук · 1 из 3

Разработка и проверка

Одноразовые роутеры OpenWrt в Docker, чтобы увидеть свой пакет в работе раньше всех остальных. Нужен Docker и больше ничего.

Поднять роутер

go install owfeed.org/owlab/cmd/owlab@latest

cd my-luci-app
owlab up                  # запустить
owlab open owrt2512       # открыть LuCI в браузере

Логин root, пароль пустой. Роутер одноразовый: сломали — owlab up --rebuild.

Видеть правки без пересборки

owlab sync --watch

Копирует исходники в запущенный роутер на каждое сохранение и перезагружает LuCI. В этом цикле проходит день; сборка пакета — потом.

owlab копирует те же каталоги, что ставит luci.mk: htdocs, ucode, luasrc, root. Если пакет лежит в подкаталоге, скажите об этом:

project:
  install:
    my-package/htdocs: /www
    my-package/ucode:  /usr/share/ucode/luci
    my-package/root:   /

Держать обе линии релизов

version: 1
routers:
  - id: owrt2512
    release: "25.12.5"
  - id: owrt2410
    release: "24.10.8"

25.12 работает на apk, 24.10 на opkg, и общего у них почти нет. Пакет, который работает на одной линии, на другой может не собраться или не встать, так что открытыми стоит держать обе.

Фиксируйте точные патч-версии. Образы snapshot и фиды snapshot пересобираются каждый день и независимо друг от друга, поэтому установка начинает падать в течение суток. owlab releases покажет, какой пин отстал.

Сделать роутер обжитым

Пустой роутер почти ничего не рисует: ни зон, ни VLAN, ни аренд DHCP, ни таблиц со строками. Разрабатывать страницу против такого неудобно:

defaults:
  fixtures: [all]

По отдельности: networks, clients, wireguard, portforwards, system, wifi.

Вся проверка одной командой

owlab test --release 25.12.5 --release 24.10.8 \
  --install 'dist/*/luci-app-mine-*' \
  --assert 'http 200 /cgi-bin/luci/admin/services/mine' \
  --assert 'service mined'

Поднимает роутеры, ставит, проверяет, гасит, выходит с 0 или 1. Это же гоняет CI, и прогнать локально — способ узнать раньше, чем узнает пул-реквест.

Две вещи, которых не делает написанный руками curl. Он сначала логинится в LuCI, потому что иначе любая админская страница отвечает редиректом — из-за этого очевидная проверка рапортует 403 на совершенно живой странице. И он считает провалом 200, в теле которого страница ошибки: диспетчер LuCI ловит исключение и отдаёт 200 с трейсбеком внутри.

Полный список видов проверок: Команды и конфиг.

Когда в деле модуль ядра

routers:
  - id: real
    fidelity: vm
    release: "25.12.5"
    packages: ["+kmod-nft-nat"]

Контейнер использует ядро хоста, поэтому пакеты kmod-* ставятся и ничего не делают. fidelity: vm — это QEMU с родным ядром OpenWrt: первый старт около полутора минут, дальше секунд двадцать. Заодно появляются симулированные радиомодули, так что страницы Wi-Fi показывают роутер, а не конфиг-файл.