From a4c6b960a82bda4c95ea197a8f214accd376a5e2 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 13 Sep 2026 09:41:02 +0300 Subject: [PATCH] =?UTF-8?q?:white=5Fcheck=5Fmark:=20test(updates):=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=20=D1=81=D0=BE=D0=B1=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D0=BE=D0=B3=D0=BE=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=B0=20=D0=BE=D0=B1=D1=8F=D0=B7=D0=B0=D0=BD?= =?UTF-8?q?=20=D0=BF=D0=BE=D0=B4=D0=BC=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20?= =?UTF-8?q?=D0=B2=D1=85=D0=BE=D0=B4=D0=BD=D1=83=D1=8E=20=D1=82=D0=BE=D1=87?= =?UTF-8?q?=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ошибка прожила три релиза именно потому, что её нечем было поймать: сценарий выглядел правильно, а Docker молча передавал имя команды аргументом в цикл ожидания. Тест разбирает оба сценария updater'а и требует --entrypoint у каждого запуска $SELF_IMAGE. Co-Authored-By: Claude Opus 5 --- tests/cli/test_updater_scripts.py | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 tests/cli/test_updater_scripts.py diff --git a/tests/cli/test_updater_scripts.py b/tests/cli/test_updater_scripts.py new file mode 100644 index 0000000..a380b9b --- /dev/null +++ b/tests/cli/test_updater_scripts.py @@ -0,0 +1,54 @@ +"""Сценарии updater'а запускают вспомогательные контейнеры, а не себя же. + +У образа updater'а входная точка — сценарий ожидания запросов +(`deploy/docker/updater.Dockerfile`). Поэтому `docker run <образ> команда` не +выполняет команду: её имя уходит аргументом в тот же цикл ожидания. Так и +случилось в 1.5.0–1.6.1 — помощник установки поднимался без compose-меток, +уходил в вечный sleep и никогда не дописывал статус, а интерфейс бесконечно +показывал «установка идёт». + +Тест держит свойство: каждый запуск собственного образа подменяет входную точку. +""" + +from __future__ import annotations + +from pathlib import Path + +import pytest + +REPO_ROOT = Path(__file__).resolve().parents[2] +UPDATER_DIR = REPO_ROOT / "deploy" / "updater" +SCRIPTS = ("chatballs-updater.sh", "chatballs-updater-apply.sh") + + +def logical_lines(text: str) -> list[str]: + """Склеить продолжения строк: команда `docker run` занимает их десяток.""" + + lines: list[str] = [] + buffer = "" + for line in text.splitlines(): + buffer += line + if buffer.endswith("\\"): + buffer = buffer[:-1] + " " + continue + lines.append(buffer) + buffer = "" + if buffer: + lines.append(buffer) + return lines + + +@pytest.mark.parametrize("name", SCRIPTS) +def test_own_image_is_started_with_explicit_entrypoint(name: str) -> None: + text = (UPDATER_DIR / name).read_text(encoding="utf-8") + runs = [ + line + for line in logical_lines(text) + if "docker run" in line and "$SELF_IMAGE" in line + ] + assert runs, f"{name}: не найден запуск собственного образа" + for run in runs: + assert "--entrypoint" in run, ( + f"{name}: запуск собственного образа без --entrypoint — " + f"команда уйдёт аргументом в цикл ожидания:\n{run}" + )