Skip to content

Commit a1bb1db

Browse files
germanosingit-halinka
authored andcommitted
Infra: Add gradle p.1 (kafbat#783)
1 parent a1f4db4 commit a1bb1db

20 files changed

+989
-7
lines changed

.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,6 @@ build/
4343

4444
/docker/*.override.yaml
4545
/e2e-tests/allure-results/
46+
out/
47+
node_modules/
48+
.gradle

api/Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ RUN chown kafkaui /etc/kafkaui
1717
USER kafkaui
1818

1919
ARG JAR_FILE
20-
COPY "/target/${JAR_FILE}" "/api.jar"
20+
COPY $JAR_FILE "/api.jar"
2121

2222
ENV JAVA_OPTS=
2323

api/build.gradle

+130
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
2+
plugins {
3+
id 'antlr'
4+
id 'checkstyle'
5+
alias(libs.plugins.spring.boot)
6+
alias(libs.plugins.git.properties)
7+
alias(libs.plugins.docker.remote.api)
8+
}
9+
10+
import com.bmuschko.gradle.docker.tasks.image.DockerBuildImage
11+
12+
dependencies {
13+
implementation project(":contract")
14+
if (prod) {
15+
implementation project(":frontend")
16+
}
17+
implementation project(":serde-api")
18+
implementation libs.spring.starter.webflux
19+
implementation libs.spring.starter.security
20+
implementation libs.spring.starter.actuator
21+
implementation libs.spring.starter.logging
22+
implementation libs.spring.starter.oauth2.client
23+
implementation libs.spring.boot.actuator
24+
compileOnly libs.spring.boot.devtools
25+
26+
implementation libs.spring.security.ldap
27+
28+
implementation libs.kafka.clients
29+
30+
implementation libs.apache.avro
31+
implementation libs.apache.commons
32+
implementation libs.apache.commons.pool2
33+
implementation libs.apache.datasketches
34+
35+
implementation libs.confluent.schema.registry.client
36+
implementation libs.confluent.avro.serializer
37+
implementation libs.confluent.protobuf.serializer
38+
implementation libs.confluent.json.schema.serializer
39+
40+
implementation libs.aws.msk.auth
41+
implementation (libs.azure.identity) {
42+
exclude group: 'io.netty', module: 'netty-tcnative-boringssl-static'
43+
}
44+
45+
implementation libs.jackson.databind.nullable
46+
implementation libs.cel
47+
antlr libs.antlr
48+
implementation libs.antlr.runtime
49+
50+
implementation libs.opendatadiscovery.oddrn
51+
implementation (libs.opendatadiscovery.client) {
52+
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-webflux'
53+
exclude group: 'io.projectreactor', module: 'reactor-core'
54+
exclude group: 'io.projectreactor.ipc', module: 'reactor-netty'
55+
}
56+
57+
runtimeOnly libs.micrometer.registry.prometheus
58+
59+
// CVE Fixes
60+
implementation libs.apache.commons.compress
61+
implementation libs.okhttp3.logging.intercepter
62+
63+
// Annotation processors
64+
implementation libs.lombok
65+
implementation libs.mapstruct
66+
annotationProcessor libs.lombok
67+
annotationProcessor libs.mapstruct.processor
68+
annotationProcessor libs.spring.boot.configuration.processor
69+
testAnnotationProcessor libs.lombok
70+
testAnnotationProcessor libs.mapstruct.processor
71+
72+
// Tests
73+
testImplementation libs.spring.starter.test
74+
testImplementation libs.reactor.test
75+
testImplementation libs.testcontainers
76+
testImplementation libs.testcontainers.kafka
77+
testImplementation libs.testcontainers.jupiter
78+
testImplementation libs.junit.jupiter.engine
79+
testImplementation libs.mockito.core
80+
testImplementation libs.mockito.jupiter
81+
testImplementation libs.bytebuddy
82+
testImplementation libs.assertj
83+
testImplementation libs.jsonschemavalidator
84+
85+
testImplementation libs.okhttp3
86+
testImplementation libs.okhttp3.mockwebserver
87+
}
88+
89+
generateGrammarSource {
90+
maxHeapSize = "64m"
91+
arguments += ["-package", "ksql"]
92+
}
93+
94+
sourceSets {
95+
main {
96+
antlr {
97+
srcDirs = ["src/main/antlr4"]
98+
}
99+
java {
100+
srcDirs += generateGrammarSource.outputDirectory
101+
}
102+
}
103+
}
104+
105+
tasks.withType(Checkstyle) {
106+
exclude '**/ksql/**'
107+
}
108+
109+
checkstyle {
110+
toolVersion = libs.versions.checkstyle.get()
111+
configFile = rootProject.file('etc/checkstyle/checkstyle.xml')
112+
ignoreFailures = false
113+
maxWarnings = 0
114+
maxErrors = 0
115+
}
116+
117+
test {
118+
useJUnitPlatform()
119+
}
120+
121+
tasks.register('buildDockerImage', DockerBuildImage) {
122+
inputDir = projectDir
123+
dockerFile = project.layout.projectDirectory.file('Dockerfile')
124+
buildArgs = [
125+
'JAR_FILE': "build/libs/${project.name}-${project.version}.jar"
126+
]
127+
images.add("ghcr.io/kafbat/kafka-ui:${project.version}")
128+
}
129+
130+
tasks.build.finalizedBy buildDockerImage

api/pom.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -460,10 +460,10 @@
460460
<goal>copy-resources</goal>
461461
</goals>
462462
<configuration>
463-
<outputDirectory>${basedir}/target/classes/static</outputDirectory>
463+
<outputDirectory>${basedir}/target/classes/</outputDirectory>
464464
<resources>
465465
<resource>
466-
<directory>../frontend/build</directory>
466+
<directory>../frontend/build/vite/static</directory>
467467
</resource>
468468
</resources>
469469
</configuration>
@@ -526,7 +526,7 @@
526526
<build>
527527
<contextDir>${project.basedir}</contextDir>
528528
<args>
529-
<JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
529+
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
530530
</args>
531531
</build>
532532
</image>

api/src/main/java/io/kafbat/ui/config/WebclientProperties.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package io.kafbat.ui.config;
22

33
import io.kafbat.ui.exception.ValidationException;
4-
import javax.annotation.PostConstruct;
4+
import jakarta.annotation.PostConstruct;
55
import lombok.Data;
66
import org.springframework.boot.context.properties.ConfigurationProperties;
77
import org.springframework.context.annotation.Configuration;

api/src/main/java/io/kafbat/ui/config/auth/RoleBasedAccessControlProperties.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package io.kafbat.ui.config.auth;
22

33
import io.kafbat.ui.model.rbac.Role;
4+
import jakarta.annotation.PostConstruct;
45
import java.util.ArrayList;
56
import java.util.List;
6-
import javax.annotation.PostConstruct;
77
import org.springframework.boot.context.properties.ConfigurationProperties;
88

99
@ConfigurationProperties("rbac")

build.gradle

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
plugins {
2+
alias(libs.plugins.nexus.publish.plugin)
3+
}
4+
5+
subprojects {
6+
apply plugin: "java"
7+
8+
repositories {
9+
mavenCentral()
10+
maven {
11+
name = 'confluent'
12+
url = 'https://packages.confluent.io/maven/'
13+
}
14+
}
15+
16+
group = 'io.kafbat'
17+
version = version
18+
19+
java {
20+
sourceCompatibility = JavaVersion.VERSION_21
21+
targetCompatibility = JavaVersion.VERSION_21
22+
}
23+
}
24+
25+
boolean resolveBooleanProperty(String propertyName, boolean defaultValue = false) {
26+
def propertyValueStr = findProperty(propertyName)
27+
return propertyValueStr == null ? defaultValue : propertyValueStr.toBoolean();
28+
}
29+
30+
ext {
31+
prod = resolveBooleanProperty("prod")
32+
}
33+
34+
if (prod) {
35+
nexusPublishing {
36+
repositories {
37+
sonatype {
38+
nexusUrl = uri("https://s01.oss.sonatype.org/service/local/")
39+
snapshotRepositoryUrl = uri("https://s01.oss.sonatype.org/content/repositories/snapshots/")
40+
41+
username = sonatypeUsername
42+
password = sonatypePassword
43+
}
44+
}
45+
}
46+
}
47+
48+

contract/build.gradle

+116
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
import org.openapitools.generator.gradle.plugin.tasks.GenerateTask
2+
3+
plugins {
4+
id "java-library"
5+
alias(libs.plugins.openapi.generator)
6+
}
7+
8+
9+
def specDir = project.layout.projectDirectory.dir("src/main/resources/swagger/")
10+
def targetDir = project.layout.buildDirectory.dir("generated").get()
11+
12+
dependencies {
13+
implementation libs.spring.starter.webflux
14+
implementation libs.spring.starter.validation
15+
api libs.swagger.integration.jakarta
16+
api libs.jackson.databind.nullable
17+
api libs.annotation.api
18+
compileOnly libs.lombok
19+
annotationProcessor libs.lombok
20+
}
21+
22+
tasks.register('generateUiClient', GenerateTask) {
23+
generatorName = "java"
24+
inputSpec = specDir.file("kafbat-ui-api.yaml").asFile.absolutePath
25+
outputDir = targetDir.dir("kafbat-ui-client").asFile.absolutePath
26+
apiPackage = "io.kafbat.ui.api.api"
27+
invokerPackage = "io.kafbat.ui.api"
28+
modelPackage = "io.kafbat.ui.api.model"
29+
30+
configOptions = [library : 'webclient',
31+
asyncNative : 'true',
32+
useBeanValidation: 'true',
33+
dateLibrary : 'java8',
34+
useJakartaEe : 'true',]
35+
}
36+
37+
tasks.register('generateBackendApi', GenerateTask) {
38+
generatorName = "spring"
39+
inputSpec = specDir.file("kafbat-ui-api.yaml").asFile.absolutePath
40+
outputDir = targetDir.dir("api").asFile.absolutePath
41+
apiPackage = "io.kafbat.ui.api"
42+
invokerPackage = "io.kafbat.ui.api"
43+
modelPackage = "io.kafbat.ui.model"
44+
modelNameSuffix = "DTO"
45+
46+
additionalProperties = [removeEnumValuePrefix: "false"]
47+
48+
configOptions = [reactive : "true",
49+
interfaceOnly : "true",
50+
skipDefaultInterface : "true",
51+
useTags : "true",
52+
useSpringBoot3 : "true",
53+
dateLibrary : "java8",
54+
generateConstructorWithAllArgs : "false",
55+
generatedConstructorWithRequiredArgs: "false",
56+
additionalModelTypeAnnotations : """
57+
@lombok.experimental.SuperBuilder
58+
@lombok.AllArgsConstructor
59+
@lombok.NoArgsConstructor
60+
"""]
61+
}
62+
63+
tasks.register('generateConnectClient', GenerateTask) {
64+
generatorName = "java"
65+
inputSpec = specDir.file("kafka-connect-api.yaml").asFile.absolutePath
66+
outputDir = targetDir.dir("kafka-connect-client").asFile.absolutePath
67+
generateApiTests = false
68+
generateModelTests = false
69+
apiPackage = "io.kafbat.ui.connect.api"
70+
modelPackage = "io.kafbat.ui.connect.model"
71+
invokerPackage = "io.kafbat.ui.connect"
72+
73+
74+
configOptions = [asyncNative : "true",
75+
library : "webclient",
76+
useJakartaEe : "true",
77+
useBeanValidation: "true",
78+
dateLibrary : "java8",]
79+
}
80+
81+
tasks.register('generateSchemaRegistryClient', GenerateTask) {
82+
generatorName = "java"
83+
inputSpec = specDir.file("kafka-sr-api.yaml").asFile.absolutePath
84+
outputDir = targetDir.dir("kafka-sr-client").asFile.absolutePath
85+
generateApiTests = false
86+
generateModelTests = false
87+
apiPackage = "io.kafbat.ui.sr.api"
88+
invokerPackage = "io.kafbat.ui.sr"
89+
modelPackage = "io.kafbat.ui.sr.model"
90+
91+
configOptions = [asyncNative : "true",
92+
library : "webclient",
93+
useJakartaEe : "true",
94+
useBeanValidation: "true",
95+
dateLibrary : "java8",]
96+
}
97+
98+
sourceSets {
99+
main {
100+
java {
101+
srcDir targetDir.dir("api/src/main/java")
102+
srcDir targetDir.dir("kafka-connect-client/src/main/java")
103+
srcDir targetDir.dir("kafbat-ui-client/src/main/java")
104+
srcDir targetDir.dir("kafka-sr-client/src/main/java")
105+
}
106+
107+
resources {
108+
srcDir specDir
109+
}
110+
}
111+
}
112+
113+
compileJava.dependsOn generateUiClient, generateBackendApi, generateConnectClient, generateSchemaRegistryClient
114+
processResources.dependsOn generateUiClient, generateBackendApi, generateConnectClient, generateSchemaRegistryClient
115+
116+

e2e-tests/build.gradle

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
plugins {
2+
id 'java'
3+
id 'checkstyle'
4+
alias(libs.plugins.allure)
5+
}
6+
7+
dependencies {
8+
implementation project(":contract")
9+
implementation libs.apache.kafka
10+
implementation libs.apache.commons.io
11+
implementation libs.aspectj
12+
implementation libs.testng
13+
implementation libs.codeborne.selenide
14+
implementation libs.allure.testng
15+
implementation libs.allure.selenide
16+
implementation libs.bonigarcia.webdrivermanager
17+
implementation libs.spring.starter.webflux
18+
implementation libs.netty.resolver.dns.native
19+
20+
implementation libs.lombok
21+
22+
annotationProcessor libs.lombok
23+
testAnnotationProcessor libs.lombok
24+
}
25+
26+
checkstyle {
27+
toolVersion = libs.versions.checkstyle.get()
28+
configFile = rootProject.file('etc/checkstyle/checkstyle-e2e.xml')
29+
ignoreFailures = false
30+
maxWarnings = 10
31+
maxErrors = 0
32+
}
33+
34+
35+
test {
36+
useTestNG()
37+
}
38+
39+
tasks.named('test') {
40+
enabled = prod
41+
}
42+

0 commit comments

Comments
 (0)