chore(ci): Align GH Workflows with Docker SSoT, new paths; minimal SSoT guard; staticAnalysis (#23)
* chore(MP-21): snapshot pre-refactor state (Epic 1)
* chore(MP-22): scaffold new repo structure, relocate Docker Compose, move frontend/backend modules, update Makefile; add docs mapping and env template
* MP-22 Epic 2: Erfolgreich umgesetzt und verifiziert
* MP-23 Epic 3: Gradle/Build Governance zentralisieren
* MP-23 Epic 3: Gradle/Build Governance zentralisieren
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(devops)!: Docker-SSoT (.env) konsolidiert, Compose-Mounts ergänzt, Makefile entfernt
- ENV Single Source of Truth
- docker/.env.example neu (inkl. REDIS_PASSWORD, Ports, Build-Overrides)
- config/.env(.example) als DEPRECATED markiert (Verweis auf docker/.env[.example])
- Docker Compose vereinheitlicht (docker/docker-compose.yaml)
- Postgres: zentralen postgresql.conf mounten (../config/postgres/postgresql.conf)
und Start mit -c config_file=/etc/postgresql/postgresql.conf
- Redis: zentralen redis.conf mounten (../config/redis/redis.conf)
und Start via "redis-server … ${REDIS_PASSWORD:+--requirepass $REDIS_PASSWORD}"
- Web-Nginx: ../config/nginx/nginx.prod.conf → /etc/nginx/nginx.conf (ro)
- Monitoring: Prometheus/Grafana nutzen ../config/monitoring/* als SSoT
- Frontend/DI/Network (MP-23 Grundlage)
- :frontend:core:network Modul mit Koin `apiClient` (Ktor + JSON/Retry/Timeout/Logging)
- Plattform-Basis-URL-Auflösung (JVM: ENV API_BASE_URL; JS: globalThis.API_BASE_URL / Same-Origin)
- Web index.html setzt API_BASE_URL (Query `?apiBaseUrl=…` > Same-Origin > Fallback)
- Build/Gradle & Module-Refs
- settings.gradle.kts: neue Frontend-/Backend-Pfade bereits inkludiert
- Features/Shell: Abhängigkeiten auf :frontend:shared / :frontend:core:* angepasst
- Ping-API-Refs auf :backend:services:ping:ping-api vereinheitlicht
- Dockerfiles angepasst
- backend/infrastructure/gateway/Dockerfile → Tasks/Pfade auf :backend:gateway
- backend/services/ping/Dockerfile → Tasks/Pfade auf :backend:services:ping:ping-service
- Static Analysis / Guards
- config/detekt/detekt.yml hinzugefügt
- Leichter Arch-Guard (Frontend) gegen manuelle Authorization-Header vorbereitet
- Doku
- docs/ARCHITECTURE.md (Struktur, Mapping, Next Steps) ergänzt
- docs/adr/README.md angelegt
BREAKING CHANGES:
- Makefile komplett entfernt (bitte direkt `docker compose` verwenden)
- ENV-Quelle ist jetzt docker/.env (statt config/.env oder Root)
- Compose-Datei unter docker/docker-compose.yaml (nicht mehr compose.yaml im Repo-Root)
Verifikation (lokal):
- ENV anlegen: `cp docker/.env.example docker/.env` (Werte anpassen)
- Compose prüfen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml config`
- Infrastruktur: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle up -d postgres redis keycloak web-app`
- Services bauen: `docker compose --env-file docker/.env -f docker/docker-compose.yaml -p meldestelle build api-gateway ping-service --no-cache --progress=plain`
Refs: MP-22 (Epic 2), MP-23 (Epic 3)
* chore(ci): Workflows an Docker-SSoT & neue Struktur angepasst, minimaler SSoT-Guard
- ssot-guard.yml: Option B (minimal) → `docker compose -f docker/docker-compose.yaml config` als Lint
- integration-tests.yml: `./gradlew staticAnalysis` vor Integrationstests
- docs-kdoc-sync.yml: Dokka-Task Fallback (dokkaGfmAll || dokkaGfm), YouTrack-Sync nur wenn Script vorhanden
- deploy-proxmox.yml: Compose-Pfade auf docker/docker-compose.yaml + `--env-file docker/.env`; Build/Test Schritte vereinheitlicht
- ci-main.yml: SSoT-Skripte per `if: hashFiles(...)` guarded, Compose-Lint Fallback; OpenAPI‑Pfad → backend/gateway; ADR‑Pfade → docs/adr/**; `staticAnalysis` in Build integriert
- youtrack-sync.yml: unverändert (funktional)
Refs: MP-22, MP-23
* chore(ci): Workflows an Docker-SSoT & neue Struktur angepasst, minimaler SSoT-Guard
- ssot-guard.yml: Option B (minimal) → `docker compose -f docker/docker-compose.yaml config` als Lint
- integration-tests.yml: `./gradlew staticAnalysis` vor Integrationstests
- docs-kdoc-sync.yml: Dokka-Task Fallback (dokkaGfmAll || dokkaGfm), YouTrack-Sync nur wenn Script vorhanden
- deploy-proxmox.yml: Compose-Pfade auf docker/docker-compose.yaml + `--env-file docker/.env`; Build/Test Schritte vereinheitlicht
- ci-main.yml: SSoT-Skripte per `if: hashFiles(...)` guarded, Compose-Lint Fallback; OpenAPI‑Pfad → backend/gateway; ADR‑Pfade → docs/adr/**; `staticAnalysis` in Build integriert
- youtrack-sync.yml: unverändert (funktional)
Refs: MP-22, MP-23
* fix(ci): create .env from example before validating compose config
* fix(ci): update ssot-guard filename (.yaml) and sync workflow state
* fixing
* fix(webpack): correct sql.js fallback configuration for webpack 5
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
// Dieses Modul ist eine wiederverwendbare Bibliothek, die von jedem Microservice
|
||||
// eingebunden wird, um Metriken und Tracing-Daten zu exportieren.
|
||||
plugins {
|
||||
`java-library`
|
||||
alias(libs.plugins.kotlinJvm)
|
||||
alias(libs.plugins.kotlinSpring)
|
||||
alias(libs.plugins.spring.dependencyManagement)
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Stellt sicher, dass alle Versionen aus der zentralen BOM kommen.
|
||||
implementation(platform(projects.platform.platformBom))
|
||||
// Stellt gemeinsame Abhängigkeiten bereit.
|
||||
implementation(projects.platform.platformDependencies)
|
||||
// OPTIMIERUNG: Verwendung des `monitoring-client`-Bundles.
|
||||
// Es enthält Spring Boot Actuator, Micrometer Prometheus und Zipkin Tracing.
|
||||
implementation(libs.bundles.monitoring.client)
|
||||
}
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
package at.mocode.infrastructure.monitoring.client
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfiguration
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass
|
||||
import org.springframework.context.annotation.PropertySource
|
||||
|
||||
/**
|
||||
* AutoConfiguration für das Monitoring-Client-Modul.
|
||||
*
|
||||
* Lädt konservative Default-Properties mit niedriger Priorität, die in jeder Anwendung
|
||||
* leicht per application.properties/-yaml überschrieben werden können.
|
||||
*/
|
||||
@AutoConfiguration
|
||||
@ConditionalOnClass(name = [
|
||||
"org.springframework.boot.actuate.autoconfigure.metrics.MetricsAutoConfiguration",
|
||||
"io.micrometer.core.instrument.MeterRegistry"
|
||||
])
|
||||
@PropertySource("classpath:monitoring-defaults.properties")
|
||||
class MonitoringClientAutoConfiguration
|
||||
+1
@@ -0,0 +1 @@
|
||||
at.mocode.infrastructure.monitoring.client.MonitoringClientAutoConfiguration
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
# ===================================================================
|
||||
# MELDENSTELLE - MONITORING CLIENT DEFAULTS (via AutoConfiguration)
|
||||
# diese Konfigurationen werden automatisch von jedem Service übernommen,
|
||||
# der das monitoring-client-Modul einbindet. Sie können in der Anwendung
|
||||
# jederzeit überschrieben werden.
|
||||
# ===================================================================
|
||||
|
||||
# --- Spring Boot Actuator ---
|
||||
# Stellt die /actuator Endpunkte bereit (health, info, prometheus)
|
||||
management.endpoints.web.exposure.include=health,info,prometheus
|
||||
|
||||
# --- Micrometer Tracing ---
|
||||
# Aktiviert das Tracing
|
||||
management.tracing.enabled=true
|
||||
# Definiert Sampling-Rate für Traces (kann per Umgebungsvariable überschrieben werden)
|
||||
# Entwicklung: 1.0 (100%), Produktion sollte niedriger sein (z.B. 0.1 = 10%)
|
||||
management.tracing.sampling.probability=${TRACING_SAMPLING_PROBABILITY:1.0}
|
||||
|
||||
# --- Micrometer Observation (für Metriken UND Tracing) ---
|
||||
# aktiviert die "Beobachtung" von HTTP Server Requests.
|
||||
# Dies erzeugt automatisch Metriken (Timer) UND Traces für eingehende Anfragen.
|
||||
management.observations.http.server.requests.enabled=true
|
||||
|
||||
# Fügt Anwendungs-Informationen zu den Metriken hinzu
|
||||
management.info.env.enabled=true
|
||||
|
||||
# Definiert den Standard-Endpunkt, an den die Traces gesendet werden.
|
||||
management.zipkin.tracing.endpoint=http://zipkin:9411/api/v2/spans
|
||||
@@ -0,0 +1,34 @@
|
||||
// Dieses Modul ist ein eigenständiger Spring Boot Service, der den
|
||||
// Zipkin-Server mit seiner UI hostet, um Tracing-Daten zu visualisieren.
|
||||
plugins {
|
||||
alias(libs.plugins.kotlinJvm)
|
||||
alias(libs.plugins.kotlinSpring)
|
||||
alias(libs.plugins.spring.boot)
|
||||
alias(libs.plugins.spring.dependencyManagement)
|
||||
}
|
||||
|
||||
// Konfiguriert die Hauptklasse für das ausführbare JAR.
|
||||
springBoot {
|
||||
mainClass.set("at.mocode.infrastructure.monitoring.MonitoringServerApplicationKt")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
// Stellt sicher, dass alle Versionen aus der zentralen BOM kommen.
|
||||
implementation(platform(projects.platform.platformBom))
|
||||
// Stellt gemeinsame Abhängigkeiten bereit.
|
||||
implementation(projects.platform.platformDependencies)
|
||||
// Spring Boot Starter für einen einfachen Web-Service.
|
||||
implementation(libs.spring.boot.starter.web)
|
||||
implementation(libs.spring.boot.starter.actuator)
|
||||
// Abhängigkeiten für den Zipkin-Server (UI ist via zipkin-lens bereits enthalten).
|
||||
implementation(libs.zipkin.server)
|
||||
// Prometheus client für Zipkin Metriken
|
||||
implementation(libs.micrometer.prometheus)
|
||||
// Stellt alle Test-Abhängigkeiten gebündelt bereit.
|
||||
testImplementation(projects.platform.platformTesting)
|
||||
testImplementation(libs.logback.classic) // SLF4J provider for tests
|
||||
}
|
||||
|
||||
tasks.test {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
package at.mocode.infrastructure.monitoring
|
||||
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||
import org.springframework.boot.runApplication
|
||||
|
||||
/**
|
||||
* Startet den Zipkin-Server.
|
||||
*
|
||||
* Spring Boot erkennt die 'zipkin-server'-Abhängigkeit im Classpath
|
||||
* und konfiguriert den Server automatisch. Eine explizite @EnableZipkinServer
|
||||
* Annotation ist nicht mehr erforderlich.
|
||||
*/
|
||||
@SpringBootApplication
|
||||
class MonitoringServerApplication
|
||||
|
||||
fun main(args: Array<String>) {
|
||||
runApplication<MonitoringServerApplication>(*args)
|
||||
}
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
# ===================================================================
|
||||
# MELDENSTELLE - ZIPKIN SERVER CONFIGURATION
|
||||
# ===================================================================
|
||||
|
||||
# Standard-Port für die Zipkin UI und API
|
||||
server.port=9411
|
||||
|
||||
# Port für die Spring Boot Actuator Endpunkte (getrennt vom Haupt-Port)
|
||||
# management.server.port=9412 # Disabled for test compatibility
|
||||
management.endpoints.web.exposure.include=health,info,prometheus
|
||||
|
||||
# --- Zipkin Core ---
|
||||
# Speichertyp. 'mem' für Entwicklung, für Produktion Elasticsearch/MySQL/Cassandra verwenden.
|
||||
zipkin.storage.type=mem
|
||||
|
||||
# Deaktiviert das Tracing des Zipkin-Servers selbst, um Endlosschleifen
|
||||
# und unnötiges Rauschen zu verhindern. Dies ist eine wichtige Best Practice.
|
||||
zipkin.self-tracing.enabled=false
|
||||
management.tracing.enabled=false
|
||||
|
||||
# --- Logging ---
|
||||
# Stellt sicher, dass das Logging nicht zu gesprächig ist
|
||||
logging.level.zipkin2=INFO
|
||||
logging.level.org.springframework.boot.autoconfigure=INFO
|
||||
|
||||
# --- Spring Boot Auto-Configuration ---
|
||||
# Deaktiviert Armeria Auto-Configuration, da Zipkin seinen eigenen Server verwendet
|
||||
spring.autoconfigure.exclude=com.linecorp.armeria.spring.ArmeriaAutoConfiguration
|
||||
|
||||
# Folgende Properties wurden entfernt, da sie den Standardwerten in Zipkin 3.x entsprechen:
|
||||
# zipkin.ui.enabled=true (UI ist standardmäßig aktiv)
|
||||
# server.servlet.context-path=/ (Standard-Context-Path ist root)
|
||||
# management.zipkin.tracing.endpoint= (wird durch management.tracing.enabled=false obsolet)
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
package at.mocode.infrastructure.monitoring
|
||||
|
||||
import org.assertj.core.api.Assertions.assertThat
|
||||
import org.junit.jupiter.api.Test
|
||||
import org.springframework.beans.factory.annotation.Autowired
|
||||
import org.springframework.boot.test.context.SpringBootTest
|
||||
import org.springframework.context.ApplicationContext
|
||||
|
||||
/**
|
||||
* Testet, ob der Spring Application Context für den Monitoring-Server
|
||||
* erfolgreich geladen werden kann.
|
||||
*
|
||||
* Mit der Armeria Auto-Configuration Ausschluss-Konfiguration sollte der Context erfolgreich laden.
|
||||
* Verwendet RANDOM_PORT, um Konflikte mit bootRun-Tasks zu vermeiden.
|
||||
*/
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
|
||||
class MonitoringServerApplicationTest {
|
||||
|
||||
@Autowired
|
||||
private lateinit var context: ApplicationContext
|
||||
|
||||
@Test
|
||||
fun `context loads successfully`() {
|
||||
// Bestätigt, dass der gesamte Server-Kontext erfolgreich gestartet wurde.
|
||||
assertThat(context).isNotNull()
|
||||
}
|
||||
}
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
<configuration>
|
||||
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<encoder>
|
||||
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<root level="INFO">
|
||||
<appender-ref ref="CONSOLE" />
|
||||
</root>
|
||||
</configuration>
|
||||
Reference in New Issue
Block a user