Skip to content

chore(release): версия 3.2.0 #82

chore(release): версия 3.2.0

chore(release): версия 3.2.0 #82

Workflow file for this run

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