.. | ||
mock | ||
build.go | ||
build_client.go | ||
build_handler.go | ||
build_test.go | ||
heartbeat.go | ||
heartbeat_client.go | ||
heartbeat_handler.go | ||
heartbeat_test.go | ||
README.md |
api
Пакет api реализует протокол, по которому общаются компоненты системы.
Этот пакет не занимается передачей файлов и артефактов, соответствующие функции находятся в
пакетах filecache
и artifact
.
Worker <-> Coordinator
- Worker и Coordinator общаются через один запрос
POST /heartbeat
. - Worker посылает
HeartbeatRequest
и получает в ответHeartbeatResponse
. - Запрос и ответ передаются в формате json.
- Ошибка обработки heartbeat передаётся как текстовая строка.
Client <-> Coordinator
Client и Coordinator общаются через два вызова.
-
POST /build
- стартует новый билд.- Client посылает в Body запроса json c описанием сборки.
- Coordinator стримит в body ответа json сообщения описывающие прогресс сборки.
- Первым сообщением в ответе Coordinator присылает
buildID
. - Тут можно было бы использовать websocket, но нас устраивает более простое решение.
-
POST /signal?build_id=12345
- посылает сигнал бегущему билду.- Запрос и ответ передаются в формате json.
Замечания
-
Конструкторы клиентов и хендлеров принимают первым параметром
*zap.Logger
. Запишите в лог события получения/отправки запроса и все ошибки. Это поможет вам отлаживать интеграционные тесты в следующей части задания. -
Все методы должны "пробрасывать" контекст.
- Контекст на клиенте нужно передать в функцию
http.NewRequestWithContext
. - Контекст на сервере нужно получить из
r.Context()
и передать вService
.
- Контекст на клиенте нужно передать в функцию
-
Код в этом пакете не должен запускать новые горутины.
-
Ошибку из
Service.StartBuild
нужно посылать клиенту. Если эта ошибка произошла после того, как хендлер начал писать body, то ошибку нужно передавать в потоке json-ов в полеStatusUpdate.BuildFailed
. -
Код всех вызовов в этом пакете работает одинаково:
- Пользователь вызывает метод
*Client
. - Метод делает HTTP запрос к серверу.
*Handler
принимает запрос, декодирует его и передает в*Service
.- (*) В случае вызова
/build
, сервис пишет обновления вStatusWriter
, а клиентский код читает эти обновления изStatusReader
. - Ответ или ошибка из
*Service
возвращается пользователю.
- Пользователь вызывает метод