From bbb7597e1713ef1b28ed463a57f9564f164daf60 Mon Sep 17 00:00:00 2001 From: irylkov Date: Fri, 21 Mar 2025 09:40:42 +0300 Subject: [PATCH] init --- .gitignore | 2 + .gitlab-ci.yml | 4 + .golangci.yaml | 65 ++++++++++++++++ Makefile | 6 ++ README.md | 119 +++++++++++++++++++++++++++++ cart/Makefile | 8 ++ cart/configs/values_ci.yaml | 19 +++++ cart/configs/values_local.yaml | 19 +++++ cart/go.mod | 3 + comments/Makefile | 12 +++ comments/configs/values_ci.yaml | 20 +++++ comments/configs/values_local.yaml | 20 +++++ comments/go.mod | 3 + go.work | 8 ++ loms/Makefile | 11 +++ loms/configs/values_ci.yaml | 28 +++++++ loms/configs/values_local.yaml | 28 +++++++ loms/go.mod | 3 + make/build.mk | 13 ++++ make/lint.mk | 43 +++++++++++ notifier/Makefile | 8 ++ notifier/configs/values_ci.yaml | 6 ++ notifier/configs/values_local.yaml | 6 ++ notifier/go.mod | 3 + 24 files changed, 457 insertions(+) create mode 100644 .gitignore create mode 100644 .gitlab-ci.yml create mode 100644 .golangci.yaml create mode 100644 Makefile create mode 100644 README.md create mode 100644 cart/Makefile create mode 100644 cart/configs/values_ci.yaml create mode 100644 cart/configs/values_local.yaml create mode 100644 cart/go.mod create mode 100644 comments/Makefile create mode 100644 comments/configs/values_ci.yaml create mode 100644 comments/configs/values_local.yaml create mode 100644 comments/go.mod create mode 100644 go.work create mode 100644 loms/Makefile create mode 100644 loms/configs/values_ci.yaml create mode 100644 loms/configs/values_local.yaml create mode 100644 loms/go.mod create mode 100644 make/build.mk create mode 100644 make/lint.mk create mode 100644 notifier/Makefile create mode 100644 notifier/configs/values_ci.yaml create mode 100644 notifier/configs/values_local.yaml create mode 100644 notifier/go.mod diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a676215 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.idea +bin diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..9c1e2db --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,4 @@ +include: + - project: 'go/classroom-18/students/base' + ref: master + file: '.gitlab-ci.yml' diff --git a/.golangci.yaml b/.golangci.yaml new file mode 100644 index 0000000..8441a0d --- /dev/null +++ b/.golangci.yaml @@ -0,0 +1,65 @@ +# More info on config here: https://golangci-lint.run/usage/configuration/#config-file +run: + concurrency: 8 + timeout: 10m + issues-exit-code: 1 + tests: true + + +output: + formats: + - format: colored-line-number + print-issued-lines: true + print-linter-name: true + +linters-settings: + govet: + enable: + - shadow + dupl: + threshold: 100 + goconst: + min-len: 2 + min-occurrences: 2 + +linters: + disable-all: true + enable: + # - dupl - it's very slow, enable if you really know why you need it + - errcheck + - goconst + - goimports + - gosec + - govet + - ineffassign + - gosimple + - staticcheck + - revive + - typecheck + - unused # will be used insted of varcheck + deadcode + structcheck. More info https://github.com/golangci/golangci-lint/issues/1841 + +issues: + exclude-dirs: + - bin + - vendor + - var + - tmp + exclude-files: + - \.pb\.go$ + - \.pb\.gw\.go$ + - \.pb\.scratch\.go$ + - \.pb\.goclay\.go$ + exclude-use-default: false + exclude: + # _ instead of err checks + - G104 + # for "public interface + private struct implementation" cases only! + - exported func .* returns unexported type .*, which can be annoying to use + # can be removed in the development phase + - (comment on exported (method|function|type|const)|should have( a package)? comment|comment should be of the form) + # not for the active development - can be removed in the stable phase + - should have a package comment + - don't use an underscore in package name + # EXC0001 errcheck: Almost all programs ignore errors on these functions and in most cases it's ok + - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked + - should check returned error before deferring diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..6eca5bb --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +include make/lint.mk +include make/build.mk + +lint: cart-lint loms-lint notifier-lint comments-lint + +build: cart-build loms-build notifier-build comments-build diff --git a/README.md b/README.md new file mode 100644 index 0000000..fc800c5 --- /dev/null +++ b/README.md @@ -0,0 +1,119 @@ +# Шаблон репозитория для реализации проекта на курсе Route 256 + + Поздравляем с зачислением на курс "Продвинутая разработка микросервисов на Go"! Надеемся, что процесс обучения будет +увлекательным, а полученные знания пригодятся в работе! + + В рамках курса вам предстоит разработать проект– копию Озона в миниатюре. Не нужно пугаться, ведь на этом пути вас +будет сопровождать команда преподавателей и тьюторов. Работа над проектом будет разбита из 8 модулей, каждому из +которых, посвящены две лекции и одно практическое занятие. Действующие инженеры Озона поделятся своим опытом и обратят +внимание на важные аспекты, которые неизбежно возникают при разработке высоконагруженных распределенных систем. По +окончании каждого модуля будет предложено реализовать ту или иную часть из курсового проекта, имеющую непосредственное +отношение к теме модуля. + +Желаем успехов в прохождении курса! + +# Работа над курсовым проектом + +## Инициализация проекта + +Для работы над курсовым проектом необходимо выполнить инициализацию репозитория: + +1. Открыть репозиторий https://gitlab.ozon.dev/go/classroom-18/students/homework-draft (вы уже в нем); +2. Создать копию данного репозитория https://gitlab.ozon.dev/go/classroom-18/students/homework-draft (форк проекта в свой + приватный репозиторий (см. рис. 1)); +3. Разорвать связь с шаблонным репозиторием, для этого в GitLab необходимо выполнить: Settings › Advanced › Remove + fork relationship (см. рис. 2 и 3); +4. Добавить тьютора в Members проекта. Для этого: Project information › Members › Invite member, пригласить своего + тьютора с правами Maintainer (см. рис. 4, 5 и 6). + + +Обрати внимание! +Если не разорвать связь с проектом, можно случайно отправить изменения в общий проект с шаблоном курсового проекта! + + +![Рис. 1. Форк проекта](./docs/readme/img/fork-project.png) +Рис. 1. Создаем копию проекта + +![Рис. 2. Продвинутые настройки](./docs/readme/img/advanced-settings.png) +Рис. 2. Переходим в продвинутые настройки репозитория + +![Рис. 3. Разрыв связи](./docs/readme/img/unlink-fork.png) +Рис. 3. Разрываем связь в шаблонным проектом + +![Рис. 4. Настройки участников проекта](./docs/readme/img/project-members.png) +Рис. 4. Настройки участников проекта + +![Рис. 5. Добавить новых участников](./docs/readme/img/invite-member.png) +Рис. 5. Добавить новых участников + +![Рис. 6. Добавление тьютора с ролью Maintainer](./docs/readme/img/make-tutor-a-maintainer.png) +Рис. 6. Добавление тьютора с ролью Maintainer + + +## Выполнение домашнего задания: + +1. В своём форке проекта необходимо создать ветку от master под выполняемое задание. Ветку **необходимо (MUST)** назвать + hw-N, где N– номер модуля, к которому относится выполняемое задание; +2. Выполнить задание; +3. Создать мерж-реквест ветки с решением в master в своём форке проекта; +4. Уведомить тьютора об отправке решения на проверку и поделиться ссылкой на мерж-реквест в Telegram; +5. После проверки задания тьютором он может оставить комментарии к решению. Если требующие исправления замечания + отсутствуют, тьютор засчитывает решение, оставляя отметку (approve) на мерж-реквесте. По итогам проверки тьютор + проставляет оценку за работу в таблице прогресса; +6. Необходимо устранить все обязательные замечания и добиться успешного прохождения проверки тьютором; +7. После того как решение зачтено тьютором, и работа над ним со стороны студента завершена, решение необходимо вмержить + в ветку master. + +## Формат названий на курсе Go на примере домашнего задания №1 (HW1): + +| Формат наименования | Пример | +|--------------------|------------------------------| +| Для ветки | hw-1 | +| Для коммита | [hw-1] Свободный комментарий | +| Для мерж-реквеста | [hw-1] Свободный комментарий | + +## Прохождение автоматизированных проверок + + На текущем потоке мы в пилотном режиме запускаем систему автоматизированной проверки решений. Это не означает, что +тьюторы будут проверять решения менее тщательно, напротив– мы хотим освободить тьюторов от рутинных проверок и +помочь им фокусироваться на проверке других важных аспектов реализации. Это требует от вас внимательнее относится +к именованию веток, потому что для запуска проверок необходимо чтобы ветки удовлетворяли указанному шаблону `hw-N`. + + Поскольку это пилотный запуск тестирующей системы, возможно возникновение проблем в ее работе, в том числе ложно +негативных срабатываний, **успешное прохождения решением всех автоматизированных проверок не является обязательным**. +Тем не менее постарайтесь, чтобы ваше решение проходило столько проверок, на сколько это возможно. Уделите внимание +проверкам кода (линтеру golangci-lint). Все это поможет избежать лишних замечаний в мерж-реквестах, которые непременно +оставит тьютор, и позволит сдать задание быстрее и за меньшее количество проверок. + + Блюдите культуру и гигиену работы с git, постарайтесь не пушить бессодержательные коммиты в систему контроля версий. +**Количество коммитов не оценивается**. Большое количество коммитов вызывает запуск автоматизированных проверок, а +ввиду ограниченности ресурсов это может создать очередь в их прохождении. Более того, большое количество коммитов в +репозитории, где одновременно работает много разработчиков (как обычно и бывает на настоящем крупном проекте), может +затруднить слияние и разрешение конфликтов, сложнее понять состояние репозитория и ориентироваться в истории. Хорошей +практикой считается выполнение объединения коммитов в один (squash) перед созданием мерж-реквеста и аналогичное +объединение коммитов с исправлениями в один перед повторной отправкой тьютору на повторную. Таким образом количество +коммитов в ветке будет соответствовать количеству итераций проверки. Мы не считаем количество коммитов и не оцениваем +работу по этому признаку. Сказанное выше является рекомендацией, но не требованием. + +## Чтение файла конфигурации +В вашем решинии каждый из сервисов должен (MUST) использовать переменную окружения `CONFIG_FILE` в которой указан ПУТЬ +до файла конфигурации. + +[Пример](cart/configs/values_ci.yaml) такого файла для сервиса `cart`, который используется в CI/CD пайплайне +(НЕ МОДИФИЦИРОВАТЬ). + +Файлы конфигурации для локального запуска так-же [находятся в репозитории](cart/configs/values_local.yaml). + +## Troubleshooting +1. Чтобы запустить product-service локально требуется выполнить команду + +``` +docker login gitlab-registry.ozon.dev +``` + логин и пароль такие-же, как для доступа к https://gitlab.ozon.dev/ + +2. Если при прохождении джобы с тестами вы получаете ошибку +``` +ERROR: Job failed: failed to pull image "gitlab-registry.ozon.dev/go/...." with specified policies [always]: Error response from daemon: pull access denied for gitlab-registry.ozon.dev/go/...., repository does not exist or may require 'docker login': denied: requested access to the resource is denied +``` +напишите об этом тьютору, чтобы он сделал необходимые настройки. После подтверждения от тьютора, что работы проведены - просто перезапустите пайплайн diff --git a/cart/Makefile b/cart/Makefile new file mode 100644 index 0000000..5dabc33 --- /dev/null +++ b/cart/Makefile @@ -0,0 +1,8 @@ +BINDIR=${CURDIR}/bin +PACKAGE=route256/cart + +bindir: + mkdir -p ${BINDIR} + +build: bindir + echo "build cart" diff --git a/cart/configs/values_ci.yaml b/cart/configs/values_ci.yaml new file mode 100644 index 0000000..95c2e06 --- /dev/null +++ b/cart/configs/values_ci.yaml @@ -0,0 +1,19 @@ +service: + host: localhost + port: 8080 + workers: 5 + +jaeger: + host: localhost + port: 6831 + +product_service: + host: product-service + port: 8082 + token: testToken + limit: 10 + burst: 10 + +loms_service: + host: localhost + port: 8083 diff --git a/cart/configs/values_local.yaml b/cart/configs/values_local.yaml new file mode 100644 index 0000000..7b7d7dd --- /dev/null +++ b/cart/configs/values_local.yaml @@ -0,0 +1,19 @@ +service: + host: localhost + port: 8080 + workers: 5 + +jaeger: + host: localhost + port: 6831 + +product_service: + host: localhost + port: 8082 + token: testToken + limit: 10 + burst: 10 + +loms_service: + host: localhost + port: 8083 diff --git a/cart/go.mod b/cart/go.mod new file mode 100644 index 0000000..24f18af --- /dev/null +++ b/cart/go.mod @@ -0,0 +1,3 @@ +module route256/cart + +go 1.23.1 diff --git a/comments/Makefile b/comments/Makefile new file mode 100644 index 0000000..0d2ff98 --- /dev/null +++ b/comments/Makefile @@ -0,0 +1,12 @@ +BINDIR=${CURDIR}/bin +PACKAGE=route256/comments + +bindir: + mkdir -p ${BINDIR} + +build: bindir + echo "build comments" + + +run-migrations: + echo "run migrations" diff --git a/comments/configs/values_ci.yaml b/comments/configs/values_ci.yaml new file mode 100644 index 0000000..7e85e91 --- /dev/null +++ b/comments/configs/values_ci.yaml @@ -0,0 +1,20 @@ +app: + edit_interval: 1s + +service: + host: localhost + grpc_port: 8085 + http_port: 8086 + +db_shards: + - host: "postgres-comments-shard-1" + port: 5432 + user: comments-user-1 + password: comments-password-1 + db_name: comments_db + + - host: "postgres-comments-shard-2" + port: 5432 + user: comments-user-2 + password: comments-password-2 + db_name: comments_db diff --git a/comments/configs/values_local.yaml b/comments/configs/values_local.yaml new file mode 100644 index 0000000..eafe322 --- /dev/null +++ b/comments/configs/values_local.yaml @@ -0,0 +1,20 @@ +app: + edit_interval: 1s + +service: + host: localhost + grpc_port: 8085 + http_port: 8086 + +db_shards: + - host: localhost + port: 5434 + user: comments-user-1 + password: comments-password-1 + db_name: comments_db + + - host: localhost + port: 5435 + user: comments-user-2 + password: comments-password-2 + db_name: comments_db diff --git a/comments/go.mod b/comments/go.mod new file mode 100644 index 0000000..2e5d8d7 --- /dev/null +++ b/comments/go.mod @@ -0,0 +1,3 @@ +module route256/comments + +go 1.23.1 diff --git a/go.work b/go.work new file mode 100644 index 0000000..f1c118c --- /dev/null +++ b/go.work @@ -0,0 +1,8 @@ +go 1.23.1 + +use ( +./cart +./loms +./notifier +./comments +) diff --git a/loms/Makefile b/loms/Makefile new file mode 100644 index 0000000..933c364 --- /dev/null +++ b/loms/Makefile @@ -0,0 +1,11 @@ +BINDIR=${CURDIR}/bin +PACKAGE=route256/loms + +bindir: + mkdir -p ${BINDIR} + +build: bindir + echo "build loms" + +run-migrations: + echo "run migrations" diff --git a/loms/configs/values_ci.yaml b/loms/configs/values_ci.yaml new file mode 100644 index 0000000..e2f4513 --- /dev/null +++ b/loms/configs/values_ci.yaml @@ -0,0 +1,28 @@ +service: + host: localhost + grpc_port: 8083 + http_port: 8084 + +jaeger: + host: localhost + port: 6831 + +db_master: + host: postgres-master + port: 5432 + user: loms-user + password: loms-password + db_name: loms_db + +db_replica: + host: postgres-replica + port: 5432 + user: loms-user + password: loms-password + db_name: loms_db + +kafka: + host: kafka + port: 29092 + order_topic: loms.order-events + brokers: kafka:29092 diff --git a/loms/configs/values_local.yaml b/loms/configs/values_local.yaml new file mode 100644 index 0000000..03a9e31 --- /dev/null +++ b/loms/configs/values_local.yaml @@ -0,0 +1,28 @@ +service: + host: localhost + grpc_port: 8083 + http_port: 8084 + +jaeger: + host: localhost + port: 6831 + +db_master: + host: localhost + port: 5432 + user: loms-user + password: loms-password + db_name: loms_db + +db_replica: + host: localhost + port: 5433 + user: loms-user + password: loms-password + db_name: loms_db + +kafka: + host: localhost + port: 29092 + order_topic: loms.order-events + brokers: localhost:9092 diff --git a/loms/go.mod b/loms/go.mod new file mode 100644 index 0000000..d07d81b --- /dev/null +++ b/loms/go.mod @@ -0,0 +1,3 @@ +module route256/loms + +go 1.23.1 diff --git a/make/build.mk b/make/build.mk new file mode 100644 index 0000000..e2b4f21 --- /dev/null +++ b/make/build.mk @@ -0,0 +1,13 @@ +.PHONY: build + +cart-build: + cd cart && GOOS=linux GOARCH=amd64 make build + +loms-build: + cd loms && GOOS=linux GOARCH=amd64 make build + +notifier-build: + cd notifier && GOOS=linux GOARCH=amd64 make build + +comments-build: + cd comments && GOOS=linux GOARCH=amd64 make build diff --git a/make/lint.mk b/make/lint.mk new file mode 100644 index 0000000..f81d3c2 --- /dev/null +++ b/make/lint.mk @@ -0,0 +1,43 @@ +CURDIR=$(shell pwd) +BINDIR=${CURDIR}/bin +GOVER=$(shell go version | perl -nle '/(go\d\S+)/; print $$1;') +LINTVER=v1.60.3 +LINTBIN=bin/golangci-lint + + +bindir: + mkdir -p ${BINDIR} + + +install-lint: bindir + test -f ${LINTBIN} || \ + (GOBIN=${BINDIR} go install github.com/golangci/golangci-lint/cmd/golangci-lint@${LINTVER} && \ + mv ${BINDIR}/golangci-lint ${LINTBIN}) + +define lint + @if [ -f "$(1)/go.mod" ]; then \ + output=$$(${LINTBIN} --config=.golangci.yaml run $(1)/... 2>&1); \ + exit_code=$$?; \ + echo "$$output"; \ + if [ $$exit_code -ne 0 ]; then \ + if echo "$$output" | grep -q "no go files to analyze"; then \ + exit 0; \ + else \ + exit $$exit_code; \ + fi \ + fi \ + fi +endef + + +cart-lint: + $(call lint,cart) + +loms-lint: + $(call lint,loms) + +notifier-lint: + $(call lint,notifier) + +comments-lint: + $(call lint,comments) diff --git a/notifier/Makefile b/notifier/Makefile new file mode 100644 index 0000000..c1c114f --- /dev/null +++ b/notifier/Makefile @@ -0,0 +1,8 @@ +BINDIR=${CURDIR}/bin +PACKAGE=route256/notifier + +bindir: + mkdir -p ${BINDIR} + +build: bindir + echo "build notifier" diff --git a/notifier/configs/values_ci.yaml b/notifier/configs/values_ci.yaml new file mode 100644 index 0000000..2df4fb3 --- /dev/null +++ b/notifier/configs/values_ci.yaml @@ -0,0 +1,6 @@ +kafka: + host: kafka + port: 29092 + order_topic: loms.order-events + consumer_group_id: notifier-group + brokers: kafka:29092 diff --git a/notifier/configs/values_local.yaml b/notifier/configs/values_local.yaml new file mode 100644 index 0000000..5b85d1d --- /dev/null +++ b/notifier/configs/values_local.yaml @@ -0,0 +1,6 @@ +kafka: + host: localhost + port: 29092 + order_topic: loms.order-events + consumer_group_id: notifier-group + brokers: localhost:29092 diff --git a/notifier/go.mod b/notifier/go.mod new file mode 100644 index 0000000..ad399c2 --- /dev/null +++ b/notifier/go.mod @@ -0,0 +1,3 @@ +module route256/notifier + +go 1.23.1