This is an automated email from the ASF dual-hosted git repository. yuqi4733 pushed a commit to branch fix-10705-skip-web-war in repository https://gitbox.apache.org/repos/asf/gravitino.git
commit 46fe89a1559f60c8371880293828fd8e7a15314e Author: yuqi <[email protected]> AuthorDate: Wed Apr 8 10:33:24 2026 +0800 [#10705] fix(build): support skipping web war packaging Add a skipWebWar Gradle property to bypass web/web-v2 war build and packaging for non-frontend scenarios. Introduce gravitino.server.webui.enable to allow server startup without web war in deploy mode, and wire CI workflows to use -PskipWebWar=true except frontend jobs. Co-authored-by: Copilot <[email protected]> --- .../workflows/access-control-integration-test.yml | 2 +- .../workflows/backend-integration-test-action.yml | 4 +- .github/workflows/build.yml | 12 ++--- .github/workflows/cron-integration-test.yml | 4 +- .../workflows/flink-integration-test-action.yml | 4 +- .../maintenance-integration-test-action.yml | 2 +- .github/workflows/python-integration-test.yml | 2 +- .../workflows/spark-integration-test-action.yml | 4 +- .github/workflows/trino-integration-test.yml | 2 +- .github/workflows/trino-multi-version-test.yml | 2 +- build.gradle.kts | 51 +++++++++++++++------- conf/gravitino.conf.template | 2 + .../main/java/org/apache/gravitino/Configs.java | 7 +++ .../apache/gravitino/server/GravitinoServer.java | 7 +-- .../gravitino/server/TestGravitinoServer.java | 20 +++++++++ web-v2/integration-test/build.gradle.kts | 5 ++- web/integration-test/build.gradle.kts | 5 ++- 17 files changed, 95 insertions(+), 40 deletions(-) diff --git a/.github/workflows/access-control-integration-test.yml b/.github/workflows/access-control-integration-test.yml index ca2f00a4b4..2058373ceb 100644 --- a/.github/workflows/access-control-integration-test.yml +++ b/.github/workflows/access-control-integration-test.yml @@ -78,7 +78,7 @@ jobs: - name: Package Gravitino run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test - name: Free up disk space run: | diff --git a/.github/workflows/backend-integration-test-action.yml b/.github/workflows/backend-integration-test-action.yml index e4ef8abf29..5acf494a26 100644 --- a/.github/workflows/backend-integration-test-action.yml +++ b/.github/workflows/backend-integration-test-action.yml @@ -52,7 +52,7 @@ jobs: - name: Package Gravitino if: ${{ inputs.test-mode == 'deploy' }} run: | - ./gradlew compileDistribution -x test -x web-v2:web:build + ./gradlew compileDistribution -PskipWebWar=true -x test -x web-v2:web:build - name: Free up disk space run: | @@ -78,7 +78,7 @@ jobs: done fi - ./gradlew test -PskipTests -PtestMode=${{ inputs.test-mode }} -PjdbcBackend=${{ inputs.backend }} -PskipDockerTests=false \ + ./gradlew test -PskipTests -PtestMode=${{ inputs.test-mode }} -PjdbcBackend=${{ inputs.backend }} -PskipDockerTests=false -PskipWebWar=true \ -x :web:web:test -x :web:integration-test:test -x :web-v2:web:test -x :web-v2:integration-test:test -x :clients:client-python:test -x :flink-connector:flink:test -x :spark-connector:spark-common:test \ -x :spark-connector:spark-3.3:test -x :spark-connector:spark-3.4:test -x :spark-connector:spark-3.5:test \ -x :spark-connector:spark-runtime-3.3:test -x :spark-connector:spark-runtime-3.4:test -x :spark-connector:spark-runtime-3.5:test \ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3a7902e74d..e634826f20 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -114,7 +114,7 @@ jobs: - name: Build with Gradle run: | - ./gradlew assemble + ./gradlew assemble -PskipWebWar=true # To check the spark-connector is compatible with scala2.13 spark-connector-build: @@ -137,9 +137,9 @@ jobs: - name: Build with Scala2.13 run: | - ./gradlew :spark-connector:spark-3.3:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false - ./gradlew :spark-connector:spark-3.4:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false - ./gradlew :spark-connector:spark-3.5:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false + ./gradlew :spark-connector:spark-3.3:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false -PskipWebWar=true + ./gradlew :spark-connector:spark-3.4:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false -PskipWebWar=true + ./gradlew :spark-connector:spark-3.5:build -PscalaVersion=2.13 -PskipITs -PskipDockerTests=false -PskipWebWar=true - name: Upload unit tests report uses: actions/upload-artifact@v7 @@ -171,7 +171,7 @@ jobs: cache: 'gradle' - name: Test publish to local - run: ./gradlew publishToMavenLocal -x test + run: ./gradlew publishToMavenLocal -PskipWebWar=true -x test - name: Free up disk space run: | @@ -190,6 +190,7 @@ jobs: :maintenance:updaters:build \ :maintenance:optimizer:build \ :maintenance:jobs:build \ + -PskipWebWar=true \ -PskipITs \ -PskipDockerTests=false exit 0 @@ -197,6 +198,7 @@ jobs: gradle_args=( build + -PskipWebWar=true -PskipITs -PskipDockerTests=false -x :clients:client-python:build diff --git a/.github/workflows/cron-integration-test.yml b/.github/workflows/cron-integration-test.yml index 18f8a47fff..e8201ebe94 100644 --- a/.github/workflows/cron-integration-test.yml +++ b/.github/workflows/cron-integration-test.yml @@ -75,7 +75,7 @@ jobs: - name: Package Gravitino run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test - name: Free up disk space run: | @@ -84,7 +84,7 @@ jobs: - name: Integration Test id: integrationTest run: | - ./gradlew test -PskipTests -PtestMode=${{ matrix.test-mode }} -PskipDockerTests=false + ./gradlew test -PskipTests -PtestMode=${{ matrix.test-mode }} -PskipDockerTests=false -PskipWebWar=true - name: Upload integrate tests reports uses: actions/upload-artifact@v7 diff --git a/.github/workflows/flink-integration-test-action.yml b/.github/workflows/flink-integration-test-action.yml index b2c8293ebd..f72797c4b7 100644 --- a/.github/workflows/flink-integration-test-action.yml +++ b/.github/workflows/flink-integration-test-action.yml @@ -38,7 +38,7 @@ jobs: - name: Package Gravitino run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test - name: Free up disk space run: | @@ -63,4 +63,4 @@ jobs: distribution/package/logs/gravitino-server.out distribution/package/logs/gravitino-server.log catalogs/**/*.log - catalogs/**/*.tar \ No newline at end of file + catalogs/**/*.tar diff --git a/.github/workflows/maintenance-integration-test-action.yml b/.github/workflows/maintenance-integration-test-action.yml index c9829cf54b..9831d4c777 100644 --- a/.github/workflows/maintenance-integration-test-action.yml +++ b/.github/workflows/maintenance-integration-test-action.yml @@ -38,7 +38,7 @@ jobs: - name: Package Gravitino run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test - name: Free up disk space run: | diff --git a/.github/workflows/python-integration-test.yml b/.github/workflows/python-integration-test.yml index f9d9424284..538d70b989 100644 --- a/.github/workflows/python-integration-test.yml +++ b/.github/workflows/python-integration-test.yml @@ -75,7 +75,7 @@ jobs: - name: Python Client Integration Test id: integrationTest run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test for pythonVersion in "3.10" "3.11" "3.12" do diff --git a/.github/workflows/spark-integration-test-action.yml b/.github/workflows/spark-integration-test-action.yml index 62fd282241..65bd47ca11 100644 --- a/.github/workflows/spark-integration-test-action.yml +++ b/.github/workflows/spark-integration-test-action.yml @@ -47,7 +47,7 @@ jobs: - name: Package Gravitino if: ${{ inputs.test-mode == 'deploy' }} run: | - ./gradlew compileDistribution -x test + ./gradlew compileDistribution -PskipWebWar=true -x test - name: Free up disk space run: | @@ -73,4 +73,4 @@ jobs: spark-connector/v3.4/spark/build/spark-3.4-integration-test.log spark-connector/v3.5/spark/build/spark-3.5-integration-test.log distribution/package/logs/*.out - distribution/package/logs/*.log \ No newline at end of file + distribution/package/logs/*.log diff --git a/.github/workflows/trino-integration-test.yml b/.github/workflows/trino-integration-test.yml index 77ae9561e8..f56b1cb83f 100644 --- a/.github/workflows/trino-integration-test.yml +++ b/.github/workflows/trino-integration-test.yml @@ -76,7 +76,7 @@ jobs: - name: Build Gravitino run: | - ./gradlew build -x test \ + ./gradlew build -PskipWebWar=true -x test \ -x :web:web:build -x :web:integration-test:build \ -x :web-v2:web:build -x :web-v2:integration-test:build \ -x :clients:client-python:build \ diff --git a/.github/workflows/trino-multi-version-test.yml b/.github/workflows/trino-multi-version-test.yml index 9dc90a5747..4797b683bf 100644 --- a/.github/workflows/trino-multi-version-test.yml +++ b/.github/workflows/trino-multi-version-test.yml @@ -26,7 +26,7 @@ jobs: - name: Build Gravitino run: | - ./gradlew build -x test \ + ./gradlew build -PskipWebWar=true -x test \ -x :web:web:build -x :web:integration-test:build \ -x :web-v2:web:build -x :web-v2:integration-test:build \ -x :clients:client-python:build \ diff --git a/build.gradle.kts b/build.gradle.kts index 7359395845..09a9c41816 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -66,6 +66,8 @@ if (scalaVersion !in listOf("2.12", "2.13")) { throw GradleException("Scala version $scalaVersion is not supported.") } +val skipWebWar: Boolean = (project.findProperty("skipWebWar") as? String)?.toBoolean() ?: false + project.extra["extraJvmArgs"] = listOf( "-XX:+IgnoreUnrecognizedVMOptions", @@ -775,19 +777,23 @@ tasks { val outputDir = projectDir.dir("distribution") val compileDistribution by registering { - dependsOn( - "copyCatalogLibAndConfigs", - "copySubprojectDependencies", - "copySubprojectLib", - "copyCliLib", - "copyJobsLib", - ":authorizations:copyLibAndConfig", - ":iceberg:iceberg-rest-server:copyLibAndConfigs", - ":lance:lance-rest-server:copyLibAndConfigs", - ":maintenance:optimizer:copyLibAndConfigs", - ":web:web:build", - ":web-v2:web:build" - ) + val dependencies = + mutableListOf( + "copyCatalogLibAndConfigs", + "copySubprojectDependencies", + "copySubprojectLib", + "copyCliLib", + "copyJobsLib", + ":authorizations:copyLibAndConfig", + ":iceberg:iceberg-rest-server:copyLibAndConfigs", + ":lance:lance-rest-server:copyLibAndConfigs", + ":maintenance:optimizer:copyLibAndConfigs" + ) + if (!skipWebWar) { + dependencies.add(":web:web:build") + dependencies.add(":web-v2:web:build") + } + dependsOn(dependencies) group = "gravitino distribution" outputs.dir(projectDir.dir("distribution/package")) @@ -795,8 +801,10 @@ tasks { copy { from(projectDir.dir("conf")) { into("package/conf") } from(projectDir.dir("bin")) { into("package/bin") } - from(projectDir.dir("web/web/build/libs/${rootProject.name}-web-$version.war")) { into("package/web") } - from(projectDir.dir("web-v2/web/build/libs/${rootProject.name}-web-$version.war")) { into("package/web-v2") } + if (!skipWebWar) { + from(projectDir.dir("web/web/build/libs/${rootProject.name}-web-$version.war")) { into("package/web") } + from(projectDir.dir("web-v2/web/build/libs/${rootProject.name}-web-$version.war")) { into("package/web-v2") } + } from(projectDir.dir("scripts")) { into("package/scripts") } into(outputDir) rename { fileName -> @@ -811,6 +819,19 @@ tasks { } fileMode = 0b111101101 } + if (skipWebWar) { + val confFile = projectDir.file("distribution/package/conf/gravitino.conf").asFile + if (confFile.exists()) { + confFile.writeText( + confFile + .readText() + .replace( + "gravitino.server.webui.enable = true", + "gravitino.server.webui.enable = false" + ) + ) + } + } copy { from(projectDir.dir("licenses")) { into("package/licenses") } from(projectDir.file("LICENSE.bin")) { into("package") } diff --git a/conf/gravitino.conf.template b/conf/gravitino.conf.template index 9e340f5a6e..903b722cff 100644 --- a/conf/gravitino.conf.template +++ b/conf/gravitino.conf.template @@ -39,6 +39,8 @@ gravitino.server.webserver.threadPoolWorkQueueSize = 100 gravitino.server.webserver.requestHeaderSize = 131072 # The response header size of the built-in web server gravitino.server.webserver.responseHeaderSize = 131072 +# Whether to enable Gravitino Web UI +gravitino.server.webui.enable = true # THE CONFIGURATION FOR Gravitino ENTITY STORE # The entity store to use, we only supports relational diff --git a/core/src/main/java/org/apache/gravitino/Configs.java b/core/src/main/java/org/apache/gravitino/Configs.java index 3cc9d703e6..21108d88e2 100644 --- a/core/src/main/java/org/apache/gravitino/Configs.java +++ b/core/src/main/java/org/apache/gravitino/Configs.java @@ -357,6 +357,13 @@ public class Configs { .toSequence() .createWithDefault(Collections.emptyList()); + public static final ConfigEntry<Boolean> SERVER_UI_ENABLED = + new ConfigBuilder("gravitino.server.webui.enable") + .doc("Whether to enable the web UI.") + .version(ConfigConstants.VERSION_1_2_0) + .booleanConf() + .createWithDefault(true); + public static final String AUDIT_LOG_WRITER_CONFIG_PREFIX = "gravitino.audit.writer."; public static final ConfigEntry<Boolean> AUDIT_LOG_ENABLED_CONF = diff --git a/server/src/main/java/org/apache/gravitino/server/GravitinoServer.java b/server/src/main/java/org/apache/gravitino/server/GravitinoServer.java index 90a537f885..aae9ae24c9 100644 --- a/server/src/main/java/org/apache/gravitino/server/GravitinoServer.java +++ b/server/src/main/java/org/apache/gravitino/server/GravitinoServer.java @@ -56,7 +56,6 @@ import org.apache.gravitino.server.web.filter.GravitinoInterceptionService; import org.apache.gravitino.server.web.mapper.JsonMappingExceptionMapper; import org.apache.gravitino.server.web.mapper.JsonParseExceptionMapper; import org.apache.gravitino.server.web.mapper.JsonProcessingExceptionMapper; -import org.apache.gravitino.server.web.ui.WebUIFilter; import org.apache.gravitino.stats.StatisticDispatcher; import org.apache.gravitino.tag.TagDispatcher; import org.glassfish.hk2.api.InterceptionService; @@ -100,7 +99,8 @@ public class GravitinoServer extends ResourceConfig { JettyServerConfig jettyServerConfig = JettyServerConfig.fromConfig(serverConfig, WEBSERVER_CONF_PREFIX); - server.initialize(jettyServerConfig, SERVER_NAME, true /* shouldEnableUI */); + boolean enableWebUI = serverConfig.get(Configs.SERVER_UI_ENABLED); + server.initialize(jettyServerConfig, SERVER_NAME, enableWebUI); ServerAuthenticator.getInstance().initialize(serverConfig); @@ -175,9 +175,6 @@ public class GravitinoServer extends ResourceConfig { server.addCustomFilters(API_ANY_PATH); server.addFilter(new VersioningFilter(), API_ANY_PATH); server.addSystemFilters(API_ANY_PATH); - - server.addFilter(new WebUIFilter(), "/"); // Redirect to the /ui/index html page. - server.addFilter(new WebUIFilter(), "/ui/*"); // Redirect to the static html file. } public void start() throws Exception { diff --git a/server/src/test/java/org/apache/gravitino/server/TestGravitinoServer.java b/server/src/test/java/org/apache/gravitino/server/TestGravitinoServer.java index 2155047c9e..93295c678e 100644 --- a/server/src/test/java/org/apache/gravitino/server/TestGravitinoServer.java +++ b/server/src/test/java/org/apache/gravitino/server/TestGravitinoServer.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import org.apache.commons.io.FileUtils; +import org.apache.gravitino.Configs; import org.apache.gravitino.GravitinoEnv; import org.apache.gravitino.auxiliary.AuxiliaryServiceManager; import org.apache.gravitino.rest.RESTUtils; @@ -99,6 +100,25 @@ public class TestGravitinoServer { gravitinoServer.stop(); } + @Test + public void testStartAndStopWithWebUiDisabled() throws Exception { + ServerConfig config = new ServerConfig(); + config.loadFromMap( + ImmutableMap.of( + GravitinoServer.WEBSERVER_CONF_PREFIX + JettyServerConfig.WEBSERVER_HTTP_PORT.getKey(), + String.valueOf(RESTUtils.findAvailablePort(5000, 6000)), + Configs.SERVER_UI_ENABLED.getKey(), + "false", + AuxiliaryServiceManager.GRAVITINO_AUX_SERVICE_PREFIX + + AuxiliaryServiceManager.AUX_SERVICE_NAMES, + ""), + t -> true); + GravitinoServer localServer = new GravitinoServer(config, GravitinoEnv.getInstance()); + localServer.initialize(); + localServer.start(); + localServer.stop(); + } + @Test public void testStartWithoutInitialise() throws Exception { assertThrows(RuntimeException.class, () -> gravitinoServer.start()); diff --git a/web-v2/integration-test/build.gradle.kts b/web-v2/integration-test/build.gradle.kts index 6618c54abd..89b79c46e9 100644 --- a/web-v2/integration-test/build.gradle.kts +++ b/web-v2/integration-test/build.gradle.kts @@ -53,6 +53,7 @@ dependencies { } tasks.test { + val skipWebWar = (rootProject.findProperty("skipWebWar") as? String)?.toBoolean() ?: false val skipITs = project.hasProperty("skipITs") if (skipITs) { exclude("*") @@ -67,6 +68,8 @@ tasks.test { dependsOn(":catalogs:catalog-kafka:jar", ":catalogs:catalog-kafka:runtimeJars") // Frontend tests depend on the web page, so we need to build the web module first. - dependsOn(":web-v2:web:build") + if (!skipWebWar) { + dependsOn(":web-v2:web:build") + } } } diff --git a/web/integration-test/build.gradle.kts b/web/integration-test/build.gradle.kts index 11d941ecca..b884a9ca06 100644 --- a/web/integration-test/build.gradle.kts +++ b/web/integration-test/build.gradle.kts @@ -53,6 +53,7 @@ dependencies { } tasks.test { + val skipWebWar = (rootProject.findProperty("skipWebWar") as? String)?.toBoolean() ?: false val skipITs = project.hasProperty("skipITs") if (skipITs) { exclude("*") @@ -67,6 +68,8 @@ tasks.test { dependsOn(":catalogs:catalog-kafka:jar", ":catalogs:catalog-kafka:runtimeJars") // Frontend tests depend on the web page, so we need to build the web module first. - dependsOn(":web:web:build") + if (!skipWebWar) { + dependsOn(":web:web:build") + } } }
