Rozszerzanie i współtworzenie
Przewodnik dla programistów
Ten przewodnik jest przeznaczony dla inżynierów budujących na platformie DataFlow AI Platform. Obejmuje układ monorepo, sposób skonfigurowania lokalnego środowiska deweloperskiego, polecenia budowania i testowania dla każdego komponentu, standardy kodowania wymuszane przez projekt, pętlę deweloperską Docker Compose, debugowanie, proces współtworzenia oraz sposób dodawania nowej usługi backendowej lub funkcji frontendowej.
Architektura w skrócie
DataFlow AI to platforma mikrousługowa z granicami usług zorientowanymi na domeny. API gateway stoi przed sześcioma usługami backendowymi, które współdzielą pojedynczą bazę danych PostgreSQL.
+-------------------+
| API Gateway |
| (Spring Cloud) |
| port 8080 |
+---------+---------+
|
+-------+-------+----+----+-------+-------+
| | | | | |
+----+--+ +--+---+ +-+------+ +---+--+ +--+--+ +---+----+
|Metadata| |Engine| |Lineage | |Monitor| | AI | |Migrate |
|Service | | | |Service | |Service| |Copilot| |Engine |
| :8081 | | :8082| | :8084 | | :8085 | | :8086| | :8087 |
+---+----+ +--+---+ +---+----+ +---+---+ +--+--+ +---+---+
| | | | | |
+----------+---------+----------+--------+---------+
|
+------+------+
| PostgreSQL |
| (shared DB) |
+-------------+
Odpowiedzialności usług
| Usługa | Język | Port | Odpowiedzialność |
|---|---|---|---|
| api-gateway | Kotlin | 8080 | Routing, ograniczanie liczby żądań, przekazywanie uwierzytelniania, proxy SSE/WS |
| metadata-service | Kotlin | 8081 | CRUD pipeline'ów, połączenia, reguły jakości, katalog, audyt |
| pipeline-engine | Kotlin | 8082 | Kompilacja, wykonywanie, harmonogramowanie, Git, orkiestracja |
| lineage-service | Kotlin | 8084 | Graf lineage, lineage kolumn, analiza wpływu, wyszukiwanie |
| monitor-service | Kotlin | 8085 | Metryki dashboardu, alerty, strumieniowanie SSE, kondycja systemu |
| copilot (AI) | Python | 8086 | NL-do-pipeline, czat, generowanie SQL, RAG, sugestie |
| migration-engine | Python | 8087 | Konwersja XML PowerCenter / YXMD Alteryx do YAML |
| cli | Go | — | Interfejs wiersza poleceń dla programistów |
Komunikacja jest synchroniczna REST między gateway'em a usługami, SSE dla strumieniowania alertów/metryk oraz WebSocket dla statusu pipeline'ów. Kafka do zorientowanego na zdarzenia przyjmowania lineage jest planowana, ale jeszcze nie podłączona.
Układ monorepo
Repozytorium to wielojęzyczne monorepo. Katalogi najwyższego poziomu istotne dla rozwoju to:
polcomtel/
├── backend/
│ ├── platform/ Kotlin services (Gradle multi-project build)
│ │ ├── api-gateway/
│ │ ├── metadata-service/
│ │ ├── pipeline-engine/
│ │ ├── lineage-service/
│ │ ├── monitor-service/
│ │ ├── common/ Shared model + enums
│ │ ├── connector-sdk/ Connector framework + 21 connectors
│ │ ├── pushdown-sql/ SQL dialect / push-down support
│ │ ├── integration-tests/
│ │ ├── settings.gradle.kts
│ │ └── gradlew
│ ├── ai-services/ Python services (Poetry)
│ │ ├── copilot/
│ │ └── migration-engine/
│ ├── cli/ Go CLI (cmd/, internal/, pkg/)
│ ├── docker/
│ ├── docker-compose.yml
│ └── Makefile
├── frontend/ React + Vite + TypeScript SPA
│ └── src/ api/, auth/, components/, pages/, hooks/, stores/
├── docs/ Markdown reference docs + OpenAPI specs
├── docs-ts/ This documentation site (Next.js + Markdoc)
└── scripts/
Systemy budowania według komponentu
| Komponent | Język | Narzędzie budowania | Manifest |
|---|---|---|---|
backend/platform/* | Kotlin | Gradle (multi-project) | settings.gradle.kts, build.gradle.kts |
backend/ai-services/* | Python | Poetry | pyproject.toml |
backend/cli | Go | moduły Go | go.mod |
frontend | TypeScript / React | Vite + npm | package.json |
docs-ts | TypeScript / Next.js | npm | package.json |
Usługi Kotlina to pojedyncze wieloprojektowe budowanie Gradle zakorzenione w backend/platform/settings.gradle.kts; moduły adresuje się ścieżkami takimi jak :platform:metadata-service.
Konfiguracja lokalnego środowiska deweloperskiego
Wymagania wstępne
| Narzędzie | Wersja | Instalacja |
|---|---|---|
| JDK | 21+ | sdk install java 21-graal (SDKMAN) |
| Gradle | 8.x | Dołączony przez wrapper ./gradlew |
| Python | 3.12+ | pyenv install 3.12 |
| Poetry | 1.8+ | curl -sSL install.python-poetry.org | python3 |
| Go | 1.22+ | go install golang.org/dl/go1.22@latest |
| Node.js | 20+ | nvm install 20 |
| Docker | 24+ | Docker Desktop lub colima |
| Docker Compose | 2.x | Dołączony do Docker Desktop |
Uruchomienie lokalnej infrastruktury
# From backend/ — start PostgreSQL, Keycloak, and Redis
docker-compose up -d
# Verify the stack
docker-compose ps
Stos Compose uruchamia:
| Usługa | Wersja | Port | Uwagi |
|---|---|---|---|
| PostgreSQL | 15 | 5432 | Współdzielona baza danych dla wszystkich usług |
| Keycloak | 24 | 9090 | Dostawca tożsamości — login administratora admin/admin |
| Redis | latest | 6379 | Wspiera ograniczanie liczby żądań gateway'a |
Polecenia budowania i testowania dla poszczególnych komponentów
Usługi Kotlina (Gradle)
Uruchom usługę lokalnie zadaniem Spring Boot bootRun:
# Run each service on its port
./gradlew :platform:metadata-service:bootRun # 8081
./gradlew :platform:pipeline-engine:bootRun # 8082
./gradlew :platform:lineage-service:bootRun # 8084
./gradlew :platform:monitor-service:bootRun # 8085
./gradlew :platform:api-gateway:bootRun # 8080
| Zadanie | Polecenie |
|---|---|
| Zbuduj wszystko | ./gradlew build |
| Wszystkie testy jednostkowe | ./gradlew test |
| Testy jednego modułu | ./gradlew :platform:metadata-service:test |
| Testy z pokryciem | ./gradlew test jacocoTestReport |
| Testy integracyjne (wymagany Docker) | ./gradlew integrationTest |
| Lint Kotlina | ./gradlew ktlintCheck |
Usługi AI w Pythonie (Poetry)
# Copilot service (port 8086)
cd backend/ai-services/copilot
poetry install
poetry run uvicorn copilot.main:app --host 0.0.0.0 --port 8086 --reload
# Migration engine (port 8087)
cd backend/ai-services/migration-engine
poetry install
poetry run uvicorn migration.main:app --host 0.0.0.0 --port 8087 --reload
| Zadanie | Polecenie |
|---|---|
| Zainstaluj zależności | poetry install |
| Uruchom testy Copilota | poetry run pytest tests/ -v (w copilot/) |
| Uruchom testy Migration | poetry run pytest tests/ -v (w migration-engine/) |
| Lint Pythona | poetry run ruff check . |
CLI w Go
cd backend/cli
go build -o dataflow ./cmd
# Verify
./dataflow version
./dataflow login --server http://localhost:8080
| Zadanie | Polecenie |
|---|---|
| Budowanie | go build -o dataflow ./cmd |
| Test | go test ./... |
| Formatowanie | gofmt -w . |
Frontend
cd frontend
npm install
npm run dev # Vite dev server at http://localhost:5173
| Zadanie | Polecenie |
|---|---|
| Zainstaluj zależności | npm install |
| Serwer deweloperski | npm run dev |
| Budowanie produkcyjne | npm run build |
| Testy (pojedyncze uruchomienie) | npm run test:run |
| Testy (tryb watch) | npm run test |
| Testy z pokryciem | npm run test:coverage |
| Lint | ESLint przez konfigurację projektu |
Walidacja specyfikacji OpenAPI
cd docs/api
npx vitest run __tests__/validate-openapi.test.ts
Lokalna pętla deweloperska Docker Compose
Typowa sesja pętli wewnętrznej łączy skonteneryzowaną infrastrukturę z lokalnie uruchomionymi usługami, dzięki czemu możesz przeładowywać na gorąco (hot-reload) komponent, nad którym pracujesz.
| Krok | Działanie |
|---|---|
| 1 | docker-compose up -d z backend/, aby uruchomić PostgreSQL, Keycloak, Redis |
| 2 | docker-compose ps, aby potwierdzić, że wszystkie trzy są zdrowe (healthy) |
| 3 | Uruchom zmienianą usługę (usługi) za pomocą bootRun / uvicorn --reload / npm run dev |
| 4 | Uruchom gateway (:platform:api-gateway:bootRun), aby frontend miał pojedynczy punkt wejścia |
| 5 | Edytuj, zapisz, pozwól serwerowi deweloperskiemu przeładować się; ponownie uruchom odpowiednie zadanie testowe |
| 6 | docker-compose down po zakończeniu (down -v, aby usunąć wolumeny dla czystej bazy danych) |
Uruchamiaj tylko to, czego dotykasz
Rzadko potrzebujesz, aby działała każda usługa. Aby pracować nad lineage, uruchom PostgreSQL przez Compose, uruchom :platform:lineage-service:bootRun oraz :platform:api-gateway:bootRun i pozostaw pozostałe zatrzymane. Gateway toleruje brak usług w dół łańcucha i zwraca jasny błąd dla tras, które ich wymagają.
Debugowanie
| Komponent | Jak debugować |
|---|---|
| Usługi Kotlina | bootRun udostępnia JVM; podłącz zdalny debugger lub uruchom klasę Application usługi bezpośrednio z IDE |
| Usługi Pythona | Uruchom uvicorn z --reload; użyj pdb/debugpy lub podłącz debugger IDE do procesu Uvicorn |
| CLI w Go | Zbuduj przez go build i uruchom pod dlv (Delve) lub użyj debuggera Go w IDE na ./cmd |
| Frontend | Serwer deweloperski Vite dostarcza source mapy; użyj DevTools przeglądarki i React DevTools |
| Kontrakty API | Uruchom dowolną usługę i otwórz /swagger-ui.html lub załaduj specyfikację z docs/api/ do Swagger Editor |
Specyfikacje OpenAPI
Pełne specyfikacje OpenAPI znajdują się w docs/api/:
| Plik specyfikacji | Usługa |
|---|---|
openapi-metadata.yaml | metadata-service |
openapi-pipeline-engine.yaml | pipeline-engine |
openapi-monitor.yaml | monitor-service |
openapi-lineage.yaml | lineage-service |
openapi-gateway.yaml | api-gateway (zagregowana, z uwierzytelnianiem) |
Standardy kodowania
Projekt wymusza jeden styl na język. CI uruchamia odpowiedni linter i zawiesza budowanie przy naruszeniu.
| Język | Linter / formater | Reguły |
|---|---|---|
| Kotlin | ktlint | Reguły domyślne, wcięcie 4-spacjowe |
| Python | ruff + Black | Reguły domyślne, długość wiersza 120 znaków |
| Go | gofmt | Standardowe formatowanie |
| TypeScript / React | ESLint + Prettier | Konfiguracja ESLint projektu |
Uruchom lintery przed wypchnięciem (push):
./gradlew ktlintCheck # Kotlin
poetry run ruff check . # Python (from a service directory)
gofmt -l . # Go — lists files needing formatting
Proces współtworzenia
Nazewnictwo gałęzi
feature/<ticket-id>-<short-description> # New features
fix/<ticket-id>-<short-description> # Bug fixes
refactor/<description> # Refactoring
docs/<description> # Documentation only
Przykłady: feature/DF-1234-add-kafka-connector, fix/DF-5678-scheduler-timezone-bug.
Format komunikatu commita
Projekt stosuje Conventional Commits:
<type>(<scope>): <subject>
<body>
<footer>
| Pole | Dozwolone wartości |
|---|---|
type | feat, fix, refactor, test, docs, chore, ci |
scope | metadata, engine, lineage, monitor, copilot, migration, gateway, cli, ui |
feat(engine): add Kafka streaming connector support
Implements KafkaConnector extending NativeConnectorBase with
consumer group management, offset tracking, and exactly-once
semantics via idempotent producer.
Closes: DF-1234
Proces pull request
- Utwórz gałąź feature z
main. - Zaimplementuj zmianę razem z jej testami.
- Upewnij się, że wszystkie testy przechodzą:
./gradlew test. - Upewnij się, że lint przechodzi:
./gradlew ktlintCheck(Kotlin),poetry run ruff check .(Python). - Wypchnij gałąź i otwórz PR na GitHubie.
- PR można scalić, gdy ma co najmniej jedno zatwierdzenie od właściciela kodu (code owner), wszystkie kontrole CI przechodzą (budowanie, test, lint, skanowanie bezpieczeństwa) i nie ma konfliktów scalania.
- Scal do
mainmetodą squash-merge.
Testy nie są opcjonalne
PR dodający funkcję bez testów nie przejdzie recenzji. Testy jednostkowe to minimum; jeśli zmiana dotyka granicy usługi lub bazy danych, dodaj test integracyjny uruchamiany pod ./gradlew integrationTest na stosie Docker.
Dodawanie nowej usługi backendowej
Nowa usługa Kotlina dołącza do wieloprojektowego budowania Gradle. Kroki wysokiego poziomu:
| Krok | Działanie |
|---|---|
| 1 | Utwórz backend/platform/<service-name>/ z plikiem build.gradle.kts |
| 2 | Dodaj include(":platform:<service-name>") do settings.gradle.kts |
| 3 | Zależ od :platform:common dla współdzielonego modelu i enumów |
| 4 | Wybierz nieużywany port (8081–8087 są zajęte) i ustaw go w konfiguracji usługi |
| 5 | Dodaj trasę w api-gateway, aby usługa była osiągalna przez port 8080 |
| 6 | Napisz specyfikację OpenAPI w docs/api/ i podłącz ją do testu walidacji |
| 7 | Jeśli usługa posiada tabele, dodaj migracje bazy danych do współdzielonego schematu PostgreSQL |
| 8 | Dodaj testy jednostkowe; dodaj testy integracyjne w :platform:integration-tests |
Usługa AI w Pythonie ma tę samą formę w backend/ai-services/: projekt Poetry z pyproject.toml, aplikacja FastAPI serwowana przez Uvicorn, katalog tests/ testowany przez pytest oraz trasa gateway'a.
Dodawanie nowej funkcji frontendowej
Frontend to jednostronicowa aplikacja React + Vite + TypeScript. Kod źródłowy jest zorganizowany według odpowiedzialności w frontend/src/:
| Katalog | Zawartość |
|---|---|
api/ | Typowane moduły klienta API dla poszczególnych domen backendu |
auth/ | Integracja z Keycloakiem i stan uwierzytelniania |
components/ | Komponenty interfejsu wielokrotnego użytku |
pages/ | Komponenty stron na poziomie tras |
hooks/ | Niestandardowe hooki React |
stores/ | Stan po stronie klienta |
router.tsx | Tablica tras |
Aby dodać funkcję:
| Krok | Działanie |
|---|---|
| 1 | Dodaj komponent strony w src/pages/ |
| 2 | Zarejestruj jej trasę w src/router.tsx |
| 3 | Dodaj typowany moduł API w src/api/, który wywołuje backend przez gateway |
| 4 | Wyodrębnij współdzielony interfejs do src/components/ |
| 5 | Dodaj testy komponentów/jednostkowe; uruchom npm run test:run |
| 6 | Zweryfikuj na serwerze deweloperskim: npm run dev, otwórz http://localhost:5173 |
Rozmawiaj z gateway'em, nie z usługami
Moduły API frontendu powinny wywoływać API gateway na porcie 8080, nigdy bezpośrednio portu usługi backendowej. Gateway obsługuje przekazywanie uwierzytelniania, ograniczanie liczby żądań oraz proxy SSE/WebSocket — pomijanie go psuje te gwarancje i zawiedzie we wdrożonych środowiskach.
Przegląd poleceń
| Cel | Polecenie |
|---|---|
| Uruchom infrastrukturę | docker-compose up -d (z backend/) |
| Uruchom usługę Kotlina | ./gradlew :platform:<service>:bootRun |
| Zbuduj wszystkie moduły Kotlina | ./gradlew build |
| Wszystkie testy jednostkowe Kotlina | ./gradlew test |
| Testy integracyjne Kotlina | ./gradlew integrationTest |
| Lint Kotlina | ./gradlew ktlintCheck |
| Uruchom usługę Pythona | poetry run uvicorn <module>.main:app --reload --port <port> |
| Testy Pythona | poetry run pytest tests/ -v |
| Lint Pythona | poetry run ruff check . |
| Zbuduj CLI | go build -o dataflow ./cmd |
| Uruchom frontend | npm run dev |
| Testy frontendu | npm run test:run |
| Zwaliduj specyfikacje OpenAPI | npx vitest run __tests__/validate-openapi.test.ts (z docs/api/) |