-
Notifications
You must be signed in to change notification settings - Fork 1
140 lines (125 loc) · 6.77 KB
/
Copy pathengine.yml
File metadata and controls
140 lines (125 loc) · 6.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
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