diff --git a/.gitignore b/.gitignore index 6bb4bad..a8920dc 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,12 @@ **/.DS_Store **/classpath-data.json **/dependencies-and-licenses-overview.txt + + +gradle.properties +gradlew +gradlew.bat +gradle/ + +**/.gradle +**/build diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 74990df..ca4e5af 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,5 +3,21 @@ variables: include: - project: 'gitlab/gitlab' ref: 'main' - file: 'ci-templates/maven_java.yml' + file: 'ci-templates/gradle_java.yml' +deploy: + stage: deploy + tags: + - dind + script: + - echo "Building with gradle version ${BUILDVERSION}" + - gradle -Pversion=${BUILDVERSION} publish + - gradle bootBuildImage --cleanCache --publishImage -PbuildbootDockerHostNetwork=true -Pversion=${BUILDVERSION} + - echo "BUILDVERSION=$BUILDVERSION" >> version.env + artifacts: + reports: + dotenv: version.env + rules: + - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + - if: $CI_COMMIT_BRANCH =~ /^release/ + - if: $CI_COMMIT_TAG diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 0000000..cc02e63 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts new file mode 100644 index 0000000..8316136 --- /dev/null +++ b/buildSrc/src/main/kotlin/com.iqser.red.service.java-conventions.gradle.kts @@ -0,0 +1,56 @@ +plugins { + `java-library` + `maven-publish` + pmd + checkstyle + jacoco +} + +repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://nexus.knecon.com/repository/gindev/"); + credentials { + username = providers.gradleProperty("mavenUser").getOrNull(); + password = providers.gradleProperty("mavenPassword").getOrNull(); + } + } +} + +group = "com.iqser.red.service" + +java.sourceCompatibility = JavaVersion.VERSION_17 +java.targetCompatibility = JavaVersion.VERSION_17 + +tasks.pmdMain { + pmd.ruleSetFiles = files("${rootDir}/config/pmd/pmd.xml") +} + +tasks.pmdTest { + pmd.ruleSetFiles = files("${rootDir}/config/pmd/test_pmd.xml") +} + +tasks.named("test") { + useJUnitPlatform() + reports { + junitXml.outputLocation.set(layout.buildDirectory.dir("reports/junit")) + } +} + +tasks.test { + finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run +} + +tasks.jacocoTestReport { + dependsOn(tasks.test) // tests are required to run before generating the report + reports { + xml.required.set(true) + csv.required.set(false) + html.outputLocation.set(layout.buildDirectory.dir("jacocoHtml")) + } +} + +java { + withJavadocJar() +} diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000..8faaf13 --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/pmd/pmd.xml b/config/pmd/pmd.xml new file mode 100644 index 0000000..22d6d4c --- /dev/null +++ b/config/pmd/pmd.xml @@ -0,0 +1,21 @@ + + + + + Knecon ruleset checks the code for bad stuff + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/pmd/test_pmd.xml b/config/pmd/test_pmd.xml new file mode 100644 index 0000000..56d37d9 --- /dev/null +++ b/config/pmd/test_pmd.xml @@ -0,0 +1,24 @@ + + + + + Knecon test ruleset checks the code for bad stuff + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/gradle.settings.kts b/gradle.settings.kts new file mode 100644 index 0000000..f2b849c --- /dev/null +++ b/gradle.settings.kts @@ -0,0 +1 @@ +version = 2.0-SNAPSHOT \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 15a6e68..0000000 --- a/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - 4.0.0 - - search-service - com.iqser.red.service - 2.0-SNAPSHOT - - - pom - - - search-service-v1 - search-service-image-v1 - - - diff --git a/search-service-image-v1/pom.xml b/search-service-image-v1/pom.xml deleted file mode 100644 index 03c33e6..0000000 --- a/search-service-image-v1/pom.xml +++ /dev/null @@ -1,98 +0,0 @@ - - - - com.knecon.fforesight - platform-docker-dependency - 0.1.0 - - - 4.0.0 - - search-service-image-v1 - com.iqser.red.service - 2.0-SNAPSHOT - pom - - - - search-service-server-v1 - ${service.server}.jar - false - ${docker.image.prefix}/${service.server} - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - org.apache.maven.plugins - maven-resources-plugin - - - org.codehaus.mojo - exec-maven-plugin - - - io.fabric8 - docker-maven-plugin - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - download-platform-jar - prepare-package - - copy - - - - - ${project.groupId} - ${service.server} - ${project.version} - jar - true - ${platform.jar} - - - ${docker.build.directory} - - - - - - io.fabric8 - docker-maven-plugin - - - - ${docker.image.name} - - ${docker.build.directory} - - ${platform.jar} - - - ${docker.image.version} - latest - - - - - - - - - - diff --git a/search-service-image-v1/src/main/docker/Dockerfile b/search-service-image-v1/src/main/docker/Dockerfile deleted file mode 100644 index 15f1a3c..0000000 --- a/search-service-image-v1/src/main/docker/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM red/base-image:2.0.2 - -ARG PLATFORM_JAR - -ENV PLATFORM_JAR ${PLATFORM_JAR} - -COPY ["${PLATFORM_JAR}", "/"] diff --git a/search-service-v1/pom.xml b/search-service-v1/pom.xml deleted file mode 100644 index 155dfe7..0000000 --- a/search-service-v1/pom.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - platform-dependency - com.iqser.red - 2.2.0 - - - 4.0.0 - - search-service-v1 - com.iqser.red.service - 2.0-SNAPSHOT - - - pom - - - search-service-api-v1 - search-service-server-v1 - - - - - - - com.iqser.red - platform-commons-dependency - 2.7.0 - import - pom - - - - - - - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - 3.9.0.2155 - - - org.owasp - dependency-check-maven - 8.1.2 - - ALL - - - - org.jacoco - jacoco-maven-plugin - - - prepare-agent - - prepare-agent - - - - report - - report - - - - - - - - - org.jacoco - jacoco-maven-plugin - 0.8.8 - - - prepare-agent - - prepare-agent - - - - report - - report-aggregate - - verify - - - - - - diff --git a/search-service-v1/search-service-api-v1/build.gradle.kts b/search-service-v1/search-service-api-v1/build.gradle.kts new file mode 100644 index 0000000..5d329a1 --- /dev/null +++ b/search-service-v1/search-service-api-v1/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + id("com.iqser.red.service.java-conventions") + id("io.freefair.lombok") version "8.4" +} + +description = "search-service-api-v1" + +dependencies { + implementation("org.springframework:spring-web:6.0.6") + testImplementation("org.springframework.boot:spring-boot-starter-test:3.1.5") +} + +publishing { + publications { + create(name) { + from(components["java"]) + } + } + repositories { + maven { + url = uri("https://nexus.knecon.com/repository/red-platform-releases/") + credentials { + username = providers.gradleProperty("mavenUser").getOrNull(); + password = providers.gradleProperty("mavenPassword").getOrNull(); + } + } + } +} diff --git a/search-service-v1/search-service-api-v1/pom.xml b/search-service-v1/search-service-api-v1/pom.xml deleted file mode 100644 index d56514c..0000000 --- a/search-service-v1/search-service-api-v1/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - search-service-v1 - com.iqser.red.service - 2.0-SNAPSHOT - - - search-service-api-v1 - - - - org.springframework - spring-web - true - - - diff --git a/search-service-v1/search-service-server-v1/build.gradle.kts b/search-service-v1/search-service-server-v1/build.gradle.kts new file mode 100644 index 0000000..0baf570 --- /dev/null +++ b/search-service-v1/search-service-server-v1/build.gradle.kts @@ -0,0 +1,66 @@ +import org.springframework.boot.gradle.tasks.bundling.BootBuildImage + +plugins { + application + id("com.iqser.red.service.java-conventions") + id("org.springframework.boot") version "3.0.4" + id("io.spring.dependency-management") version "1.1.3" + id("org.sonarqube") version "4.4.1.3373" + id("io.freefair.lombok") version "8.4" +} + +description = "search-service-server-v1" + +configurations { + all { + exclude(group = "org.springframework.boot", module = "spring-boot-starter-logging") + } +} + +dependencies { + api("com.knecon.fforesight:tenant-commons:0.13.0") + api("com.google.guava:guava:31.1-jre") + api("com.iqser.red.commons:storage-commons:2.27.0") + api(project(":search-service-api-v1")) + api("com.iqser.red.service:persistence-service-internal-api-v1:2.93.0") + api("com.iqser.red.commons:spring-commons:2.1.0") + api("com.iqser.red.commons:logging-commons:2.1.0") + api("com.iqser.red.commons:metric-commons:2.1.0") + api("com.iqser.red.commons:jackson-commons:2.1.0") + api("co.elastic.clients:elasticsearch-java:8.6.2") + api("org.opensearch.client:opensearch-rest-client:2.6.0") + api("org.opensearch.client:opensearch-java:2.3.0") + api("jakarta.json:jakarta.json-api:2.1.1") + api("org.springframework.cloud:spring-cloud-starter-openfeign:4.0.1") + api("org.springframework.boot:spring-boot-starter-aop:3.0.4") + api("org.springframework.boot:spring-boot-starter-amqp:3.0.4") + testImplementation("org.springframework.boot:spring-boot-starter-test:3.0.4") + testImplementation("com.iqser.red.commons:test-commons:2.1.0") + testImplementation("org.testcontainers:elasticsearch:1.17.6") + testImplementation("org.opensearch:opensearch-testcontainers:2.0.0") + testImplementation("org.springframework.amqp:spring-rabbit-test:3.0.2") +} + +tasks.named("bootBuildImage") { + + environment.put("BPE_DELIM_JAVA_TOOL_OPTIONS", " ") + environment.put("BPE_APPEND_JAVA_TOOL_OPTIONS", "-Dfile.encoding=UTF-8") + + imageName.set("nexus.knecon.com:5001/red/${project.name}:${project.version}") + if (project.hasProperty("buildbootDockerHostNetwork")) { + network.set("host") + } + docker { + if (project.hasProperty("buildbootDockerHostNetwork")) { + bindHostToBuilder.set(true) + } + verboseLogging.set(true) + + publishRegistry { + username.set(providers.gradleProperty("mavenUser").getOrNull()) + password.set(providers.gradleProperty("mavenPassword").getOrNull()) + email.set(providers.gradleProperty("mavenEmail").getOrNull()) + url.set("https://nexus.knecon.com:5001/") + } + } +} diff --git a/search-service-v1/search-service-server-v1/pom.xml b/search-service-v1/search-service-server-v1/pom.xml deleted file mode 100644 index e0aaa10..0000000 --- a/search-service-v1/search-service-server-v1/pom.xml +++ /dev/null @@ -1,200 +0,0 @@ - - - 4.0.0 - - search-service-v1 - com.iqser.red.service - 2.0-SNAPSHOT - - - search-service-server-v1 - - - 2.93.0 - 0.13.0 - - - - - com.knecon.fforesight - tenant-commons - ${tenant-commons.version} - - - com.google.guava - guava - - - com.iqser.red.commons - storage-commons - - - com.iqser.red.service - search-service-api-v1 - ${project.version} - - - com.iqser.red.service - persistence-service-internal-api-v1 - ${persistence-service.version} - - - - - com.iqser.red.commons - spring-commons - - - com.iqser.red.commons - logging-commons - - - com.iqser.red.commons - metric-commons - - - - - com.iqser.red.commons - jackson-commons - - - - co.elastic.clients - elasticsearch-java - 8.6.2 - - - - org.opensearch.client - opensearch-rest-client - 2.6.0 - - - org.opensearch.client - opensearch-java - 2.3.0 - - - - - jakarta.json - jakarta.json-api - 2.1.1 - - - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - org.springframework.boot - spring-boot-starter-aop - - - - org.springframework.boot - spring-boot-starter-amqp - - - - - org.springframework.boot - spring-boot-starter-test - test - - - com.iqser.red.commons - test-commons - test - - - org.testcontainers - elasticsearch - 1.17.6 - test - - - org.opensearch - opensearch-testcontainers - 2.0.0 - test - - - org.springframework.amqp - spring-rabbit-test - test - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - lombok.launch.AnnotationProcessorHider$AnnotationProcessor - - - - - - - pl.project13.maven - git-commit-id-plugin - - - - revision - - - true - - true - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - original-jar - - jar - - - original - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - true - - - - - - - - diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/migration/MigrationStarterService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/migration/MigrationStarterService.java index bc7a2f7..177a433 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/migration/MigrationStarterService.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/migration/MigrationStarterService.java @@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j; @Slf4j @Service @RequiredArgsConstructor +@SuppressWarnings("PMD") public class MigrationStarterService { private final ApplicationContext ctx; diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexInformationService.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexInformationService.java index dc50d12..c9053fc 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexInformationService.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/IndexInformationService.java @@ -68,13 +68,13 @@ public class IndexInformationService { byte[] buffer = new byte[8192]; int count; MessageDigest digest = MessageDigest.getInstance("SHA-256"); - BufferedInputStream bis = new BufferedInputStream(new ClassPathResource(PATH_TO_CONFIG).getInputStream()); - while ((count = bis.read(buffer)) > 0) { - digest.update(buffer, 0, count); - } - bis.close(); + try (BufferedInputStream bis = new BufferedInputStream(new ClassPathResource(PATH_TO_CONFIG).getInputStream())) { + while ((count = bis.read(buffer)) > 0) { + digest.update(buffer, 0, count); + } - return Arrays.toString(digest.digest()); + return Arrays.toString(digest.digest()); + } } } diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/EsClient.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/EsClient.java index ef1f2cf..6a73b31 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/EsClient.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/EsClient.java @@ -20,6 +20,7 @@ import lombok.Data; import lombok.experimental.Delegate; @Data +@SuppressWarnings("PMD") public class EsClient { // Lower timeouts should be set per request. diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexCreatorServiceImpl.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexCreatorServiceImpl.java index ad61fb7..46ece30 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexCreatorServiceImpl.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/elasticsearch/IndexCreatorServiceImpl.java @@ -23,6 +23,7 @@ import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor @ConditionalOnProperty(prefix = "search", name = "backend", havingValue = "elasticsearch") +@SuppressWarnings("PMD") public class IndexCreatorServiceImpl { private final ElasticsearchSettings settings; diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexCreatorServiceImpl.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexCreatorServiceImpl.java index 1579ee4..377a8f5 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexCreatorServiceImpl.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/IndexCreatorServiceImpl.java @@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j; @Service @RequiredArgsConstructor @ConditionalOnProperty(prefix = "search", name = "backend", havingValue = "opensearch") +@SuppressWarnings("PMD") public class IndexCreatorServiceImpl { private final ElasticsearchSettings settings; diff --git a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/OpensearchClient.java b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/OpensearchClient.java index ae06f8a..a6f50d4 100644 --- a/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/OpensearchClient.java +++ b/search-service-v1/search-service-server-v1/src/main/java/com/iqser/red/service/search/v1/server/service/opensearch/OpensearchClient.java @@ -20,6 +20,7 @@ import lombok.Data; import lombok.experimental.Delegate; @Data +@SuppressWarnings("PMD") public class OpensearchClient { // Lower timeouts should be set per request. diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java index d0efc38..b1f9c2c 100644 --- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractElasticsearchIntegrationTest.java @@ -41,6 +41,7 @@ import com.knecon.fforesight.tenantcommons.model.TenantResponse; @EnableFeignClients(basePackageClasses = AbstractElasticsearchIntegrationTest.TestConfiguration.class) @DirtiesContext @AutoConfigureObservability +@SuppressWarnings("PMD") public abstract class AbstractElasticsearchIntegrationTest { public static final String WAIT_FOR_WRITE_REQUESTS = "elasticsearch.refreshPolicy=wait_for"; diff --git a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java index dc60d1b..8b018c5 100644 --- a/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java +++ b/search-service-v1/search-service-server-v1/src/test/java/com/iqser/red/service/search/v1/server/service/AbstractOpensearchIntegrationTest.java @@ -39,6 +39,7 @@ import com.knecon.fforesight.tenantcommons.model.TenantResponse; @ContextConfiguration(initializers = {AbstractOpensearchIntegrationTest.Initializer.class}) @EnableFeignClients(basePackageClasses = AbstractOpensearchIntegrationTest.TestConfiguration.class) @DirtiesContext +@SuppressWarnings("PMD") public abstract class AbstractOpensearchIntegrationTest { public static final String WAIT_FOR_WRITE_REQUESTS = "elasticsearch.refreshPolicy=wait_for"; diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..4227536 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,5 @@ +rootProject.name = "search-service" +include(":search-service-api-v1") +include(":search-service-server-v1") +project(":search-service-api-v1").projectDir = file("search-service-v1/search-service-api-v1") +project(":search-service-server-v1").projectDir = file("search-service-v1/search-service-server-v1")