From dc28870de3dada7f058b38365c96b96bde522531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sun, 9 Jun 2024 17:14:38 +0200 Subject: [PATCH 1/5] feat(custom-jhlite): add shell scripts for helping testing generated apps in ci --- .../domain/CustomJHLiteModuleFactory.java | 10 ++- .../custom-jhlite/tests-ci/generate.sh | 68 +++++++++++++++++++ .../tests-ci/modulePayload.json.mustache | 14 ++++ .../custom-jhlite/tests-ci/start.sh | 50 ++++++++++++++ .../springboot/custom-jhlite/tests-ci/stop.sh | 5 ++ .../domain/CustomJHLiteModuleFactoryTest.java | 6 ++ 6 files changed, 150 insertions(+), 3 deletions(-) create mode 100755 src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh create mode 100644 src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/modulePayload.json.mustache create mode 100755 src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh create mode 100755 src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/stop.sh diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java index df12356f116..23b304dae06 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java @@ -7,10 +7,8 @@ import tech.jhipster.lite.module.domain.JHipsterProjectFilePath; import tech.jhipster.lite.module.domain.file.JHipsterDestination; import tech.jhipster.lite.module.domain.file.JHipsterSource; -import tech.jhipster.lite.module.domain.javadependency.JavaDependency; +import tech.jhipster.lite.module.domain.javadependency.*; import tech.jhipster.lite.module.domain.javadependency.JavaDependency.JavaDependencyOptionalValueBuilder; -import tech.jhipster.lite.module.domain.javadependency.JavaDependencyScope; -import tech.jhipster.lite.module.domain.javadependency.JavaDependencyType; import tech.jhipster.lite.module.domain.javaproperties.PropertyKey; import tech.jhipster.lite.module.domain.properties.JHipsterModuleProperties; import tech.jhipster.lite.shared.error.domain.Assert; @@ -68,6 +66,12 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) { .add(SOURCE.template("CucumberConfiguration.java"), cucumberDestination.append("CucumberConfiguration.java")) .add(CUCUMBER_SOURCE.append("rest").template("CucumberRestTemplate.java"), cucumberDestination.append("rest").append("CucumberRestTemplate.java")) .add(CUCUMBER_SOURCE.file("gitkeep"), to("src/test/features/.gitkeep")) + .batch(SOURCE.append("tests-ci"),to("tests-ci")) + .addFile("generate.sh") + .addTemplate("modulePayload.json") + .addFile("start.sh") + .addFile("stop.sh") + .and() .and() .build(); //@formatter:on diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh new file mode 100755 index 00000000000..b18d3cf147f --- /dev/null +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +show_syntax() { + echo "Usage: $0 " >&2 + exit 1 +} + +if [ "$#" -ne 3 ]; then + show_syntax +fi + +if test -f "modulePayload.json"; then + payloadFile="modulePayload.json" +elif test -f tests-ci/modulePayload.json; then + payloadFile=tests-ci/modulePayload.json +fi + +application=$1 +java_build_tool=$2 +configuration_format=$3 + +applyModules() { + for module in $@ + do + local payload="$(sed -e "s/APP_NAME/$application/g;s/SPRING_CONFIG_FORMAT/$configuration_format/g" $payloadFile)" + local api="/api/modules/$module/apply-patch" + + echo "curl -o /dev/null -s -w "%{http_code}\n" \ + -X POST \ + -H "accept: */*" \ + -H "Content-Type: application/json" \ + -d "$payload" \ + "http://localhost:7471""$api"" + + local status_code=$(curl -o /dev/null -s -w "%{http_code}\n" \ + -X POST \ + -H "accept: */*" \ + -H "Content-Type: application/json" \ + -d "$payload" \ + "http://localhost:7471""$api") + + if [[ $status_code == '40'* || $status_code == '50'* ]]; then + echo "Error when calling API:" "$status_code" "$api" + exit 1 + fi; + done +} + +init_server() { + applyModules \ + "init" \ + "${java_build_tool}-wrapper" \ + "${java_build_tool}-java" +} + +if [[ $application == 'fullapp' ]]; then + init_server + # apply here your custom modules + +else + echo "*** Unknown configuration..." + exit 1 +fi + +echo "" +cat "$payloadFile" +echo "" +sleep 5 diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/modulePayload.json.mustache b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/modulePayload.json.mustache new file mode 100644 index 00000000000..01c2c9798aa --- /dev/null +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/modulePayload.json.mustache @@ -0,0 +1,14 @@ +{ + "projectFolder": "/tmp/jhlite/APP_NAME", + "commit": true, + "parameters": { + "projectName": "Chips Project", + "serverPort": 8081, + "baseName": "APP_NAME", + "packageName": "{{packageName}}.APP_NAME", + "jwtBase64Secret": "NmE2NDhmMmQ5OWQzYzk4NmE4NjNlMmQzNmU3ZTU4ZDY2MmUxOWEwZGI4YTk4NDY0MTk4MmQyMWZlNDNlM2FjYg==", + "date": "2021-12-03T10:15:30.00Z", + "kafkaClusterId": "7870e9ec-dd1f-4562-86a2-df2199d5db1a", + "springConfigurationFormat": "SPRING_CONFIG_FORMAT" + } +} diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh new file mode 100755 index 00000000000..331a95a2f47 --- /dev/null +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash + +PORT=$1 +if [[ $PORT == '' ]]; then + echo "*** Using default port 8081" + PORT='8081' +fi + +echo "*** Waiting 5sec to be sure the Jar is here" +sleep 5 + +echo "*** List folder" +ls -al + +if test -f "mvnw"; then + cd target/ +elif test -f "gradlew"; then + cd build/libs/ +fi + +echo "*** Identifying application executable..." +export EXEC_JAR=$(\ + find . -maxdepth 1 -name "*-exec.jar" | grep . \ + || find . -maxdepth 1 -name "*.jar" | grep -v "\-javadoc" | grep -v "\-sources" | grep -v "\-tests" | grep -v "\-plain" \ +) + +echo "*** Starting application using ${EXEC_JAR}..." +java \ + -jar ${EXEC_JAR} \ + --logging.level.ROOT=OFF & > /dev/null +echo $! > .pid-jhlite + +retryCount=1 +maxRetry=30 +httpUrl="http://localhost:"$PORT"/management/health" + +rep=$(curl -v "$httpUrl") +status=$? +while [ "$status" -ne 0 ] && [ "$retryCount" -le "$maxRetry" ]; do + echo "*** [$(date)] Application not reachable yet. Sleep and retry - retryCount =" $retryCount "/" $maxRetry + retryCount=$((retryCount+1)) + sleep 5 + rep=$(curl -v "$httpUrl") + status=$? +done + +if [ "$status" -ne 0 ]; then + echo "*** [$(date)] Not connected after" $retryCount " retries." + exit 1 +fi diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/stop.sh b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/stop.sh new file mode 100755 index 00000000000..d3fa7179ae8 --- /dev/null +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/stop.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +echo "*** Stopping JHipster Lite in 5sec..." +sleep 5 +kill $(cat .pid-jhlite) diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java index 7f36d9255e5..428f36558f7 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java @@ -26,6 +26,12 @@ void shouldBuildModule() { //@formatter:off assertThatModuleWithFiles(module, pomFile(), mainAppFile()) + .hasPrefixedFiles("tests-ci", "generate.sh", "start.sh", "stop.sh") + .hasFile("tests-ci/modulePayload.json") + .containing(""" + "packageName": "com.jhipster.test.APP_NAME", + """) + .and() .hasFile("pom.xml") .containing("cucumber-junit-platform-engine") .containing("cucumber-java") From 5c8e3743adde184a3e30d89bbff02c81bbd7a46a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sun, 9 Jun 2024 17:21:22 +0200 Subject: [PATCH 2/5] feat: add ability to declare executable files from batch API --- .../lite/module/domain/file/JHipsterModuleFiles.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java b/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java index 10c560ac972..5d03f4669b1 100644 --- a/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java +++ b/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java @@ -1,8 +1,6 @@ package tech.jhipster.lite.module.domain.file; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import java.util.*; import tech.jhipster.lite.module.domain.JHipsterModule.JHipsterModuleBuilder; import tech.jhipster.lite.module.domain.JHipsterModuleUpgrade; import tech.jhipster.lite.module.domain.JHipsterProjectFilePath; @@ -125,6 +123,12 @@ public JHipsterModuleFileBatchBuilder addFile(String file) { return add(source.file(file), destination.append(file)); } + public JHipsterModuleFileBatchBuilder addExecutable(String file) { + files.addExecutable(source.file(file), destination.append(file)); + + return this; + } + private JHipsterModuleFileBatchBuilder add(JHipsterSource source, JHipsterDestination destination) { files.add(source, destination); From 5f3fdd144d4ed01d3fd843cebd199b9bd02830e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sun, 9 Jun 2024 17:21:47 +0200 Subject: [PATCH 3/5] fix(custom-jhlite): generated shell scripts should be executable --- .../customjhlite/domain/CustomJHLiteModuleFactory.java | 6 +++--- .../customjhlite/domain/CustomJHLiteModuleFactoryTest.java | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java index 23b304dae06..a9b03522edd 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java @@ -67,10 +67,10 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) { .add(CUCUMBER_SOURCE.append("rest").template("CucumberRestTemplate.java"), cucumberDestination.append("rest").append("CucumberRestTemplate.java")) .add(CUCUMBER_SOURCE.file("gitkeep"), to("src/test/features/.gitkeep")) .batch(SOURCE.append("tests-ci"),to("tests-ci")) - .addFile("generate.sh") + .addExecutable("generate.sh") .addTemplate("modulePayload.json") - .addFile("start.sh") - .addFile("stop.sh") + .addExecutable("start.sh") + .addExecutable("stop.sh") .and() .and() .build(); diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java index 428f36558f7..d3984d8e9a3 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java @@ -26,7 +26,7 @@ void shouldBuildModule() { //@formatter:off assertThatModuleWithFiles(module, pomFile(), mainAppFile()) - .hasPrefixedFiles("tests-ci", "generate.sh", "start.sh", "stop.sh") + .hasExecutableFiles("tests-ci/generate.sh", "tests-ci/start.sh", "tests-ci/stop.sh") .hasFile("tests-ci/modulePayload.json") .containing(""" "packageName": "com.jhipster.test.APP_NAME", From 5782220ac8bb6a03f913acc86dd87b0c4d4d6efc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sun, 9 Jun 2024 19:40:20 +0200 Subject: [PATCH 4/5] feat(custom-jhlite): use server port in ci test scripts --- .../customjhlite/domain/CustomJHLiteModuleFactory.java | 4 ++-- .../lite/module/domain/file/JHipsterModuleFiles.java | 6 ++++++ .../tests-ci/{generate.sh => generate.sh.mustache} | 4 ++-- .../custom-jhlite/tests-ci/{start.sh => start.sh.mustache} | 4 ++-- .../customjhlite/domain/CustomJHLiteModuleFactoryTest.java | 6 ++++++ 5 files changed, 18 insertions(+), 6 deletions(-) rename src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/{generate.sh => generate.sh.mustache} (93%) rename src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/{start.sh => start.sh.mustache} (94%) diff --git a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java index a9b03522edd..1c3df2bfb35 100644 --- a/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java +++ b/src/main/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactory.java @@ -67,9 +67,9 @@ public JHipsterModule buildModule(JHipsterModuleProperties properties) { .add(CUCUMBER_SOURCE.append("rest").template("CucumberRestTemplate.java"), cucumberDestination.append("rest").append("CucumberRestTemplate.java")) .add(CUCUMBER_SOURCE.file("gitkeep"), to("src/test/features/.gitkeep")) .batch(SOURCE.append("tests-ci"),to("tests-ci")) - .addExecutable("generate.sh") + .addExecutableTemplate("generate.sh") .addTemplate("modulePayload.json") - .addExecutable("start.sh") + .addExecutableTemplate("start.sh") .addExecutable("stop.sh") .and() .and() diff --git a/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java b/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java index 5d03f4669b1..b6bd3b0f4fe 100644 --- a/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java +++ b/src/main/java/tech/jhipster/lite/module/domain/file/JHipsterModuleFiles.java @@ -129,6 +129,12 @@ public JHipsterModuleFileBatchBuilder addExecutable(String file) { return this; } + public JHipsterModuleFileBatchBuilder addExecutableTemplate(String file) { + files.addExecutable(source.template(file), destination.append(file)); + + return this; + } + private JHipsterModuleFileBatchBuilder add(JHipsterSource source, JHipsterDestination destination) { files.add(source, destination); diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh.mustache similarity index 93% rename from src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh rename to src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh.mustache index b18d3cf147f..7df7e9678df 100755 --- a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/generate.sh.mustache @@ -30,14 +30,14 @@ applyModules() { -H "accept: */*" \ -H "Content-Type: application/json" \ -d "$payload" \ - "http://localhost:7471""$api"" + "http://localhost:{{serverPort}}""$api"" local status_code=$(curl -o /dev/null -s -w "%{http_code}\n" \ -X POST \ -H "accept: */*" \ -H "Content-Type: application/json" \ -d "$payload" \ - "http://localhost:7471""$api") + "http://localhost:{{serverPort}}""$api") if [[ $status_code == '40'* || $status_code == '50'* ]]; then echo "Error when calling API:" "$status_code" "$api" diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache similarity index 94% rename from src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh rename to src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache index 331a95a2f47..839afebe33d 100755 --- a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache @@ -2,8 +2,8 @@ PORT=$1 if [[ $PORT == '' ]]; then - echo "*** Using default port 8081" - PORT='8081' + echo "*** Using default port {{serverPort}}" + PORT='{{serverPort}}' fi echo "*** Waiting 5sec to be sure the Jar is here" diff --git a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java index d3984d8e9a3..79e8f845cd4 100644 --- a/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java +++ b/src/test/java/tech/jhipster/lite/generator/server/springboot/customjhlite/domain/CustomJHLiteModuleFactoryTest.java @@ -27,6 +27,12 @@ void shouldBuildModule() { //@formatter:off assertThatModuleWithFiles(module, pomFile(), mainAppFile()) .hasExecutableFiles("tests-ci/generate.sh", "tests-ci/start.sh", "tests-ci/stop.sh") + .hasFile("tests-ci/generate.sh") + .containing("http://localhost:9000") + .and() + .hasFile("tests-ci/start.sh") + .containing("9000") + .and() .hasFile("tests-ci/modulePayload.json") .containing(""" "packageName": "com.jhipster.test.APP_NAME", From 0de3d6ac9fdb1551c199358d80a9997ddc950ace Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Mino?= Date: Sun, 9 Jun 2024 19:41:20 +0200 Subject: [PATCH 5/5] fix(custom-jhlite): generate pid file in current directory for ci test scripts --- .../springboot/custom-jhlite/tests-ci/start.sh.mustache | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache index 839afebe33d..46a5fe54b33 100755 --- a/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache +++ b/src/main/resources/generator/server/springboot/custom-jhlite/tests-ci/start.sh.mustache @@ -13,15 +13,15 @@ echo "*** List folder" ls -al if test -f "mvnw"; then - cd target/ + JAR_DIRECTORY="target" elif test -f "gradlew"; then - cd build/libs/ + JAR_DIRECTORY="build/libs/" fi echo "*** Identifying application executable..." export EXEC_JAR=$(\ - find . -maxdepth 1 -name "*-exec.jar" | grep . \ - || find . -maxdepth 1 -name "*.jar" | grep -v "\-javadoc" | grep -v "\-sources" | grep -v "\-tests" | grep -v "\-plain" \ + find ${JAR_DIRECTORY} -maxdepth 1 -name "*-exec.jar" | grep . \ + || find ${JAR_DIRECTORY} -maxdepth 1 -name "*.jar" | grep -v "\-javadoc" | grep -v "\-sources" | grep -v "\-tests" | grep -v "\-plain" \ ) echo "*** Starting application using ${EXEC_JAR}..."