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")
+    }
   }
 }

Reply via email to