Компоненты
Раннер ничего не делает с базой сам: он оркестрирует чужие процессы — утилиты платформы и EDT. Здесь перечислено, из чего состоит система, кто с кем разговаривает и по какому каналу, и как раннер выбирает исполнителя на каждую операцию.
- Из чего состоит система
- Кто с кем говорит
- Цели: два адреса
- Исполнители
- Выбор исполнителя
- Что доступно по виду цели
- Внутри раннера
- Сколько живёт
Из чего состоит система
Словарь инструментов объясняет названия утилит и сервисов и отмечает, какими процессами управляет раннер.
Платформа называет пять компонентов: информационная база, клиентское приложение, сервер (кластер), СУБД и веб-сервер (51). К ним раннер добавляет утилиты, которыми с этими компонентами разговаривают, и свои собственные части.
| чьё | компонент | зачем раннеру |
|---|---|---|
| платформа | информационная база: файловая, в кластере или за автономным сервером | цель всех команд обмена (52, 60) |
| платформа | кластер серверов: ragent, rmngr, rphost, СУБД за ним | держит базу; раннер обращается к нему адресом, процессами не управляет (53) |
| платформа | автономный сервер ibsrv с прямым и SSH-шлюзами | держит базу; по прямому шлюзу принимает Конфигуратор и тонкий клиент, как кластер (65), по SSH сам исполняет агентский набор (61) |
| платформа | веб-сервер Apache или IIS с модулем расширения | публикация и адрес для веб-клиента (69) |
| платформа | клиентские приложения: тонкий, толстый, веб | тесты и запуск (66) |
| утилита | Конфигуратор в пакетном режиме | исполнитель для всех трёх видов цели (76); к автономному серверу подключается по прямому шлюзу (65) |
| утилита | Конфигуратор в режиме агента | долгоживущая сессия с машинным ответом; раннер поднимает его сам (85, разбор) |
| утилита | ibcmd | создание файловой базы, состав расширений, сборка пакета без базы, статус расхождения (72, 103, 29, 30); к СУБД базы кластера подключается напрямую по dbms только при остановленном кластере (60), не по кластерной строке Srvr=…;Ref=… |
| утилита | webinst | публикация на веб-сервере (69) |
| утилита | 1cedtcli | перевод между проектом EDT и XML, проверка проекта (107) |
| утилита | rac и сервер администрирования ras | сеансы своей базы в кластере: список, завершение, блокировка начала (56). Серверы, лицензии, профили — вне раннера. Если cluster.ras не объявлен, ras раннер поднимает сам (55) |
| раннер | командная строка | интерфейс к сценариям |
| раннер | v8project.yaml и местный слой v8project.local.yaml | что это за проект и к какой базе подключён этот каталог |
| раннер | workPath | журналы, временные файлы и то, что раннер пересчитает сам; каталог можно удалить |
| раннер | localPath | то, что без базы не пересобрать: три памяти о прошлом разе по каждой базе, стенды, которые поднял раннер, файловая база по умолчанию |
| вне раннера | система контроля версий | история, слияние, разметка конфликтов. Раннер в неё не пишет |
Как раннер устроен по осям: формат и тип исходников → операция → вид цели → исполнитель по матрице умолчаний. Первые три называет вызывающий, четвёртое решает раннер.
Кто с кем говорит
Раннер запускает утилиты у себя и подключается к цели через файлы, сетевой протокол платформы, SSH или прямой доступ к СУБД. Автономный сервер достижим двумя из них: Конфигуратор идёт в его прямой шлюз тем же протоколом, что в кластер (65), а SSH ведёт в агентский шлюз (61). При работе через кластер базу создаёт Конфигуратор, передавая кластеру реквизиты СУБД в строке создания (73). Прямой доступ ibcmd к СУБД кластерной базы допустим только после остановки всех серверных процессов кластера, которые работают с этой базой; завершения сеансов недостаточно. Раннер не останавливает кластер автоматически. Применять ibcmd или ibsrv к базе работающего кластера нельзя: это может разрушить данные (60). Консоль кластера остаётся вне раннера; к серверу администрирования он ходит только за сеансами своей базы. Здесь показан только канал администрирования; чем и откуда базу открывает человек, видно в каждом варианте отдельно.
Утилиты EDT к базе не подключаются: 1cedtcli работает только с исходниками, поэтому во всех четырнадцати расстановках он одинаков.
Четырнадцать способов расставить это по машинам — на странице Расстановки.
Цели: два адреса
У базы два адреса. По строке подключения раннер её администрирует, и по ней же базу открывают Конфигуратор, толстый и тонкий клиент. По веб-адресу её открывают веб-клиент и тот же тонкий клиент: у тонкого клиента два пути, у веб-клиента один, у толстого клиента и Конфигуратора только строка (67). Адрес вида ws=… — веб-адрес, и он не говорит, чем администрировать: за публикацией может стоять файловая база, кластер или автономный сервер.
| Цель | Строка подключения: раннер, Конфигуратор, толстый и тонкий клиент | Веб-адрес: веб-клиент и тонкий клиент |
|---|---|---|
| файловая | connection: File=… | после web publish или объявленный вручную |
| кластер 1С | connection: Srvr=…;Ref=… | после web publish или объявленный вручную |
| автономный сервер | connection: Srvr=…;Ref=… — прямой шлюз, имя базы равно --name сервера; толстого клиента он не пускает (65). Рядом standalone.gate — SSH-шлюз для агентского набора (61) | HTTP-адрес самого сервера, известен сразу |
Кластер и автономный сервер могут стоять на другой машине, и их файловая система раннеру недоступна. Поэтому workPath всегда локален, пути в командах, адресованных цели, разрешаются на её стороне, а результат с удалённой цели, которую исполнял SSH-шлюз, забирается объявленным каналом обмена, а не чтением чужого пути. Конфигуратор по сети — в кластер или в прямой шлюз — читает и пишет файлы у раннера. Режим, где раннер сам поднимает процесс, работает только с локальной точкой входа.
Следствие для диагностики: журнал платформы на стороне цели и технологический журнал сервера раннеру не видны — квитанция их не обещает.
Ключи базы здесь и ниже записаны от её секции: web.url значит infobases.<имя>.web.url. Веб-адрес живёт в web.url: у автономного сервера он известен сразу, у остальных появляется после публикации.
Исполнители
| Исполнитель | Что это | Решение по |
|---|---|---|
| Designer | процесс Конфигуратора на команду; к файловой базе — файлом, к кластеру и к прямому шлюзу автономного сервера — по сети (65) | коду выхода и появлению артефакта |
| agent | агентский shell по SSH: Конфигуратор в режиме агента или шлюз ibsrv; у шлюза набор команд урезан (61). У файловой базы и кластера такой точки входа нет: Конфигуратор в агентском режиме поднимает сам раннер, поэтому платформа нужна на его машине | JSON: type и закрытый error-type |
| ibcmd | утилита платформы; у автономного сервера ведёт только сеансы | коду выхода и машинному выводу |
| ibcmd-rs | конвертер XML ↔ CF без платформы | коду выхода |
| webinst | публикация базы на Apache или IIS | коду выхода и появлению публикации |
Проза инструмента никогда не решает — только переносится как улика.
Выбор исполнителя
- Умолчания заданы нами и живут в коде — матрица
(операция, цель) → цепочка. - Раннер берёт первого готового в этом окружении.
providers.<операция>в конфиге переопределяет жёстко: неготовый — отказ, без отката.- На проводе и во флагах исполнителя нет: вызывающий его не выбирает.
- Квитанция объясняет выбор:
selected,origin,skipped.
Назначить исполнителя жёстко
Ключ providers.<операция> в v8project.yaml или в местном слое назначает исполнителя на одну операцию и отменяет цепочку умолчаний: если названный исполнитель не готов, команда отказывает и следующего не берёт. Другого выключателя нет: ни флага, ни переменной окружения, ни состояния на диске.
providers:
push: agent
pull: agent
Квитанция показывает, кто исполнил и почему: provider.selected называет исполнителя, provider.origin.kind: override — что его назначил ключ. Валидация отвергает ключ там, где выбирать не из чего: например, у автономного сервера, объявленного одним SSH-шлюзом, исполнитель один. Там, где названный исполнитель операцию не реализует, отказ называет, кто её реализует.
Агент: два режима
| managed | attached | |
|---|---|---|
| кто поднял | раннер | вы |
| где бывает | файловая база и кластер; автономный сервер, который поднял раннер | автономный сервер, который подняли вы, — он держит свой шлюз сам; файловая база и кластер — только если агент Конфигуратора подняли вы |
| признак в конфиге | ключей tools.designer_agent.attach нет — раннер поднимает сам; у автономного сервера — standalone.managed | standalone.gate / tools.designer_agent.attach |
| флаги запуска | раннер плюс ваши | только ваши |
| если недоступен | ошибка запуска | endpoint_unreachable, свой рядом не поднимает |
Тот же принцип у сервера администрирования: объявленный cluster.ras раннер только использует, а без него поднимает ras сам, на своей машине, против агента кластера из строки подключения, и гасит вместе с командой (55).
Правила
| замок | команда владеет workPath целиком; разовый агент живёт столько же, живой переживает команду |
| срок | у команды его нет — она идёт до терминального исхода; предел бывает у шага, если шаг его объявил |
| выкладка | полная замена каталога идёт через staging и backup |
| превью | --dry-run не берёт замок и ничего не создаёт |
| секреты | маскируются во всех выводах |
Unica вызывает командную строку с --json-message.
Что доступно по виду цели
Первый исполнитель в клетке — умолчание; если он не готов в этом окружении, раннер берёт следующего. Ключ providers.<операция> назначает исполнителя жёстко. Столбец кластера описывает подключение по Srvr=…;Ref=…: через него работают Конфигуратор и агент. Прямое подключение ibcmd по dbms — канал к СУБД при остановленном кластере. С работающим кластером такой доступ запрещён из-за риска разрушения базы (60); наличие канала само по себе не определяет выбор исполнителя для операции. Регистрировать базу в кластере ibcmd не умеет (74). У автономного сервера первым стоит Конфигуратор по прямому шлюзу: полный набор команд, файлы у раннера (65); SSH-шлюз берётся, когда строка подключения не объявлена или его назначил ключ, и набор у него урезан (61).
| Операция | Файловая база | Кластер 1С · connection | Автономный сервер |
|---|---|---|---|
| infobase create | ibcmd designer | designer rac регистрация в кластере и база данных одной командой (73) | нет создаётся ibcmd в автономном режиме до запуска сервера (75) |
| push | agent designer ibcmd; полная загрузка всех наборов — первым ibcmd | agent designer | designer agent по SSH — файлы через канал обмена |
| apply | agent designer ibcmd | agent designer | designer agent |
| reset | designer ibcmd | designer | designer по SSH нет: в наборе шлюза нет отката (60) |
| upload | agent designer | agent designer | designer по SSH нет: в наборе шлюза нет сравнения (61) |
| pull | agent designer ibcmd; полная выгрузка — первым ibcmd | agent designer | designer agent по SSH — результат через канал обмена |
| download | agent designer ibcmd | agent designer | designer agent только основная конфигурация |
| diff | ibcmd designer | designer | designer agent только по файлу версий |
| make | designer ibcmd — своя постоянная база сборки | ||
| convert | edt-cli ibcmd ibcmd-rs — база не нужна: EDT ↔ XML делает 1cedtcli, пакет ↔ XML — ibcmd или ibcmd-rs | ||
| extensions | ibcmd agent | agent designer имена | agent designer имена |
| infobase dump · restore | agent designer | agent designer | designer по SSH нет: dump-ib роняет ibsrv 8.3.27 замер |
| check | designer | designer | designer |
| sessions | нет сервера, ведущего сеансы, нет | rac | ibcmd session |
| test | клиент по строке подключения | клиент по строке подключения | тонкий клиент по строке подключения или по веб-адресу; толстого клиента прямой шлюз не пускает (65) |
| launch | designer · thin · thick · ordinary · mcp; web — когда объявлен web.url | designer · thin · thick · ordinary · mcp; web — когда объявлен web.url | designer · thin · mcp по строке подключения; thick и ordinary — нет: прямой шлюз толстого клиента не пускает, обычное приложение сервер не поддерживает (65); web — браузером по HTTP сервера |
| web publish | webinst | webinst | не нужна: сервер отдаёт HTTP сам |
У тонкого клиента два пути, и раннер умеет оба: по строке подключения — прямо в файловую базу, в кластер или в прямой шлюз автономного сервера, по веб-адресу — через Apache, IIS или HTTP автономного сервера. Без ключа launch thin берёт строку подключения; веб-адрес — когда строка не объявлена. Ключ --via web|connection умолчание переопределяет и принимается только там, где клиент тонкий: через веб-сервер ходят тонкий, веб- и мобильный клиенты, толстый и Конфигуратор — только по строке подключения (67); launch web открывает тот же веб-адрес браузером. ibcmd серверную цель открывает прямо в СУБД, мимо кластера, по секции dbms; у файловой базы ему хватает пути к каталогу, а у автономного сервера секция не принимается вовсе. Какие строки помечены экспериментальными и как их включить — в разделе Эксперименты.
Каналы и протоколы
| Канал | Между кем | Чем | Что ходит |
|---|---|---|---|
| запуск утилиты | раннер → 1cv8, 1cv8c, ibcmd, webinst, 1cedtcli | процесс ОС: аргументы, код выхода, журнал | команда и её артефакты на диске |
| файловая база | Конфигуратор, ibcmd, клиент → каталог с 1Cv8.1CD | файловый доступ; у применения и снимка — монопольный | данные базы |
| кластер | Конфигуратор, клиент, агент → ragent 1540, rmngr 1541, rphost 1560–1591 (63) | протокол платформы поверх TCP | сеанс работы с ИБ |
| СУБД кластера | rphost → сервер СУБД | подключение, настроенное у базы в кластере | данные базы |
| прямой доступ к СУБД | ibcmd на машине раннера → сервер СУБД | dbms.kind, server, name и учётные данные СУБД | только при остановленном кластере; работающие серверные процессы не обращаются к этой базе |
| агент Конфигуратора | раннер → 1cv8 /AgentMode на 127.0.0.1:1543 (86) | SSH встроенным клиентом: команда строкой, ответ JSON (85); без псевдотерминала (101) | команды сессии; файлы — через AgentBaseDir в workPath |
| SSH-шлюз автономного сервера | раннер → ibsrv на host:1543 (64) | SSH встроенным клиентом: команда строкой, ответ JSON (61) | команды сессии |
| прямой шлюз автономного сервера | Конфигуратор, тонкий клиент → ibsrv (65) | протокол платформы поверх TCP, как у кластера; строка Srvr=…;Ref=… | сеанс работы с ИБ; файлы остаются у раннера |
| обмен файлами с целью | раннер ↔ каталог пользователя SSH-шлюза | exchange: sftp — подсистема SFTP того же соединения; exchange: { dir } — видимый каталог | исходники, списки, .cf, .cfe, результаты выгрузки |
| публикация | webinst → Apache или IIS на машине раннера (69) | запуск процесса, запись каталога публикации и правка конфига веб-сервера | default.vrd целиком |
| веб-клиент | браузер, тонкий клиент → веб-сервер 80 · 443 | HTTP, HTTPS; адрес вида ws=… | сеанс пользователя |
| автономный сервер, клиент | браузер, тонкий клиент → ibsrv 8314 (64) | HTTP, HTTPS | сеанс пользователя |
| клиентский MCP | раннер → клиент 1С, поднятый командой launch mcp с инструментом onec-client-mcp-devkit | HTTP на 127.0.0.1 | проверка готовности и инструменты внутри клиента |
| сервер администрирования | раннер → rac → RAS 1545 (54) | процесс ОС; адрес из cluster.ras, а без него — ras, поднятый раннером на своей машине против агента кластера (55) | сеансы своей базы: список, завершение, блокировка начала (57). Консоль кластера, лицензии и серверы — вне раннера |
Внутри раннера
Слои раннера и процессы, которые он запускает.
Слои
| Слой | Отвечает за | Не знает про |
|---|---|---|
| cli | разбор аргументов, вывод текстом и JSON, взятие замка | как устроены утилиты платформы |
| use_cases | порядок шагов, замок, выбор исполнителя | разбор аргументов командной строки |
| config | чтение и проверка v8project.yaml и overlay | исполнение |
| domain | типы результата, матрица исполнителей | процессы |
| change_detection | что изменилось с прошлого раза | чем загружать |
| parsers | журналы и отчёты → типы | решения |
| platform | аргументы, запуск, коды выхода утилит | бизнес-смысл команды |
Процессы
Сколько живёт
| Компонент | Где | Сколько живёт | Сколько штук |
|---|---|---|---|
| CLI-процесс | ОС | одна команда | 1 |
замок workPath | файл в workPath | время команды | 1 на каталог |
| поиск утилит | память процесса | время процесса, с кешем | 1 |
| память о прошлом разе | localPath/infobases/<база> | открыта на время команды, хранится между запусками; удаление workPath её не задевает | по базе и набору исходников |
| сессия EDT | процесс 1cedtcli | до конца команды | 1 на команду |
| живой агент Конфигуратора | процесс агента и его сторож на машине раннера; запись, AgentBaseDir, текущий каталог и ключ хоста — workPath/agent/live/<ключ16>/, журнал сторожа рядом; пока агент жив, каталог не удалить: уборка рабочей копии начинается с agent stop | переживает команду; закрывается после 15 минут простоя без держателя или по agent stop. Пока жив, держит сеанс лицензии. Если сторож не поднялся или не ответил, команда работает с разовым агентом (reason: keeper_failed), а agent hold отказывает с agent_start; когда сторож вышел или не ответил вовремя, отказ называет журнал сторожа workPath/agent/live/<ключ16>.log | до live-max на учётную запись |
| разовый агент Конфигуратора | процесс агента; файлы — workPath/agent | ровно столько, сколько раннер владеет workPath | 1 на команду |
| сессия SSH-шлюза ibsrv | соединение с автономным сервером | ровно столько, сколько раннер владеет workPath | 1 на цель |
| ras, поднятый раннером | процесс на машине раннера | ровно столько, сколько раннер владеет workPath; объявленный cluster.ras он не поднимает | 1 на команду |
| Designer, ibcmd, webinst | отдельный процесс | одна операция | 1 одновременно |
| автономный сервер | ваш процесс или ibsrv, поднятый standalone start | ваш — раннер не поднимает и не перезапускает; поднятый standalone start живёт до standalone stop, его данные и запись — в localPath/infobases/<база>/managed/standalone | 1 на базу |
| клиент 1С | процесс | время теста или запуска | 1 |
Что из этого следует
- Сессия EDT завершается вместе с командой.
- Пока команда владеет
workPath, она работает с одним агентом, и вложенные шаги идут в нём же. Живой агент остаётся и после команды: следующая команда той же рабочей копии берёт его без подъёма. - Живой агент и его сторож держат всё своё в
workPath/agent/live: вне рабочей копии раннер ничего не создаёт. Пока агент жив, каталог занят — уборка рабочей копии начинается сagent stop. - Память о прошлом разе переживает процессы — она лежит на диске под
localPath, и удалениеworkPathеё не стирает. - Параллельные команды на одном
workPathне выполняются: вторая ждёт замок.