Перейти к основному содержимому

Первый запуск Go-сервиса

Эта инструкция проводит от checkout-а до работающего HTTP API и первого компонентного теста. Новые сервисы создают из backend-service-skeleton-go. Для существующего сервиса используйте его README: зависимости и фоновые роли могут отличаться от шаблона.

Команды Go, Artisan и инструментов проекта выполняются из корня сервиса через elc. Для тестов всегда передавайте --env=.env.testing, в том числе при запуске одного пакета.

1. Подготовить рабочее место​

Понадобятся Docker с Compose, установленный ELC, workspace проекта и доступ к GitLab с репозиториями сервисов, библиотек и Go-образов. Общая установка описана в локальном развороте backend.

Что проверитьИсточник настройки
Версия Go в контейнереgo.mod сервиса и Go-образ ELC
Версии генератора, Air, Delve и линтеровmise.toml и mise.lock
Зависимости сервиса и нужные подключенияREADME, config/ и .env.example
Правила работы агентаAGENTS.md и, если есть, AGENTS.local.md

Для создания сервиса скриптами шаблона на хосте нужны Bash, Git, tar, Perl и ripgrep (rg), а также обычные Unix-утилиты. Для начального коммита должны быть настроены Git user.name и user.email.

2. Получить код сервиса​

Существующий сервис​

Откройте checkout нужного Go-сервиса и перейдите к подключению ELC и подготовке окружения. Инициализатор шаблона предназначен для создания нового сервиса; в рабочем сервисе сохраняйте его настройки и локальные env-файлы.

Новый сервис без Laravel-исходника​

Подготовьте локальный checkout Go-шаблона. Экспортируйте его закоммиченную версию в новый, ещё не существующий каталог. Замените пути и пример catalog / example на параметры своего сервиса:

go_template=/path/to/backend-service-skeleton-go
go_service=/path/to/catalog-example-go

mkdir "$go_service"
git -C "$go_template" archive HEAD | tar -x -C "$go_service"
cd "$go_service"
git init

./scripts/init-service.sh \
--domain catalog \
--service example \
--display-name "Ensi Catalog Example Go" \
--app-url http://catalog-example-go.ensi.127.0.0.1.nip.io \
--dry-run

git archive копирует отслеживаемые файлы выбранного коммита без .git и неотслеживаемых файлов локального checkout-а. Родительский каталог назначения должен существовать. Скрипт init-service.sh задаёт имя приложения, БД и consumer group, конфигурацию будущего клиента и пример Kafka-топика. Без --openapi-source сохраняется учебный HTTP-контракт шаблона.

Примените те же параметры без --dry-run, проверьте результат и создайте начальный коммит:

./scripts/init-service.sh \
--domain catalog \
--service example \
--display-name "Ensi Catalog Example Go" \
--app-url http://catalog-example-go.ensi.127.0.0.1.nip.io

git status --short
git add .
git commit -m "Initial commit"

Локальные .env и .env.testing, создаваемые initializer-ом, исключены из Git через .gitignore. Наличие Git-репозитория требуется скриптам установки инструментов, а начального коммита — проверке check:generated.

Новый сервис с контрактом Laravel​

В шаблоне есть отдельный скрипт, который создаёт сервис в пустом каталоге, копирует весь OpenAPI из Laravel и делает Initial commit:

/path/to/backend-service-skeleton-go/scripts/create-service.sh \
--template-source /path/to/backend-service-skeleton-go \
--destination /path/to/new-service-go \
--laravel-source /path/to/laravel-service \
--domain catalog \
--service example

Скрипт создаёт каркас и переносит контракт. Источники требований, этапы, артефакты и порядок продолжения описаны в руководстве по портированию, которое связано с рабочими инструкциями шаблона. После замены OpenAPI учебный маршрут /api/v1/examples/{id} может отсутствовать; для проверки API выбирайте реализованную операцию перенесённого контракта.

3. Подключить сервис к ELC​

