Интерфейс событий TrackDB между Saver, Tracker и Stager
Этот интерфейс не является прямым RPC между Saver и Stager. Компоненты обмениваются состоянием задачи через TrackDB и RabbitMQ:
Saverпишет первичное событиеBUILD/NEWвimageEvents.- Materialized views TrackDB проецируют данные в
stateEventsиimagesByNames. TrackerпишетRUNNING,DONEилиFAILвimageEventsпо факту состояния Kubernetes Job.Trackerпубликует completion-событие в RabbitMQ queuestager_queue.Stagerчитаетstager_queue, проверяет данные в TrackDB, выбирает следующую стадию и пишетNEWдля неё вimageEvents.
TrackDB tables
Источник событий:
imageEvents
Рабочая проекция статусов:
stateEvents
Проекция расширенных данных образа:
imagesByNames
stateEvents содержит компактную историю состояний:
| Поле | Тип/значения | Описание |
|---|---|---|
insertTime | DateTime64(9) | Время вставки события. |
eventTime | DateTime | Логическое время события. |
eventStage | BUILD, TEST, SIGN, PUSH, CLEANUP | Стадия pipeline. |
eventStageState | SUSPEND, NEW, REJECT, RUNNING, DONE, FAIL | Состояние стадии. |
taskId | FixedString(26) | ULID задачи. |
user | string | Пользователь задачи. |
stageImageName | string | Имя образа на текущей стадии. |
stageImageTag | string | Тег образа на текущей стадии. |
errorTypeNum | uint | Код ошибки. |
errorMessage | string | Текст ошибки. |
registryName | string | Registry. |
imageId | string | ID образа, если известен. |
imagesByNames дополнительно хранит build context, Dockerfile path, branch, tags,
architectures, entrypoints и userGID. Stager использует эти данные для принятия решения
по TEST и SIGN.
Событие Saver -> TrackDB
Saver вставляет в imageEvents событие BUILD/NEW. Значимые поля:
{
"eventStage": "BUILD",
"eventStageState": "NEW",
"taskId": "01JBV2S4PGNV87EGC5WKYA0RND",
"user": "alexander",
"stageImageName": "project/image",
"stageImageTag": "",
"registryName": "registry.example.org",
"buildGitURL": "https://github.com/user/repo.git",
"buildGitBranch": "master",
"buildConfigPath": "/path/to/config.yaml",
"buildDockerfilePath": "./Dockerfile",
"buildContextPath": ".",
"repoTags": ["latest", "1.0.0"],
"architecture": ["amd64", "arm64"],
"entrypoints": [["/app/altflow-tests/run"]],
"userGID": 200
}
Событие Tracker -> Stager
Tracker дополняет контекст задачи из TrackDB и публикует в RabbitMQ queue stager_queue
событие завершения или запуска стадии.
Минимально значимые поля:
{
"taskid": "01JBV2S4PGNV87EGC5WKYA0RND",
"eventStage": "BUILD",
"eventStageState": "DONE",
"user": "alexander",
"stageImageName": "project/image",
"stageImageTag": "",
"registryName": "registry.example.org",
"imageId": "",
"errorTypeNum": 0,
"errorMessage": ""
}
Stager обрабатывает только DONE и FAIL как управляющие состояния. NEW,
RUNNING и SUSPEND подтверждаются, но не запускают следующую стадию.
Логика Stager
Список стадий задаётся конфигурацией STAGES; допустимые значения:
BUILD, TEST, SIGN, PUSH, CLEANUP
Ограничения:
| Правило | Описание |
|---|---|
| Первая стадия | Должна быть BUILD. |
| Последняя стадия | Должна быть CLEANUP. |
| Обязательная стадия | PUSH должна присутствовать. |
| Порядок | BUILD < PUSH < CLEANUP. |
TEST gate | Стадия запускается только если в задаче есть непустые entrypoints. |
SIGN gate | Стадия запускается только если userGID совпадает с SIGN_USER_GID. |
FAIL | Любой FAIL до CLEANUP маршрутизируется в CLEANUP, если она есть в STAGES. |
При выборе следующей стадии Stager:
- Проверяет, что для
taskId + eventStageещё нет последнегоNEW. - Пишет новое событие в
imageEvents. - Публикует stage-event в очередь Distributor.
Формат stage-event описан в интерфейсе Stager/Distributor.