v8-runner

Компоненты

Раннер ничего не делает с базой сам: он оркестрирует чужие процессы — утилиты платформы и 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коду выхода и появлению публикации

Проза инструмента никогда не решает — только переносится как улика.

Выбор исполнителя

  1. Умолчания заданы нами и живут в коде — матрица (операция, цель) → цепочка.
  2. Раннер берёт первого готового в этом окружении.
  3. providers.<операция> в конфиге переопределяет жёстко: неготовый — отказ, без отката.
  4. На проводе и во флагах исполнителя нет: вызывающий его не выбирает.
  5. Квитанция объясняет выбор: selected, origin, skipped.

Назначить исполнителя жёстко

Ключ providers.<операция> в v8project.yaml или в местном слое назначает исполнителя на одну операцию и отменяет цепочку умолчаний: если названный исполнитель не готов, команда отказывает и следующего не берёт. Другого выключателя нет: ни флага, ни переменной окружения, ни состояния на диске.

providers:
  push: agent
  pull: agent

Квитанция показывает, кто исполнил и почему: provider.selected называет исполнителя, provider.origin.kind: override — что его назначил ключ. Валидация отвергает ключ там, где выбирать не из чего: например, у автономного сервера, объявленного одним SSH-шлюзом, исполнитель один. Там, где названный исполнитель операцию не реализует, отказ называет, кто её реализует.

Агент: два режима

managedattached
кто поднялраннервы
где бываетфайловая база и кластер; автономный сервер, который поднял раннеравтономный сервер, который подняли вы, — он держит свой шлюз сам; файловая база и кластер — только если агент Конфигуратора подняли вы
признак в конфигеключей tools.designer_agent.attach нет — раннер поднимает сам; у автономного сервера — standalone.managedstandalone.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 createibcmd designerdesigner rac регистрация в кластере и база данных одной командой (73)нет создаётся ibcmd в автономном режиме до запуска сервера (75)
pushagent designer ibcmd; полная загрузка всех наборов — первым ibcmdagent designerdesigner agent по SSH — файлы через канал обмена
applyagent designer ibcmdagent designerdesigner agent
resetdesigner ibcmddesignerdesigner по SSH нет: в наборе шлюза нет отката (60)
uploadagent designeragent designerdesigner по SSH нет: в наборе шлюза нет сравнения (61)
pullagent designer ibcmd; полная выгрузка — первым ibcmdagent designerdesigner agent по SSH — результат через канал обмена
downloadagent designer ibcmdagent designerdesigner agent только основная конфигурация
diffibcmd designerdesignerdesigner agent только по файлу версий
makedesigner ibcmd — своя постоянная база сборки
convertedt-cli ibcmd ibcmd-rs — база не нужна: EDT ↔ XML делает 1cedtcli, пакет ↔ XML — ibcmd или ibcmd-rs
extensionsibcmd agentagent designer именаagent designer имена
infobase dump · restoreagent designeragent designerdesigner по SSH нет: dump-ib роняет ibsrv 8.3.27 замер
checkdesignerdesignerdesigner
sessionsнет сервера, ведущего сеансы, нетracibcmd session
testклиент по строке подключенияклиент по строке подключениятонкий клиент по строке подключения или по веб-адресу; толстого клиента прямой шлюз не пускает (65)
launchdesigner · thin · thick · ordinary · mcp; web — когда объявлен web.urldesigner · thin · thick · ordinary · mcp; web — когда объявлен web.urldesigner · thin · mcp по строке подключения; thick и ordinary — нет: прямой шлюз толстого клиента не пускает, обычное приложение сервер не поддерживает (65); web — браузером по HTTP сервера
web publishwebinstwebinstне нужна: сервер отдаёт 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 · 443HTTP, HTTPS; адрес вида ws=…сеанс пользователя
автономный сервер, клиентбраузер, тонкий клиент → ibsrv 8314 (64)HTTP, HTTPSсеанс пользователя
клиентский MCPраннер → клиент 1С, поднятый командой launch mcp с инструментом onec-client-mcp-devkitHTTP на 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ровно столько, сколько раннер владеет workPath1 на команду
сессия SSH-шлюза ibsrvсоединение с автономным серверомровно столько, сколько раннер владеет workPath1 на цель
ras, поднятый раннеромпроцесс на машине раннераровно столько, сколько раннер владеет workPath; объявленный cluster.ras он не поднимает1 на команду
Designer, ibcmd, webinstотдельный процессодна операция1 одновременно
автономный серверваш процесс или ibsrv, поднятый standalone startваш — раннер не поднимает и не перезапускает; поднятый standalone start живёт до standalone stop, его данные и запись — в localPath/infobases/<база>/managed/standalone1 на базу
клиент 1Спроцессвремя теста или запуска1

Что из этого следует