Проверьте выбранный workspace и список компонентов:

elc workspace list
elc workspace show
elc list

Для нового сервиса добавьте компонент в конфигурацию workspace: путь checkout-а, Go-образ, настройки запуска, адрес HTTP и необходимые зависимости. Ориентируйтесь на соседний Go-сервис этого же workspace. Создание каталога и параметр --app-url initializer-а сами по себе не регистрируют компонент и DNS-маршрут в ELC.

Далее запускайте команды из каталога зарегистрированного сервиса: ELC определяет компонент по текущему пути. Если он не находит сервис, сначала проверьте workspace и путь компонента. Версию Go в выбранном образе можно проверить командой:

elc go version

Она должна удовлетворять go.mod сервиса. Адреса PostgreSQL, Redis и других зависимостей должны быть доступны из контейнера приложения.

4. Подготовить локальные env-файлы​

Initializer создаёт отсутствующие .env и .env.testing из .env.example. Для свежего checkout-а существующего сервиса создайте только недостающие файлы:

[ -f .env ] || cp .env.example .env
[ -f .env.testing ] || cp .env.example .env.testing

Отредактируйте локальные значения до запуска приложения и тестов:

Настройка.env.env.testing
APP_ENVlocaltesting
APP_URL, APP_HOST, APP_PORTАдрес и порт, согласованные с ELCЗначения для тестового запуска
APP_KEYКлюч локального приложенияОтдельный ключ тестового окружения
DB_CONNECTION, DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORDЛокальное подключение PostgreSQL, если используетсяТестовое подключение PostgreSQL
DB_DATABASEБД локального приложенияОтдельное имя, например с суффиксом _testing
URL внешних сервисов и настройки транспортовПо интеграциям сервисаПодмены и настройки, необходимые тестам

Для знакомства с учебным HTTP-примером нового сервиса можно выбрать в обоих локальных env-файлах:

CACHE_DRIVER=memory
QUEUE_CONNECTION=sync
QUEUE_WORKER_ENABLED=false
KAFKA_CONSUMER_ENABLED=false
SCHEDULE_ENABLED=false
PROMETHEUS_ENABLED=false
LOG_ELASTICSEARCH_HOSTS=
HTTP_CLIENT_LOG=false

Это режим первого HTTP-запуска без фоновых ролей. В существующем сервисе и при реализации бизнес-сценариев настройте используемые им интеграции по README и конфигурации. Флаг отключения consumer не отключает публикацию Kafka из action; sync выполняет отправленную job сразу в вызывающем процессе.

5. Установить инструменты и зависимости​

Из корня сервиса выполните:

elc mise trust
elc mise run tools:install
elc go mod download

tools:install устанавливает закреплённые инструменты и Node-зависимости из lock-файла, необходимые в том числе для OpenAPI lint. При ошибке загрузки приватного Go-модуля проверьте доступ к GitLab и конфигурацию получения приватных модулей в Go-образе ELC.

Для новых env-файлов с пустым APP_KEY сгенерируйте ключи:

elc ./artisan key:generate
elc ./artisan key:generate --env=.env.testing

В уже настроенном окружении сохраняйте действующий ключ приложения. Подробнее об инструментах, клиентах и workspace Go — в работе с пакетами.

6. Подготовить БД, если она используется​

Создайте локальную БД и настройте доступ согласно workspace сервиса. После проверки DB_* примените миграции:

elc ./artisan migrate

Миграции находятся в database/migrations и регистрируются в bootstrap/migrations.go. Полная схема и локальные справочные данные зависят от сервиса; способ наполнения указан в его README. Подробнее — работа с БД.

Компонентные тесты, использующие RunComponentTests, создают временную PostgreSQL-БД на пакет и применяют миграции автоматически. Тестовому пользователю нужны доступ к служебной БД postgres и права создания и удаления временных БД. Ручной migrate в .env.testing не заменяет этот механизм.

7. Запустить приложение и проверить HTTP​

