This is an automated email from the ASF dual-hosted git repository.

nddipiazza pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tika.git


The following commit(s) were added to refs/heads/main by this push:
     new bcfc0eae04 TIKA-4703: Fix tika-grpc Docker image missing runtime 
dependencies (#2790)
bcfc0eae04 is described below

commit bcfc0eae04e6ad325f9486c60fb5f72239a4a53f
Author: Nicholas DiPiazza <[email protected]>
AuthorDate: Mon Apr 27 14:55:25 2026 +0000

    TIKA-4703: Fix tika-grpc Docker image missing runtime dependencies (#2790)
    
    * TIKA-4703: Fix tika-grpc Docker image missing runtime dependencies
    
    Use 'mvn dependency:copy-dependencies' to populate the lib/ directory of
    runtime jars that the MANIFEST.MF Class-Path entries reference. Without
    this the image only contained the thin jar and Java threw:
    
      NoClassDefFoundError: io/grpc/BindableService
    
    The jar's MANIFEST.MF (set by maven-jar-plugin classpathPrefix=lib/) expects
    dependencies at lib/ relative to the jar, i.e. /tika/libs/lib/ in the image.
    Running dependency:copy-dependencies into that path after the main build
    ensures all runtime deps are present.
    
    Co-authored-by: Copilot <[email protected]>
    
    * TIKA-4703: Rename lib dir to tika-grpc, consolidate dep step, add grpc 
smoke test
    
    - Rename classpathPrefix from lib/ to tika-grpc/ in maven-jar-plugin so
      MANIFEST.MF Class-Path matches the actual directory layout in the image
    - Update docker-snapshot.yml and docker-release.yml: rename libs/lib -> 
libs/tika-grpc,
      consolidate separate 'Collect' + 'Prepare' steps into a single Prepare 
step
    - Add smoke test to docker-snapshot.yml: builds single-arch image with 
--load,
      starts container, polls for 'Server started' log line, fails CI if not 
seen within 30s
    
    Co-authored-by: Copilot <[email protected]>
    
    * TIKA-4703: Add smoke tests for tika-server minimal and full Docker images
    
    - Build single-arch (amd64) image with --load before each multi-arch push
    - Poll for 'Started Apache Tika server' log line for up to 40 seconds
    - Fail CI job if server does not start; dump logs on failure
    - tika-server has no missing-deps issue (bin.tgz already bundles lib/)
    
    Co-authored-by: Copilot <[email protected]>
    
    * TIKA-4703: Fix assembly.xml dep dir and use trap-based cleanup in smoke 
tests
    
    - Update assembly.xml outputDirectory from lib/ to tika-grpc/ to match
      classpathPrefix in pom.xml; without this the binary zip would have deps
      under lib/ while MANIFEST.MF Class-Path references tika-grpc/*.jar
    - Replace bare docker stop/exit in all three smoke test steps with a trap
      cleanup function using docker rm -f; this prevents bash -e from failing
      on a stop of an already-exited container and ensures logs are always
      collected on failure
    
    Co-authored-by: Copilot <[email protected]>
    
    ---------
    
    Co-authored-by: Copilot <[email protected]>
---
 .github/workflows/docker-release.yml     |   5 +-
 .github/workflows/docker-snapshot.yml    | 103 ++++++++++++++++++++++++++++++-
 tika-grpc/pom.xml                        |   2 +-
 tika-grpc/src/main/assembly/assembly.xml |   2 +-
 4 files changed, 108 insertions(+), 4 deletions(-)

diff --git a/.github/workflows/docker-release.yml 
b/.github/workflows/docker-release.yml
index d6e6971dfd..dadf630887 100644
--- a/.github/workflows/docker-release.yml
+++ b/.github/workflows/docker-release.yml
@@ -112,9 +112,12 @@ jobs:
           TIKA_VERSION="${{ steps.version.outputs.tag }}"
           OUT_DIR=target/tika-grpc-docker
 
-          mkdir -p "${OUT_DIR}/libs" "${OUT_DIR}/plugins" "${OUT_DIR}/config" 
"${OUT_DIR}/bin"
+          mkdir -p "${OUT_DIR}/libs/tika-grpc" "${OUT_DIR}/plugins" 
"${OUT_DIR}/config" "${OUT_DIR}/bin"
 
           cp "tika-grpc/target/tika-grpc-${TIKA_VERSION}.jar" 
"${OUT_DIR}/libs/"
+          mvn -pl tika-grpc dependency:copy-dependencies \
+            -DoutputDirectory="${PWD}/${OUT_DIR}/libs/tika-grpc" \
+            -DincludeScope=runtime -q -B
 
           # Copy tika-pipes plugin zip files
           for dir in tika-pipes/tika-pipes-plugins/*/; do
diff --git a/.github/workflows/docker-snapshot.yml 
b/.github/workflows/docker-snapshot.yml
index 5b4e041415..cb82d05592 100644
--- a/.github/workflows/docker-snapshot.yml
+++ b/.github/workflows/docker-snapshot.yml
@@ -69,6 +69,38 @@ jobs:
           tar xzf 
"tika-server/tika-server-standard/target/tika-server-standard-${TIKA_VERSION}-bin.tgz"
 -C "${OUT_DIR}/tika-server"
           cp "tika-server/docker-build/minimal/Dockerfile.snapshot" 
"${OUT_DIR}/Dockerfile"
 
+      - name: Build tika-server minimal image for smoke test
+        uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
+        with:
+          context: target/tika-server-minimal-docker
+          platforms: linux/amd64
+          load: true
+          build-args: |
+            TIKA_VERSION=${{ steps.version.outputs.tika_version }}
+          tags: tika-server-minimal-smoke:ci
+
+      - name: Smoke test tika-server minimal image
+        run: |
+          cleanup() {
+            status=$?
+            if [ "$status" -ne 0 ]; then
+              docker logs tika-server-minimal-smoke || true
+            fi
+            docker rm -f tika-server-minimal-smoke >/dev/null 2>&1 || true
+            exit "$status"
+          }
+          trap cleanup EXIT
+          docker run -d --name tika-server-minimal-smoke -p 9998:9998 
tika-server-minimal-smoke:ci
+          for i in $(seq 1 20); do
+            if docker logs tika-server-minimal-smoke 2>&1 | grep -q "Started 
Apache Tika server"; then
+              echo "tika-server minimal started successfully"
+              exit 0
+            fi
+            sleep 2
+          done
+          echo "ERROR: tika-server minimal did not start within 40 seconds"
+          exit 1
+
       - name: Build and push tika-server minimal snapshot
         uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
         with:
@@ -89,6 +121,38 @@ jobs:
           tar xzf 
"tika-server/tika-server-standard/target/tika-server-standard-${TIKA_VERSION}-bin.tgz"
 -C "${OUT_DIR}/tika-server"
           cp "tika-server/docker-build/full/Dockerfile.snapshot" 
"${OUT_DIR}/Dockerfile"
 
+      - name: Build tika-server full image for smoke test
+        uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
+        with:
+          context: target/tika-server-full-docker
+          platforms: linux/amd64
+          load: true
+          build-args: |
+            TIKA_VERSION=${{ steps.version.outputs.tika_version }}
+          tags: tika-server-full-smoke:ci
+
+      - name: Smoke test tika-server full image
+        run: |
+          cleanup() {
+            status=$?
+            if [ "$status" -ne 0 ]; then
+              docker logs tika-server-full-smoke || true
+            fi
+            docker rm -f tika-server-full-smoke >/dev/null 2>&1 || true
+            exit "$status"
+          }
+          trap cleanup EXIT
+          docker run -d --name tika-server-full-smoke -p 9999:9998 
tika-server-full-smoke:ci
+          for i in $(seq 1 20); do
+            if docker logs tika-server-full-smoke 2>&1 | grep -q "Started 
Apache Tika server"; then
+              echo "tika-server full started successfully"
+              exit 0
+            fi
+            sleep 2
+          done
+          echo "ERROR: tika-server full did not start within 40 seconds"
+          exit 1
+
       - name: Build and push tika-server full snapshot
         uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
         with:
@@ -106,9 +170,12 @@ jobs:
           TIKA_VERSION="${{ steps.version.outputs.tika_version }}"
           OUT_DIR=target/tika-grpc-docker
 
-          mkdir -p "${OUT_DIR}/libs" "${OUT_DIR}/plugins" "${OUT_DIR}/config" 
"${OUT_DIR}/bin"
+          mkdir -p "${OUT_DIR}/libs/tika-grpc" "${OUT_DIR}/plugins" 
"${OUT_DIR}/config" "${OUT_DIR}/bin"
 
           cp "tika-grpc/target/tika-grpc-${TIKA_VERSION}.jar" 
"${OUT_DIR}/libs/"
+          mvn -pl tika-grpc dependency:copy-dependencies \
+            -DoutputDirectory="${PWD}/${OUT_DIR}/libs/tika-grpc" \
+            -DincludeScope=runtime -q -B
 
           # Copy tika-pipes plugin zip files
           for dir in tika-pipes/tika-pipes-plugins/*/; do
@@ -135,6 +202,40 @@ jobs:
           cp "tika-grpc/docker-build/start-tika-grpc.sh" "${OUT_DIR}/bin/"
           cp "tika-grpc/docker-build/Dockerfile" "${OUT_DIR}/Dockerfile"
 
+      - name: Build tika-grpc image for smoke test
+        uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
+        with:
+          context: target/tika-grpc-docker
+          platforms: linux/amd64
+          load: true
+          build-args: |
+            VERSION=${{ steps.version.outputs.tika_version }}
+          tags: tika-grpc-smoke:ci
+
+      - name: Smoke test tika-grpc image
+        run: |
+          cleanup() {
+            status=$?
+            if [ "$status" -ne 0 ]; then
+              docker logs tika-grpc-smoke || true
+              docker ps -a --filter "name=^tika-grpc-smoke$" || true
+              docker inspect -f '{{.State.ExitCode}}' tika-grpc-smoke || true
+            fi
+            docker rm -f tika-grpc-smoke >/dev/null 2>&1 || true
+            exit "$status"
+          }
+          trap cleanup EXIT
+          docker run -d --name tika-grpc-smoke -p 9090:9090 tika-grpc-smoke:ci
+          for i in $(seq 1 15); do
+            if docker logs tika-grpc-smoke 2>&1 | grep -q "Server started, 
listening on"; then
+              echo "tika-grpc started successfully"
+              exit 0
+            fi
+            sleep 2
+          done
+          echo "ERROR: tika-grpc did not start within 30 seconds"
+          exit 1
+
       - name: Build and push tika-grpc snapshot
         uses: 
docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
         with:
diff --git a/tika-grpc/pom.xml b/tika-grpc/pom.xml
index b3b3fe02cb..68fc531a0f 100644
--- a/tika-grpc/pom.xml
+++ b/tika-grpc/pom.xml
@@ -474,7 +474,7 @@
             <manifest>
               <mainClass>org.apache.tika.pipes.grpc.TikaGrpcServer</mainClass>
               <addClasspath>true</addClasspath>
-              <classpathPrefix>lib/</classpathPrefix>
+              <classpathPrefix>tika-grpc/</classpathPrefix>
             </manifest>
           </archive>
         </configuration>
diff --git a/tika-grpc/src/main/assembly/assembly.xml 
b/tika-grpc/src/main/assembly/assembly.xml
index 37c48d4032..849f267572 100644
--- a/tika-grpc/src/main/assembly/assembly.xml
+++ b/tika-grpc/src/main/assembly/assembly.xml
@@ -25,7 +25,7 @@
 
   <dependencySets>
     <dependencySet>
-      <outputDirectory>lib</outputDirectory>
+      <outputDirectory>tika-grpc</outputDirectory>
       <useProjectArtifact>false</useProjectArtifact>
       <unpack>false</unpack>
       <scope>runtime</scope>

Reply via email to