Интерфейс событий 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, Git URL исходников,
опциональный Git URL Dockerfile, ветки, tags, architectures, entrypoints, annotations
и userGID. Для gate-логики Stager использует entrypoints и userGID.
Событие 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",
"gitDockerfileURL": "https://github.com/user/dockerfiles.git",
"gitDockerfileBranch": "master",
"buildConfigPath": "/path/to/config.yaml",
"buildDockerfilePath": "images/app/Dockerfile",
"buildContextPath": ".",
"repoTags": ["latest", "1.0.0"],
"architecture": ["amd64", "arm64"],
"entrypoints": {
"amd64": [["rpm", "--eval", "%_host_cpu"]],
"all": [["nginx", "-v"]]
},
"annotations": {
"org.opencontainers.image.source": "https://github.com/user/repo"
},
"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 подтверждаются, но не запускают следующую стадию.
Для стадии BUILD Stager берёт из imagesByNames следующие поля расположения сборки:
| Поле | Обязательное | Описание |
|---|---|---|
buildGitURL | да | Git URL репозитория исходников и build context. |
buildGitBranch | нет | Ветка buildGitURL; пустое значение означает default branch. |
gitDockerfileURL | нет | Git URL отдельного репозитория с Dockerfile; пустое значение означает, что Dockerfile находится в buildGitURL. |
gitDockerfileBranch | нет | Ветка gitDockerfileURL; имеет смысл только если gitDockerfileURL не пустой. |
buildDockerfilePath | да | Путь к Dockerfile относительно gitDockerfileURL, если он задан, иначе относительно buildGitURL. |
buildContextPath | нет | Путь к build context внутри buildGitURL; не указывает на Dockerfile-репозиторий. |
Логика Stager
Список стадий задаётся конфигурацией STAGES; допустимые значения:
BUILD, TEST, SIGN, PUSH, CLEANUP
Ограничения:
| Правило | Описание |
|---|---|
| Первая стадия | Должна быть BUILD. |
| Последняя стадия | Должна быть CLEANUP. |
| Обязательная стадия | PUSH должна присутствовать. |
| Порядок | BUILD < PUSH < CLEANUP. |
TEST gate | Стадия запускается только если в задаче есть непустой map entrypoints. Ключи map — нормализованные архитектуры или all. |
SIGN gate | Стадия запускается только если userGID совпадает с SIGN_USER_GID. |
FAIL | Любой FAIL до CLEANUP маршрутизируется в CLEANUP, если она есть в STAGES. |
При выборе следующей стадии Stager:
- Проверяет, что для
taskId + eventStageещё нет последнегоNEW. - Пишет новое событие в
imageEvents. - Публикует stage-event в очередь Distributor.
Формат stage-event описан в интерфейсе Stager/Distributor.