- tests/unit (make test, без браузера, ~5 с): схемы и валидация, /v1/solve с подменённым движком (коды ошибок, слоты, сессии, UA и cookies профиля, маскирование секретов в логах), действия, оркестратор антибота, профиль и отпечаток - tests/browser (make test-browser, в Docker): example.com, UA один раз и замена cookies на httpbin, применение и стабильность отпечатка, прохождение Cloudflare - requirements-dev.txt, make sync-dev; Makefile вызывает pip через python -m pip (у перенесённого .venv битый shebang bin/pip) - fix: в CloudflareSolver вызов bounding_box() у неожиданной корутины — ветка без iframe всегда падала с AttributeError Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
100 lines
3.9 KiB
Makefile
100 lines
3.9 KiB
Makefile
VENV := .venv
|
|
PYTHON := $(VENV)/bin/python
|
|
PIP := $(PYTHON) -m pip
|
|
WHEELS_DIR := wheels
|
|
REQUIREMENTS := requirements.txt
|
|
ver ?= latest
|
|
|
|
MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help build release sync-dev test test-browser
|
|
PKG := $(filter-out $(MAKECMDGOALS_TARGETS),$(MAKECMDGOALS))
|
|
|
|
.PHONY: install freeze wheels sync sync-offline clean help venv build release sync-dev test test-browser
|
|
|
|
help:
|
|
@echo "make install <pkg> [<pkg> ...] - установить пакет(ы) в $(VENV), обновить $(REQUIREMENTS), собрать wheel в $(WHEELS_DIR)/"
|
|
@echo "make sync - установить все пакеты из $(REQUIREMENTS) (из индекса)"
|
|
@echo "make sync-offline - установить все пакеты из $(REQUIREMENTS) только из $(WHEELS_DIR)/, без обращения к индексу"
|
|
@echo "make freeze - перезаписать $(REQUIREMENTS) текущим состоянием окружения"
|
|
@echo "make wheels - собрать wheel для всех пакетов из $(REQUIREMENTS)"
|
|
@echo "make clean - удалить $(WHEELS_DIR)/"
|
|
@echo "make build [ver=latest] - собрать docker-образ robotex:<ver>"
|
|
@echo "make release ver=<ver> - собрать образ и пакет для деплоя в build/<ver>/ (compose, .env, образ .tar.gz)"
|
|
@echo "make sync-dev - установить зависимости для тестов (requirements-dev.txt)"
|
|
@echo "make test - юнит-тесты без браузера"
|
|
@echo "make test-browser [ver=latest] - собрать образ и прогнать сквозные тесты с Chrome в Docker (нужна сеть)"
|
|
|
|
venv:
|
|
@test -d $(VENV) || python3 -m venv $(VENV)
|
|
|
|
install: venv
|
|
ifeq ($(strip $(PKG)),)
|
|
$(error Укажите пакет: make install <package>, например make install redis)
|
|
endif
|
|
$(PIP) install --upgrade $(PKG)
|
|
$(PIP) freeze > $(REQUIREMENTS)
|
|
@mkdir -p $(WHEELS_DIR)
|
|
$(PIP) wheel $(PKG) -w $(WHEELS_DIR)
|
|
@echo "Готово: $(PKG) установлен, $(REQUIREMENTS) обновлён, wheel-пакеты в $(WHEELS_DIR)/"
|
|
|
|
sync: venv
|
|
$(PIP) install -r $(REQUIREMENTS)
|
|
|
|
sync-offline: venv
|
|
$(PIP) install --no-index --find-links=$(WHEELS_DIR) -r $(REQUIREMENTS)
|
|
|
|
freeze: venv
|
|
$(PIP) freeze > $(REQUIREMENTS)
|
|
|
|
wheels: venv
|
|
@mkdir -p $(WHEELS_DIR)
|
|
$(PIP) wheel -r $(REQUIREMENTS) -w $(WHEELS_DIR)
|
|
|
|
clean:
|
|
rm -rf $(WHEELS_DIR)
|
|
|
|
build:
|
|
@echo "build an application"
|
|
docker build -t robotex:$(ver) .
|
|
|
|
sync-dev: venv
|
|
$(PIP) install -r requirements-dev.txt
|
|
|
|
test:
|
|
$(PYTHON) -m pytest
|
|
|
|
test-browser: build
|
|
docker run --rm --shm-size=2g \
|
|
-v $(CURDIR)/tests:/app/tests:ro -v $(CURDIR)/pytest.ini:/app/pytest.ini:ro \
|
|
-v $(CURDIR)/requirements-dev.txt:/app/requirements-dev.txt:ro \
|
|
-w /app robotex:$(ver) sh -c 'pip install -q --user -r requirements-dev.txt && \
|
|
xvfb-run -a --server-args="-screen 0 1920x1080x24" python -m pytest -m browser -p no:cacheprovider -s'
|
|
|
|
RELEASE_DIR := build/$(ver)
|
|
|
|
ifneq ($(filter release,$(MAKECMDGOALS)),)
|
|
ifeq ($(ver),latest)
|
|
$(error Укажите версию: make release ver=v0.0.2)
|
|
endif
|
|
endif
|
|
|
|
release: build
|
|
@echo "make release $(ver) -> $(RELEASE_DIR)/"
|
|
@mkdir -p $(RELEASE_DIR)
|
|
sed 's|image: robotex:.*|image: robotex:$(ver)|' docker-compose.prod.yml > $(RELEASE_DIR)/docker-compose.yml
|
|
cp dot_env $(RELEASE_DIR)/.env
|
|
docker save robotex:$(ver) | gzip > $(RELEASE_DIR)/robotex-$(ver).tar.gz
|
|
@printf '%s\n' \
|
|
'# Robotex $(ver)' \
|
|
'' \
|
|
'```bash' \
|
|
'docker load -i robotex-$(ver).tar.gz' \
|
|
'docker compose up -d' \
|
|
'```' \
|
|
'' \
|
|
'Настройки (порт, CPU, память) — в .env.' > $(RELEASE_DIR)/README.md
|
|
@echo "Готово: $(RELEASE_DIR)/"
|
|
|
|
# позволяет передавать имя пакета как аргумент: make install redis
|
|
%:
|
|
@:
|