Dolt — MySQL-совместимая база, в которой тестовый прогон снимает копию продакшен-данных за миллисекунды. Без дампов, без «песочницы на сутки», без риска задеть продакшен: тесты физически не могут писать в прод.
MySQL-протокол: mysql2, ORM и обычный mysql-клиент подходят без правок.
Тесты на пустой базе проходят там, где прод падает: реальные данные — это пропущенные поля, дубли, странные кодировки и десять лет истории. Достать их в тесты обычно дороже, чем написать сами тесты.
Снапшот — это ветка с copy-on-write: новый указатель на те же данные. Не важно, 10 МБ в базе или 200 ГБ — копия появляется сразу.
Ветка привязана к сессии, поэтому тесты работают в своей копии, а продакшен продолжает писать в основную ветку и снапшота не замечает. Запись в прод для тестов запрещена.
У сервиса две рабочие базы: общая и чувствительная. Снапшоты снимаются только с общей, поэтому персональные и платёжные данные в тесты не попадают по построению.
Каждое изменение фиксируется автоматически. Можно посмотреть состояние таблицы на любой прошлый момент и понять, что было в базе, когда тест упал.
У каждого прогона свой идентификатор и своя ветка: CI-матрица, ретраи и локальные запуски не толкаются в одной базе.
Сервер говорит на MySQL: привычные драйверы, миграции и ORM работают как есть. Версионирование — сверху, а не вместо.
Тестовая учётка умеет читать прод-данные и писать только внутри снапшота — прод-ветка для неё закрыта на запись.
USE `<сервис>`;
CALL DOLT_BRANCH('test-<run-id>'); -- копия продакшен-данных на этот момент
CALL DOLT_CHECKOUT('test-<run-id>'); -- переключается только ваша сессия
-- миграции, фикстуры, проверки — всё внутри снапшота
CALL DOLT_CHECKOUT('main');
CALL DOLT_BRANCH('-D', 'test-<run-id>');
Снапшот живёт столько, сколько нужно прогону; после него ветка удаляется, и ничего не накапливается.
Пароли выдаются вместе с адресом сервиса. Каждый набор видит ровно то, что нужно его роли, и ничего больше.
Основной сервис: читает и пишет общие данные
mysql://<сервис>:…@dolt.aipika.tech:3306/<сервис>
Код, который не должен видеть ничего лишнего
mysql://<сервис>_secure:…@dolt.aipika.tech:3306/<сервис>_secure
CI, локальные запуски, ретраи
mysql://<сервис>_test:…@dolt.aipika.tech:3306/<сервис>_test
Нет. Ветка привязана к сессии: тесты видят копию данных, продакшен продолжает писать в основную ветку. Запись в прод-ветку для тестовых доступов запрещена, поэтому «случайно записали в прод» не бывает.
Мгновенно. Данные не копируются: снапшот — это второй указатель на те же блоки (copy-on-write). Время не зависит от размера базы.
Да, иначе тесты бесполезны: внутри снапшота разрешены миграции, фикстуры, CREATE/DROP TABLE,
любые изменения. Всё это остаётся в копии и исчезает вместе с ней.
Они лежат в отдельной базе чувствительных данных. Снапшоты снимаются только с общей базы, а тестовые доступы не имеют прав на чувствительную — она в тестовые прогоны не попадает вообще.
Столько, сколько нужно прогону. После тестов ветка удаляется одной командой; параллельные прогоны друг другу не мешают, потому что у каждого своя ветка.
Базы и доступы создаёт оператор сервиса: напишите, какую базу и зачем нужно. Тестовые базы под отдельные прогоны тоже выписываются по запросу.
Нет. Это MySQL-совместимый сервер: драйверы, ORM, миграции и клиенты работают как обычно. Версионирование и снапшоты — дополнительный слой, а не замена привычного SQL.
Напишите оператору — он выдаст адрес, три набора доступов и подскажет, как развести их по окружениям.
Всё, что нужно, чтобы подключиться и настроить тесты. Для агентов есть машиночитаемая версия: /AGENTS.md.
prod: mysql://<сервис>:<пароль>@dolt.aipika.tech:3306/<сервис>
prod-secure: mysql://<сервис>_secure:<пароль>@dolt.aipika.tech:3306/<сервис>_secure
test: mysql://<сервис>_test:<пароль>@dolt.aipika.tech:3306/<сервис>_test
снапшот: mysql://<сервис>_test:<пароль>@dolt.aipika.tech:3306/<сервис>
| Действие | Разрешено |
|---|---|
| читать продакшен-данные | да |
| создать и удалить ветку-снапшот, переключиться в неё | да |
| писать внутри снапшота: миграции, фикстуры, CREATE/DROP TABLE | да |
писать в прод-ветку (main) | нет |
| откатывать, сливать и коммитить прод-ветку | нет |
| удалять или переименовывать прод-ветку | нет |
cannot dolt_commit with no database selected); SELECT 1 и SHOW DATABASES
при этом работают — healthcheck не сломается.Cannot commit changes on more than one branch / database). Чтению с джойном между общей и
чувствительной базой это не мешает — нужны права prod.SELECT ... AS OF 'HEAD~5',
dolt_log, dolt_diff_<таблица>. В dolt_diff_* подставляется хэш версии,
литерал 'HEAD' там не работает.command denied и does not have the correct permissions on branch main — это
ожидаемое разделение прав, а не поломка: сверьтесь с таблицей доступов.dolt.aipika.tech:3306 — проверьте доступность хоста из своего окружения.