Skip to content

Command Manager

Назначение

Централизованный сервис управления командами (исполняемыми единицами работ), коллекциями, диспетчеризацией задач на удалённые раннеры, отслеживанием выполнения с логами и артефактами.

Порты

ПортНазначение
8094HTTP REST API
gRPC (для подключения раннеров)
  • БД: command_manager_db

Ключевые возможности

  • CRUD команд с типизированными переменными: string, number, boolean, date, datetime, array, object
  • Вложенные коллекции (папки команд с деревевидной структурой)
  • Шаринг команд и коллекций с ролями admin / user / viewer через service-common/sharing
  • Условные значения переменных (Grule Rule Engine) — см. раздел Условия переменных
  • Система задач: создание → очередь MemoryTask → диспетчеризация → выполнение
  • gRPC bidirectional streaming для связи с раннерами (Hello/Pong хендшейк)
  • Tag-based matching: команды и раннеры матчатся по тегам
  • Логи и артефакты задач
  • Swagger UI: /swagger/index.html

Условия переменных

Каждая переменная команды может иметь поле conditions — строку с выражением на Grule Rule Engine. Условие определяет, когда данное значение переменной применяется. Вычисляется на стороне сервера при вызове CheckCondition / ValidateCondition.

Как это работает

  1. При оценке условия переменной значение передаётся как переменная value в контекст Grule
  2. Условие подставляется в шаблон правила: when <condition> then CM.Result = true
  3. Если выражение вычисляется как true — результат true, иначе false

Доступные переменные в выражении

ПеременнаяТипОписание
valueanyТекущее значение переменной, переданное при проверке
CMstructВнутренний объект (с полем Result), не использовать напрямую

Операторы

КатегорияОператоры
Сравнение==, !=, >, <, >=, <=
Логические&&, ||, !
Арифметические+, -, *, /, %

Примеры условий

Числовые сравнения

grule
value > 10
grule
value >= 100
grule
value < 50
grule
value == 0
grule
value != -1

Строковые сравнения

grule
value == "approved"
grule
value != "pending"
grule
value == "production"

Логические комбинации

grule
value > 0 && value < 100
grule
value == "active" || value == "pending"
grule
value != "" && value != "none"
grule
!(value == "disabled")

Булевы значения

grule
value == true
grule
value == false

API для работы с условиями

POST /api/v1/commands/conditions/check

Проверяет выражение условия на валидность синтаксиса (без привязки к переменной).

Request:

json
{
  "condition": "value > 10"
}

Response:

json
{
  "success": true,
  "data": true
}

POST /api/v1/commands/conditions/validate

Проверяет, вычисляется ли условие как true для переданного значения.

Request:

json
{
  "condition": "value == \"approved\"",
  "value": "approved"
}

Response:

json
{
  "success": true,
  "data": true
}

Пример с числом:

json
{
  "condition": "value > 100",
  "value": 250
}

true

Пример с ложным условием:

json
{
  "condition": "value == \"rejected\"",
  "value": "approved"
}

false

Клиентская библиотека (Go)

go
client := unishiftclient.NewCommandsClient(baseURL, token)

// Проверка условия
result, err := client.CheckCondition(ctx, unishiftclient.CheckConditionRequest{
    Condition: "value > 10",
})

// Валидация с значением
result, err := client.ValidateCondition(ctx, unishiftclient.ValidateConditionRequest{
    Condition: "value == \"active\"",
    Value:     "active",
})

Структура БД

ТаблицаОписание
commandsid, name, description, type, source, owner_id, visible, tags, props, concurrency, execution_count
command_variablesid, command_id, name, value, description, conditions, order, type
command_usersid, command_id, user_id, role (admin/user/viewer), created_at, updated_at
collectionsid, name, description, visible, owner_id
collection_usersid, collection_id, user_id, role (admin/user/viewer), created_at, updated_at
collection_commandscollection_id, command_id
collection_collectionsparent_collection_id, child_collection_id
runnersid, name, type, version, tags, ip, jobs, session_timeout, concurrency, paused, temporary
jobsid, command_id, runner_id, status, variables, result, error
job_logsid, job_id, level, message, timestamp

Таблицы command_users и collection_users используют модуль service-common/sharing.

gRPC Интерфейс

Протокол: runner.v1.RunnerService

  • Метод: Connect(stream RunnerToServer) → stream ServerToRunner
  • Хендшейк: Runner → Hello (name, tags, type, version, concurrency) → Сервер → HelloAck (connect_id, server_time)
  • Сервер → Раннер: TaskAssignment, StopTask
  • Раннер → Сервер: Heartbeat, TaskLog, TaskStatus, Ack
  • Поллинг очереди: каждые 750мс (задачи), 500мс (остановки)
  • Аутентификация: SERVICE_TOKEN через metadata authorization или поле Hello.token

Конфигурация

ПеременнаяПо умолчаниюОписание
PORT8094Порт сервера
DB_HOSTАдрес PostgreSQL
DB_PORT5432Порт PostgreSQL
DB_USERПользователь PostgreSQL
DB_PASSWORDПароль PostgreSQL
DB_NAMEИмя базы данных
DB_SSL_MODEdisableРежим SSL
SERVICE_TOKENТокен для gRPC-аутентификации раннеров
ENV_MANAGER_SERVICE_URLhttp://localhost:8097URL сервиса env-manager
MESSAGING_URLnats://localhost:4222URL NATS
JWT_SECRETСекрет для JWT
JWT_TTL24hВремя жизни токена