chore(release): версия 3.2.0 #81
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: engine | |
| # Движок на ucode: юнит-тесты (на каждый PR/push) + сборка пакета через OpenWrt SDK. | |
| # | |
| # Юнит-тесты — чистая логика, гоняются за секунды, но нужен интерпретатор ucode (в CI его нет | |
| # готового — собираем из исходников, кэшируем). | |
| # Сборка пакета через SDK — ручная/по тегу (матрица arch, package-build ниже); реальная установка | |
| # и data-plane проверяются в CI отдельно — см. qemu-smoke/qemu-install в test.yml. | |
| on: | |
| push: | |
| branches: [master] | |
| tags: ['v*'] | |
| pull_request: | |
| workflow_dispatch: | |
| jobs: | |
| # ── Юнит-тесты движка (ucode) — быстрые, на каждый PR/push ─────────────────── | |
| engine-tests: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| # ucode собирается из исходников (рецепт — engine/routing/tests/README.md). Кэшируем | |
| # ~/.local, чтобы не пересобирать каждый прогон. | |
| - name: Cache ucode toolchain | |
| id: cache-ucode | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.local | |
| key: ucode-toolchain-${{ runner.os }}-v1 | |
| - name: Install build deps | |
| if: steps.cache-ucode.outputs.cache-hit != 'true' | |
| run: | | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends \ | |
| build-essential cmake pkg-config git | |
| - name: Build ucode (json-c + ucode, без UCI/UBUS — тесты чистые) | |
| if: steps.cache-ucode.outputs.cache-hit != 'true' | |
| run: | | |
| set -eu | |
| PREFIX="$HOME/.local" | |
| git clone --depth 1 https://github.com/json-c/json-c | |
| ( cd json-c && mkdir build && cd build && \ | |
| cmake -DCMAKE_INSTALL_PREFIX="$PREFIX" -DBUILD_SHARED_LIBS=ON \ | |
| -DCMAKE_C_FLAGS="-Wno-error" .. && \ | |
| make -j"$(nproc)" install ) | |
| git clone --depth 1 https://github.com/jow-/ucode | |
| ( cd ucode && mkdir build && cd build && \ | |
| cmake -DCMAKE_INSTALL_PREFIX="$PREFIX" -DCMAKE_PREFIX_PATH="$PREFIX" \ | |
| -DUBUS_SUPPORT=OFF -DUCI_SUPPORT=OFF -DRTNL_SUPPORT=OFF -DNL80211_SUPPORT=OFF \ | |
| -DCMAKE_C_FLAGS="-Wno-error" .. && \ | |
| make -j"$(nproc)" install ) | |
| - name: Run engine unit tests | |
| run: | | |
| export PATH="$HOME/.local/bin:$PATH" | |
| export LD_LIBRARY_PATH="$HOME/.local/lib:${LD_LIBRARY_PATH:-}" | |
| ucode -e 'print("ucode ok\n")' | |
| make test-engine | |
| # ── T2.5: ПОВЕДЕНИЕ split-routing в netns (форвард-путь) ───────────────────── | |
| # Герметичная проверка, что трафик реально разделяется и kill-switch не пускает утечку: | |
| # client→router→{wan,tun} в rootless-namespace, гоняем РЕАЛЬНЫЙ вывод движка и наблюдаем | |
| # egress через nft-счётчики. Быстро (секунды), на каждый PR/push. Нужен ucode (из кэша | |
| # engine-tests) + nft/ip/dnsmasq/резолвер. NETNS_REQUIRE=1 → нехватка инструментов = ФЕЙЛ. | |
| netns-dataplane: | |
| runs-on: ubuntu-latest | |
| needs: engine-tests | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Restore ucode toolchain (собран в engine-tests) | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.local | |
| key: ucode-toolchain-${{ runner.os }}-v1 | |
| - name: Install netns/data-plane deps | |
| run: | | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends \ | |
| nftables iproute2 dnsmasq bind9-dnsutils | |
| - name: Разрешить unprivileged user namespaces (AppArmor на Ubuntu 24.04) | |
| run: | | |
| # ubuntu-latest (24.04) по умолчанию режет unprivileged userns → unshare -rn падает. | |
| # Документированный workaround; на старых ядрах ключа нет — || true. | |
| sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0 || true | |
| - name: T2.5 — поведение split-routing (форвард-путь, kill-switch, dnsmasq→nftset) | |
| run: | | |
| export PATH="$HOME/.local/bin:$PATH" | |
| export LD_LIBRARY_PATH="$HOME/.local/lib:${LD_LIBRARY_PATH:-}" | |
| ucode -e 'print("ucode ok\n")' | |
| # ПОД SUDO — иначе сценарий membership не проверяется НИКОГДА: rootless-namespace | |
| # запрещает setgroups, а dnsmasq при сбросе привилегий вызывает его вместе с setgid, | |
| # поэтому просто не стартует («failed to change group-id» — месяц читалось как | |
| # «dnsmasq не умеет nftset»). Под настоящим root скрипт берёт `unshare -n` без userns. | |
| # PATH/LD_LIBRARY_PATH передаём явно: sudo их сбрасывает, а ucode лежит в ~/.local. | |
| sudo env "PATH=$PATH" "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" \ | |
| NETNS_REQUIRE=1 make test-netns | |
| # ── Сборка пакета через OpenWrt SDK (матрица arch) ────────────────────────── | |
| # Ручная/по тегу. Реальная установка и data-plane проверяются в QEMU (qemu-install в | |
| # test.yml); здесь — только что пакет собирается под каждую arch. | |
| package-build: | |
| if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/') | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| arch: | |
| - x86_64 | |
| - aarch64_generic | |
| - mipsel_24kc | |
| - arm_cortex-a9_neon | |
| steps: | |
| - uses: actions/checkout@v4 | |
| # Официальный SDK-экшен OpenWrt: монтирует репозиторий как feed и собирает пакет под arch. | |
| - name: Build cheburnet via OpenWrt SDK | |
| uses: openwrt/gh-action-sdk@797d0e3d0eb13b355c3447f60d0179d4b43089e2 | |
| env: | |
| ARCH: ${{ matrix.arch }} | |
| FEEDNAME: cheburnet | |
| PACKAGES: cheburnet | |
| V: s | |
| - name: Upload .apk/.ipk artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: cheburnet-${{ matrix.arch }} | |
| path: | | |
| bin/packages/*/cheburnet/*.apk | |
| bin/packages/*/cheburnet/*.ipk | |
| if-no-files-found: warn | |
| retention-days: 7 |