Спасибо за интерес к проекту StreamFlow! Мы приветствуем любой вклад в развитие проекта.
- Code of Conduct
- Как внести вклад
- Процесс разработки
- Стандарты кодирования
- Тестирование
- Документация
- Коммуникация
Участвуя в проекте, вы соглашаетесь соблюдать правила взаимного уважения:
- 🤝 Будьте дружелюбны и уважительны
- 💬 Используйте понятный и профессиональный язык
- 🎯 Фокусируйтесь на конструктивной критике
- 🌍 Уважайте различные точки зрения и опыт
- ✨ Помогайте создавать позитивную атмосферу
- Проверьте, что баг еще не был зарегистрирован в Issues
- Создайте новый Issue с меткой
bug - Используйте четкий и описательный заголовок
- Опишите шаги для воспроизведения
- Приложите логи и скриншоты (если возможно)
- Укажите вашу версию Go, ОС, и версию StreamFlow
Шаблон Issue для бага:
## Описание
Краткое описание проблемы
## Шаги для воспроизведения
1.
2.
3.
## Ожидаемое поведение
Что должно было произойти
## Фактическое поведение
Что произошло на самом деле
## Окружение
- StreamFlow версия:
- Go версия:
- ОС:
- ClickHouse версия:
## Логи- Проверьте Issues и Roadmap
- Создайте Issue с меткой
enhancement - Опишите предлагаемую функциональность
- Объясните, зачем она нужна и кому будет полезна
- Приведите примеры использования
- Fork репозиторий
- Создайте feature branch (
git checkout -b feature/amazing-feature) - Внесите изменения
- Добавьте тесты для новой функциональности
- Убедитесь, что все тесты проходят
- Commit изменения (
git commit -m 'feat: Add amazing feature') - Push в branch (
git push origin feature/amazing-feature) - Создайте Pull Request
streamflow/
├── cmd/ # Точки входа приложений
├── internal/ # Внутренние пакеты
│ ├── banking/ # Banking Edition
│ ├── cache/ # Redis кэширование
│ ├── config/ # Конфигурация
│ ├── fraud/ # Fraud Detection
│ ├── security/ # TLS/JWT
│ └── ...
├── api/proto/ # gRPC протоколы
├── docs/ # Документация
├── test/ # Тесты
└── scripts/ # Утилиты
-
Branches:
master- стабильная версияdevelop- разработкаfeature/*- новые функцииbugfix/*- исправления баговhotfix/*- критичные исправления
-
Commit Messages (Conventional Commits):
<type>(<scope>): <subject> <body>Types:
feat: новая функцияfix: исправление багаdocs: документацияstyle: форматированиеrefactor: рефакторингtest: добавление тестовchore: обслуживание
Примеры:
feat(fraud): add velocity check rule fix(http): resolve rate limiting issue docs(security): update TLS guide test(banking): add transaction tests
- Обновите README.md если добавляете новую функцию
- Обновите документацию в
docs/ - Добавьте тесты (coverage должен остаться >= 35%)
- Запустите линтер:
make lint - Убедитесь, что все тесты проходят:
make test - Обновите CHANGELOG.md
- Получите код ревью от мейнтейнеров
- После одобрения - merge в
develop
Следуйте Effective Go и Uber Go Style Guide
-
Форматирование:
gofmt -s -w . goimports -w .
-
Naming Conventions:
- Используйте
camelCaseдля переменных - Используйте
PascalCaseдля экспортируемых функций - Избегайте аббревиатур (кроме общепринятых: HTTP, API, ID)
- Используйте
-
Error Handling:
// Good if err != nil { return fmt.Errorf("failed to process event: %w", err) } // Bad if err != nil { return err }
-
Logging:
// Используйте zerolog log.Info(). Str("event_id", eventID). Int("count", count). Msg("Events processed")
-
Context:
- Всегда передавайте
context.Contextкак первый параметр - Используйте
context.WithTimeoutдля внешних вызовов
- Всегда передавайте
Проект использует golangci-lint:
golangci-lint runКонфигурация в .golangci.yml (будет создана в Phase 1).
# Запуск всех тестов
make test
# Запуск с coverage
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.outmake bench# Требуется запущенный Docker
make docker-up
go test -tags=integration ./...- ✅ Все новые функции должны иметь unit тесты
- ✅ Coverage >= 70% для новых пакетов
- ✅ Используйте table-driven tests где возможно
- ✅ Моки для внешних зависимостей
- ✅ Benchmarks для критичных функций
Пример теста:
func TestEventProcessor_Process(t *testing.T) {
tests := []struct {
name string
event models.Event
wantErr bool
}{
{
name: "valid event",
event: models.Event{
ID: "evt-1",
Type: "test",
},
wantErr: false,
},
// ... more test cases
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// Test logic
})
}
}- Все экспортируемые функции должны иметь godoc комментарии
- Комментарии начинаются с имени функции/типа
- Используйте полные предложения
// ProcessEvent обрабатывает входящее событие и сохраняет его в хранилище.
// Возвращает ошибку, если событие невалидно или не может быть сохранено.
func ProcessEvent(ctx context.Context, event Event) error {
// implementation
}- Используйте Markdown
- Структурируйте с помощью заголовков
- Добавляйте примеры кода
- Включайте дату и версию в начало документа
- Используйте эмодзи для улучшения читаемости
При добавлении новых функций обновите:
- Список возможностей
- Примеры использования
- Конфигурационные параметры
- Roadmap (если применимо)
- GitHub Issues - для багов и feature requests
- GitHub Discussions - для вопросов и идей
- Pull Requests - для код ревью
- Telegram - @shuldeshoff для срочных вопросов
- Документация: Русский или English
- Код и комментарии: English
- Issues/PRs: Русский или English
- Commit messages: English
-
Установите зависимости:
# Go 1.21+ # Docker & Docker Compose # ClickHouse CLI (опционально)
-
Клонируйте репозиторий:
git clone https://github.com/sul/streamflow cd streamflow -
Установите зависимости Go:
go mod download
-
Запустите зависимости:
make docker-up
-
Скопируйте конфигурацию:
cp env.example .env
-
Соберите проект:
make build
-
Запустите тесты:
make test
make build # Сборка
make test # Тесты
make bench # Benchmarks
make lint # Линтер
make fmt # Форматирование
make docker-up # Запуск Docker сервисов
make docker-down # Остановка Docker сервисовСпасибо всем, кто вносит вклад в проект!
Внося вклад в проект, вы соглашаетесь, что ваш код будет лицензирован под MIT License.
Если у вас есть вопросы о процессе контрибуции:
- Создайте GitHub Discussion
- Напишите в Telegram: @shuldeshoff
Спасибо за ваш вклад в StreamFlow! 🌊
Автор: Шульдешов Юрий Леонидович
Telegram: @shuldeshoff