chore(release): версия 3.2.0 #142
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: test | |
| on: | |
| push: | |
| branches: [master] | |
| pull_request: | |
| # Ранний сигнал о поломках upstream: раз в неделю гоняем smoke на rolling snapshot | |
| # (см. job qemu-snapshot-canary). Понедельник, 04:00 UTC. | |
| schedule: | |
| - cron: '0 4 * * 1' | |
| # Ручной запуск из вкладки Actions — для отладки QEMU-job'ов и release-gates. | |
| workflow_dispatch: | |
| jobs: | |
| # ── Веб-мастер: юниты (vitest) + e2e (playwright против герметичного мок-роутера) ── | |
| # e2e гоняют СОБРАННЫЙ бандл из package/files/web — ловят и поломку сборки в пакете. | |
| # Сеть нужна только npm ci и chromium; сами тесты герметичны. ~3 мин. | |
| web: | |
| if: github.event_name != 'schedule' | |
| runs-on: ubuntu-latest | |
| defaults: | |
| run: | |
| working-directory: web | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-node@v4 | |
| with: | |
| node-version: 22 | |
| cache: npm | |
| cache-dependency-path: web/package-lock.json | |
| - name: Install deps | |
| run: npm ci | |
| - name: Unit tests (vitest) | |
| run: npm test | |
| - name: Install Playwright chromium | |
| run: npx playwright install --with-deps chromium | |
| - name: E2E (playwright + mock-router) | |
| run: npx playwright test | |
| # ── T3a: hermetic VM smoke ДВИЖКА (ucode) ───────────────────────────── | |
| # Главный «живой» гейт: ucode-handler через rpcd, 13 ubus-методов, граница | |
| # доверия, NAT-зона + nft + teardown на реальном fw4, rootpass + session.login. | |
| # Интернет НЕ нужен (движок кладётся через ssh+cat, apk не зовётся). ~2 мин с KVM. | |
| qemu-smoke: | |
| if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install QEMU + ncat | |
| run: | | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends \ | |
| qemu-system-x86 qemu-utils ncat python3 | |
| qemu-system-x86_64 --version | head -1 | |
| - name: Enable KVM access | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| ls -l /dev/kvm 2>/dev/null || echo "(KVM недоступен — ожидаем TCG-fallback)" | |
| - name: T3a — hermetic VM smoke движка | |
| run: make qemu-smoke | |
| - name: Upload serial-лог при падении | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: qemu-smoke-serial-log | |
| path: tests/qemu/.work/serial.log | |
| retention-days: 7 | |
| # ── T3c: install зависимостей через apk + data-plane против РЕАЛЬНЫХ сервисов | |
| # Единственная проверка DEPENDS пакета и DoH/DNS-провайдера на живом | |
| # https-dns-proxy. Нужен интернет (apk update/add). Release-gate, не PR-gate. | |
| qemu-install: | |
| if: github.event_name == 'push' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| needs: qemu-smoke | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install QEMU + ncat | |
| run: | | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends \ | |
| qemu-system-x86 qemu-utils ncat python3 | |
| qemu-system-x86_64 --version | head -1 | |
| - name: Enable KVM access | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| ls -l /dev/kvm 2>/dev/null || echo "(KVM недоступен — ожидаем TCG-fallback)" | |
| - name: T3c — DEPENDS + data-plane на реальных сервисах | |
| run: make qemu-install | |
| - name: Upload install-лог при падении | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: qemu-install-logs | |
| path: | | |
| tests/qemu/.work/serial.log | |
| /tmp/install-test*.log | |
| retention-days: 7 | |
| # ── Канарейка на rolling snapshot: ранний сигнал, НЕ гейт ──────────────────── | |
| # Основные тесты гоняются на пинованном РЕЛИЗЕ (см. шапку tests/qemu/lib.sh) — это то, | |
| # что стоит у пользователей, и пин там не протухает. Но снапшот показывает будущее: | |
| # поломку apk-tools/dnsmasq/netifd видно за месяцы до релиза. Поэтому раз в неделю | |
| # гоняем smoke на снапшоте с `continue-on-error` — красная канарейка это ЗАДАЧА | |
| # разобраться, а не блок релиза (раньше именно она и роняла master в случайный момент). | |
| qemu-snapshot-canary: | |
| if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-latest | |
| continue-on-error: true | |
| timeout-minutes: 20 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Install QEMU + ncat | |
| run: | | |
| sudo apt-get update -qq | |
| sudo apt-get install -y --no-install-recommends \ | |
| qemu-system-x86 qemu-utils ncat python3 | |
| - name: Enable KVM access | |
| run: | | |
| echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \ | |
| | sudo tee /etc/udev/rules.d/99-kvm4all.rules | |
| sudo udevadm control --reload-rules | |
| sudo udevadm trigger --name-match=kvm | |
| # Пин снапшота брать неоткуда — он меняется ежедневно. Берём текущий хеш из | |
| # upstream-файла sha256sums: проверка целостности остаётся (скачанное сверяется с | |
| # тем, что заявил upstream), а «вечного» пина здесь и не может быть по определению. | |
| # Если снапшот пересоберётся между этими двумя шагами — канарейка честно покраснеет. | |
| - name: Текущий snapshot из upstream sha256sums | |
| id: snap | |
| run: | | |
| set -eu | |
| BASE=https://downloads.openwrt.org/snapshots/targets/x86/64 | |
| IMG=openwrt-x86-64-generic-ext4-combined.img.gz | |
| SHA="$(curl -fsSL "$BASE/sha256sums" | awk -v f="*$IMG" '$2 == f { print $1 }')" | |
| [ -n "$SHA" ] || { echo "::error::$IMG не найден в upstream sha256sums"; exit 1; } | |
| echo "url=$BASE/$IMG" >> "$GITHUB_OUTPUT" | |
| echo "sha=$SHA" >> "$GITHUB_OUTPUT" | |
| echo "snapshot: $SHA" | |
| - name: T3a smoke на snapshot (ранний сигнал) | |
| env: | |
| OPENWRT_VERSION: snapshot | |
| IMG_URL: ${{ steps.snap.outputs.url }} | |
| IMG_SHA256: ${{ steps.snap.outputs.sha }} | |
| run: make qemu-smoke | |
| - name: Upload serial-лог при падении | |
| if: failure() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: qemu-snapshot-canary-serial-log | |
| path: tests/qemu/.work/serial.log | |
| retention-days: 7 |