deploy(#21): контракт кодов netns без make, AWG_NS_EXEC_MODE в приоритете, DEV_SKIP_BUILD

Реализация замечаний ревью PR #53 (issuecomment-664):

1. tests/netns/ci.sh — точка входа для CI #17 без make: docker compose run --rm -T
   netns, код контейнера возвращается как есть (0/1/3/4; 2 — сломан вызов/нет
   docker/образа). make test-netns-ci делегирует в неё, в комментарии таргета
   зафиксировано «make → 2».
2. NETNS_EXEC_MODE ?= $(if $(AWG_NS_EXEC_MODE),$(AWG_NS_EXEC_MODE),auto) —
   документированный AWG_NS_EXEC_MODE больше не перекрывается make-алиасом.
3. DEV_SKIP_BUILD=1 → up -d --no-build; DEV_UP_BUILD переопределяем (?) —
   dev-up работает на хосте без DNS/сети для сборки.

Refs #21
Refs #56
This commit is contained in:
2026-10-28 21:57:44 +03:00
parent dbb5d1fe5c
commit e672901741
+22 -6
View File
@@ -15,8 +15,11 @@ DASH_PORT ?= 8180
NETNS_ARGS ?=
VERIFY_ARGS ?=
MANIFEST_ARGS ?=
# Режим входа в netns внутри тестового контейнера: auto|ip|nsenter (issue #56).
NETNS_EXEC_MODE ?= auto
# Режим входа в netns: auto|ip|nsenter (issue #56). Документированное имя —
# AWG_NS_EXEC_MODE (его читают lib.sh/run.sh и tests/netns/ci.sh); NETNS_EXEC_MODE —
# make-алиас. Раньше здесь стояло `?= auto`, из-за чего AWG_NS_EXEC_MODE=ip на
# `make test-netns-ci` молча игнорировался (замечание ревью #56).
NETNS_EXEC_MODE ?= $(if $(AWG_NS_EXEC_MODE),$(AWG_NS_EXEC_MODE),auto)
.PHONY: help venv lint fmt test build dev-up dev-up-app dev-up-stub dev-down dev-logs dev-verify \
dev-verify-stub dev-reset test-netns test-netns-keep test-netns-ci test-manifests lint-shell \
@@ -61,7 +64,14 @@ STUB_MODE := 1
endif
# deploy/Dockerfile приходит с задачей #18; до этого образ собирается отдельно,
# поэтому --build не форсируем, если Dockerfile отсутствует в дереве.
DEV_UP_BUILD := $(if $(wildcard deploy/Dockerfile),--build,)
# После мержа #18 файл есть → --build обязателен, но не всегда возможен: на
# стенд-хосте нет DNS/сети для pull базового образа. Явные кнобы:
# make dev-up DEV_SKIP_BUILD=1 → up -d --no-build (использовать готовый образ)
# make dev-up DEV_UP_BUILD= → вообще не передавать флаги сборки
DEV_UP_BUILD ?= $(if $(wildcard deploy/Dockerfile),--build,)
ifeq ($(DEV_SKIP_BUILD),1)
DEV_UP_BUILD := --no-build
endif
DEV_ENV := AWG_DASH_PORT=$(DASH_PORT) AWG_DASH_HOST_DIR=$(HOST_DIR)
DEV_VERIFY_ARGS := $(if $(filter 1,$(STUB_MODE)),--stub,)
@@ -111,10 +121,16 @@ test-netns-keep:
# Тот же стенд в привилегированном контейнере — путь для CI (#17).
# Внутри контейнера `ip netns exec` падает с "mount of /sys failed: Operation
# not permitted" (iproute2 6.x), поэтому харнесс сам переключается на
# `nsenter --net=/var/run/netns/<ns>` (issue #56). AWG_NS_EXEC_MODE форсирует
# режим: ip|nsenter|auto.
# `nsenter --net=/var/run/netns/<ns>` (issue #56). Режим задаётся
# AWG_NS_EXEC_MODE=ip|nsenter|auto (make-алиас — NETNS_EXEC_MODE).
#
# ВАЖНО: make возвращает 2 на любой упавший рецепт, поэтому контракт кодов
# 0/1/3/4 через этот таргет НЕ виден (см. deploy/VERIFICATION-21.md §6.1).
# В пайплайне #17 используйте точку входа без make:
# bash tests/netns/ci.sh # те же 0/1/3/4, что отдаёт контейнер
test-netns-ci:
AWG_DASH_IMAGE=$(IMAGE) AWG_NS_EXEC_MODE=$(NETNS_EXEC_MODE) $(COMPOSE) -f $(COMPOSE_TEST) run --rm netns
@test -d tests/netns || { echo 'tests/netns ещё нет — задача #21'; exit 1; }
AWG_DASH_IMAGE=$(IMAGE) AWG_NS_EXEC_MODE=$(NETNS_EXEC_MODE) bash tests/netns/ci.sh $(NETNS_ARGS)
# --- статические проверки манифестов и скриптов ------------------------------
test-manifests: