Интерфейс между Stager и Distributor

Stager передаёт следующую стадию pipeline компоненту Distributor через RabbitMQ. Тот же формат использует Saver, когда отправляет первичное событие BUILD/NEW.

RabbitMQ

По умолчанию Stager публикует в:

queue: distributor_queue
exchange: distributor
routing_key: ""

Имена задаются переменными:

RABBITMQ_QUEUE_NAME
RABBITMQ_EXCHANGE
RABBITMQ_ROUTING_KEY

Сообщение отправляется как JSON. Distributor потребляет distributor_queue с manual ack/nack. При transient error сообщение requeue'ится до max_retries; после исчерпания попыток Distributor пишет FAIL в TrackDB и ack'ает сообщение.

Payload

Сообщение содержит не только taskid, eventStage и eventStageState, но и контекст, который нужен Distributor для рендера Helm chart values.

{
  "taskid": "01JBV2S4PGNV87EGC5WKYA0RND",
  "eventStage": "TEST",
  "eventStageState": "NEW",
  "user": "alexander",
  "stageImageName": "project/image",
  "stageImageTag": "",
  "registryName": "registry.example.org",
  "imageId": "",
  "errorTypeNum": 0,
  "errorMessage": "",
  "buildGitURL": "https://github.com/user/repo.git",
  "gitDockerfileURL": "https://github.com/user/dockerfiles.git",
  "gitDockerfileBranch": "master",
  "buildDockerfilePath": "images/app/Dockerfile",
  "buildContextPath": ".",
  "buildGitBranch": "master",
  "repoTags": ["latest", "1.0.0"],
  "architecture": ["amd64", "arm64"],
  "annotations": {
    "org.opencontainers.image.source": "https://github.com/user/repo"
  },
  "entrypoints": {
    "amd64": [["rpm", "--eval", "%_host_cpu"]],
    "all": [["nginx", "-v"]]
  }
}

Поля:

ПолеТипОписание
taskidstringULID задачи. В TrackDB это поле называется taskId.
eventStagestringСтадия: BUILD, TEST, SIGN, PUSH, CLEANUP.
eventStageStatestringДля запуска Distributor ожидает NEW.
userstringПользователь задачи.
stageImageNamestringИмя образа на текущей стадии.
stageImageTagstringТег образа на текущей стадии, если известен.
registryNamestringRegistry.
imageIdstringID образа, если известен.
errorTypeNumnumberКод ошибки, обычно 0 для NEW.
errorMessagestringСообщение об ошибке, обычно пустое для NEW.
buildGitURLstringGit URL репозитория исходников и build context.
gitDockerfileURLstringОпциональный Git URL отдельного репозитория с Dockerfile. Пустая строка означает, что Dockerfile находится в buildGitURL.
gitDockerfileBranchstringОпциональная ветка gitDockerfileURL; имеет смысл только при непустом gitDockerfileURL.
buildDockerfilePathstringПуть к Dockerfile относительно gitDockerfileURL, если он задан, иначе относительно buildGitURL.
buildContextPathstringКонтекст сборки внутри buildGitURL.
buildGitBranchstringВетка buildGitURL.
repoTagsarray[string]Теги результирующего образа.
architecturearray[string]Архитектуры для job package.
annotationsobject<string,string>OCI annotations для BUILD. Они попадают в overrideValues.trackDb.annotations build chart'а и передаются builder'у через IMAGE_ANNOTATIONS.
entrypointsobject<string,array[array[string]]>Команды для TEST, сгруппированные по архитектурам. Ключ all используется как общий набор команд; для остальных стадий обычно пустой объект.

Действия Distributor

После получения сообщения Distributor:

  1. По eventStage получает из SysDB URL, имя и версию Helm chart.
  2. Для BUILD и PUSH читает credentials задачи из Secret Manager.
  3. Выполняет helm registry login для registry с chart packages, если это включено в конфигурации.
  4. Выполняет helm pull oci://... --untar.
  5. Переписывает values.yaml job chart:
    • RabbitMQ callback labels/values: taskid, eventStage, eventStageState=RUNNING;
    • Secret Manager credentials для BUILD или PUSH;
    • TrackDB/build context: Git URL исходников, опциональный Git URL Dockerfile, Dockerfile path, context path, branches, registry, image name, tags, architectures;
    • OCI annotations для стадии BUILD;
    • привязанные к архитектурам entrypoints для стадии TEST.
  6. Запускает Kubernetes Job через:
helm upgrade --install <taskid-lowercase>-<stage-lowercase> ./<chart_name>
  1. Пишет в imageEvents состояние:
    • SUSPEND, если Helm release успешно создан;
    • FAIL, если chart не найден, pull/install завершился ошибкой или TEST вызван без entrypoints.

Фактическое завершение Kubernetes Job (RUNNING, DONE, FAIL) фиксирует Tracker.