Обычный режим разработки с Air:

elc start

Air пересобирает и перезапускает приложение при изменении кода. Для запуска без Air остановите этот режим и запустите приложение вручную:

elc stop
elc go run .

Проверяйте адрес из конфигурации ELC. Например, если для учебного сервиса настроен указанный выше hostname:

service_url=http://catalog-example-go.ensi.127.0.0.1.nip.io
curl --fail --silent --show-error "$service_url/health"
curl --fail --silent --show-error "$service_url/docs/oas/spec/index.yaml"
curl --fail --silent --show-error "$service_url/api/v1/examples/1"
Маршрут шаблонаОжидаемый результат
/healthУспешный HTTP-ответ; доступность процесса не доказывает работоспособность всех интеграций
/docs/oasСтраница OpenAPI в браузере
/docs/oas/spec/index.yamlИсходная спецификация API
/api/v1/examples/1HTTP 200 и {"data":{"id":1,"name":"Example"}}
/api/v1/examples/2HTTP 404 для отсутствующего примера

Учебный endpoint не обращается к БД. Для существующего сервиса или заменённого контракта используйте его операции. Логи и отладка описаны в логировании и настройке GoLand.

8. Запустить первый компонентный тест​

В исходном шаблоне уже есть пакет app/modules/examples/tests/examples. Его тест GetTestSuite.TestStatus_200 вызывает API через внутренний HTTP-клиент и проверяет статус и JSON:

func (s *GetTestSuite) TestStatus_200() {
resp, err := s.Http(s.T()).Get("/api/v1/examples/1")
s.Require().NoError(err)
resp.AssertStatus(200)
body, err := resp.Content()
s.Require().NoError(err)
s.JSONEq(`{"data":{"id":1,"name":"Example"}}`, body)
}

Тест использует apptests.TestCase и проверку запроса/ответа по OpenAPI. В том же пакете есть проверки 404. Для этих сценариев не нужны TestMain с RunComponentTests, компонентная БД или отдельно запущенный HTTP-сервер.

elc go test ./app/modules/examples/tests/examples --env=.env.testing -count=1

Если учебный модуль заменён, выберите тестовый пакет реализованного ресурса. Для сценариев с PostgreSQL используется ComponentSuite и один TestMain с RunComponentTests на пакет — см. автотесты.

9. Подключить hooks и выполнить проверки перед MR​

Установите hooks из репозитория:

elc set-hooks .git_hooks

В шаблоне pre-commit проверяет форматирование staged Go-файлов, OpenAPI и секреты; pre-push — env, модули, vet, тесты, генерацию и сборку. Hooks после checkout/merge синхронизируют инструменты и Node-зависимости при изменениях их конфигурации.

Перед MR запустите проверки из mise.toml своего сервиса. Базовый набор шаблона:

elc mise run check:fmt
elc mise run check:openapi
elc mise run check:env
elc mise run check:modules
elc mise run check:vet
elc mise run check:test
elc mise run check:generated
elc mise run check:secrets
elc mise run check:build

check:test передаёт .env.testing. check:generated повторяет генерацию и требует отсутствия новых изменений от генератора. После изменения OpenAPI сначала выполните elc mise exec -- ensi-gog server и просмотрите diff — см. ensi-gog. Для форматирования используется elc mise run format, для изменений конкурентного кода есть дополнительная проверка elc mise run check:race.

Дальнейшее чтение​

ЗадачаСтатьи
Разобраться в слоях и зависимостяхСтруктура сервиса, стиль кода, пакеты
Реализовать HTTP-операциюГенератор, ответы и ошибки, БД
Реализовать SQL-поиск или изменение данныхПоиск, create/PATCH/delete
Подключить внешнее API или файлыHTTP-клиенты, файловые операции
Проверить поведениеКомпонентные тесты и фабрики
Подключить фоновые процессыKafka, очереди
Настроить диагностикуЛоги, метрики, GoLand