Skip to content
Open
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
65d29b6
Introduce CI Actions for Quarkus-LangChain4j integration tests with G…
orionpapadakis Dec 12, 2025
0644b5c
Introduce CI Actions for Quarkus-LangChain4j integration tests with G…
orionpapadakis Dec 12, 2025
6001328
Introduce CI Actions for Quarkus-LangChain4j integration tests with G…
orionpapadakis Dec 12, 2025
b174197
Create dedicated directory for integrations in ci workflows and move …
orionpapadakis Dec 18, 2025
e64caaf
Rename Quarkus-LangChain4j integration workflow file
orionpapadakis Dec 18, 2025
a235250
Update Quarkus-LangChain4j workflow name
orionpapadakis Dec 18, 2025
5c71ce7
Split steps Quarkus-LangChain4j workflow and add validate results
orionpapadakis Dec 18, 2025
5a22cac
Fix yaml syntax
orionpapadakis Dec 18, 2025
c764752
Replace `TORNADO_SDK` with `TORNADOVM_HOME`
orionpapadakis Dec 18, 2025
2bc2bd1
Temp quarkus-langchain4j checkout from hotfix branch
orionpapadakis Dec 18, 2025
9b6fb41
Enable fail-fast and testing on `ptx` backend
orionpapadakis Dec 18, 2025
5a0b554
Enable scheduled runs and restore pull_request triggers for Quarkus-L…
orionpapadakis Dec 18, 2025
218a596
Improve Quarkus-LangChain4j workflow by adding response body logging …
orionpapadakis Dec 18, 2025
52b6979
Switch to cloning the main Quarkus-LangChain4j repository in the work…
orionpapadakis Dec 18, 2025
d675b91
Add GPULlama3 build and versioning step to Quarkus-LangChain4j workflow
orionpapadakis Dec 19, 2025
18f1cd5
Add retry mechanism for Blocking Endpoint test in Quarkus-LangChain4j…
orionpapadakis Dec 19, 2025
cf5863c
Add retry mechanism for Streaming Endpoint test in Quarkus-LangChain4…
orionpapadakis Dec 19, 2025
09f4118
Add GPULlama3 JAR verification step to Quarkus-LangChain4j workflow
orionpapadakis Dec 19, 2025
3073c7d
Update GPULlama3 versioning and verification steps in Quarkus-LangCha…
orionpapadakis Dec 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
260 changes: 260 additions & 0 deletions .github/workflows/integration-quarkus-langchain4j.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,260 @@
name: Integration Quarkus-LangChain4j

on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
types: [opened, synchronize, reopened]
schedule:
# Run every Saturday at 02:30 UTC to catch dependency breakages
- cron: '30 2 * * 6'
workflow_dispatch:
inputs:
quarkus_langchain4j_version:
description: 'Quarkus LangChain4j version to test against'
required: false
type: string
quarkus_version:
description: 'Quarkus platform version to test against'
required: false
type: string

env:
JAVA_HOME: /opt/jenkins/jdks/graal-23.1.0/jdk-21.0.3
TORNADO_ROOT: ${{ github.workspace }}/GPULlama3.java/external/tornadovm
GRAAL_JARS: /opt/graalJars
QUARKUS_PORT: 8081

jobs:
quarkus-integration-test:
if: github.repository == 'beehive-lab/GPULlama3.java'
runs-on: [self-hosted]
timeout-minutes: 30
strategy:
fail-fast: true
matrix:
backend:
- name: opencl
- name: ptx

steps:
- name: Checkout GPULlama3
uses: actions/checkout@v4

# Step 1: Clone and build TornadoVM
- name: Clone TornadoVM master
run: |
git clone --depth 1 --branch master \
https://github.com/beehive-lab/TornadoVM.git \
$TORNADO_ROOT
- name: Set up Python venv for TornadoVM
run: |
python3 -m venv $TORNADO_ROOT/venv
source $TORNADO_ROOT/venv/bin/activate
python --version
- name: Build TornadoVM
run: |
cd $TORNADO_ROOT
mkdir -p graalJars && cp $GRAAL_JARS/* graalJars/
source venv/bin/activate
echo "=== Building TornadoVM ==="

make BACKEND=${{ matrix.backend.name }}

echo "=== Searching for TornadoVM SDK directory ==="
SDK_DIR=$(find dist -type d -maxdepth 3 -path "*/tornadovm-*-${{ matrix.backend.name }}" | head -n 1)
if [ -z "$SDK_DIR" ]; then
echo "::error::Could not locate TornadoVM SDK directory!"
find dist -maxdepth 5 -type d
exit 1
fi
FULL_SDK="${PWD}/${SDK_DIR}"
echo "Detected TornadoVM SDK: $FULL_SDK"

# Export for current shell session
export TORNADOVM_HOME="$FULL_SDK"
export PATH="$FULL_SDK/bin:$JAVA_HOME/bin:$PATH"

# Save for subsequent steps
echo "TORNADOVM_HOME=$FULL_SDK" >> $GITHUB_ENV
echo "PATH=$PATH" >> $GITHUB_ENV

echo "=== Checking tornado CLI ==="
which tornado || { echo "::error::tornado not in PATH"; exit 1; }
tornado --devices

# Step 2: Build GPULlama3.java
- name: Build GPULlama3.java
run: |
cd ${{ github.workspace }}
echo "Using TORNADOVM_HOME=$TORNADOVM_HOME"
export PATH="$TORNADOVM_HOME/bin:$JAVA_HOME/bin:$PATH"
tornado --version

# Append SNAPSHOT to GPULlama3 version
GPULLAMA3_VERSION=$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout)
GPULLAMA3_VERSION="${GPULLAMA3_VERSION}-SNAPSHOT"
echo "GPULlama3 version: $GPULLAMA3_VERSION"
./mvnw versions:set -DnewVersion=$GPULLAMA3_VERSION

# Build
./mvnw clean install -DskipTests

# Save GPULlama3.java version for subsequent steps
echo "GPULLAMA3_VERSION=$GPULLAMA3_VERSION" >> $GITHUB_ENV

# Step 3: Clone Quarkus LangChain4j
- name: Clone Quarkus LangChain4j
run: |
cd ${{ github.workspace }}
git clone https://github.com/quarkiverse/quarkus-langchain4j.git

# Step 4: Build Quarkus LangChain4j with current GPULlama3.java
- name: Build Quarkus LangChain4j
run: |
cd ${{ github.workspace }}/quarkus-langchain4j
export PATH="$TORNADOVM_HOME/bin:$JAVA_HOME/bin:$PATH"

# Update the GPULlama3 version used by quarkus-langchain4j
POM="pom.xml"
sed -i 's/<gpu-llama3\.version>.*<\/gpu-llama3\.version>/<gpu-llama3.version>'$GPULLAMA3_VERSION'<\/gpu-llama3.version>/' "$POM"

# Use reactor to build *only *GPULlama3 integration test + dependencies
# This recompiles everything with the same Java version, avoiding compatibility issues
# The -Dtornado flag activates the TornadoVM profile which includes gpu-llama3 module
mvn clean install -pl integration-tests/gpu-llama3 -am -DskipTests -Dtornado

# Step 4.5: Verify GPULlama3 JAR
- name: Verify GPULlama3 Dependency
run: |
cd ${{ github.workspace }}/quarkus-langchain4j/integration-tests/gpu-llama3
echo "GPULlama3 dependency used by Quarkus-LangChain4j:"
mvn dependency:tree | grep "io.github.beehive-lab:gpu-llama3"

# Step 5: Start Quarkus Application and Wait for Startup
- name: Start Quarkus Application and Wait for Startup
run: |
cd ${{ github.workspace }}/quarkus-langchain4j/integration-tests/gpu-llama3
export PATH="$TORNADOVM_HOME/bin:$JAVA_HOME/bin:$PATH"

echo "Starting Quarkus application on port $QUARKUS_PORT..."

# Start the Quarkus application in the background
java @"$TORNADOVM_HOME/tornado-argfile" \
-Dtornado.device.memory=8GB \
-Dquarkus.http.port=$QUARKUS_PORT \
-jar target/quarkus-app/quarkus-run.jar &
APP_PID=$!

if [ -z "$APP_PID" ]; then
echo "ERROR: Failed to start Quarkus application"
exit 1
fi

echo "Waiting for Quarkus application to start..."

# Wait for application to be ready
for i in {1..30}; do
if curl -s http://localhost:$QUARKUS_PORT/q/health > /dev/null 2>&1; then
echo "Application ready after ${i} seconds"
echo "Health endpoint: http://localhost:$QUARKUS_PORT/q/health"
break
elif [ $i -eq 30 ]; then
echo "ERROR: Application failed to start within 30 seconds"
echo "Debugging info:"
echo "- Port: $QUARKUS_PORT"
echo "- Process ID: $APP_PID"
echo "- Health URL: http://localhost:$QUARKUS_PORT/q/health"
kill $APP_PID || true
exit 1
else
[ $((i % 5)) -eq 0 ] && echo "Still waiting... (${i}s)"
sleep 1
fi
done

# Step 6: Run test 1
- name: Trigger Blocking Endpoint
run: |
MAX_ATTEMPTS=3
ATTEMPT=1
SUCCESS=false

while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS for blocking endpoint..."

# Trigger endpoint
HTTP_RESPONSE=$(curl -s -w "%{http_code}" http://localhost:$QUARKUS_PORT/chat/blocking)
HTTP_RESPONSE_CODE="${HTTP_RESPONSE: -3}"
HTTP_RESPONSE_BODY="${HTTP_RESPONSE%???}"

# Check response code
if [ "$HTTP_RESPONSE_CODE" = "200" ]; then
echo "SUCCESS: Blocking endpoint returned HTTP code: $HTTP_RESPONSE_CODE"
echo "HTTP Response body: $HTTP_RESPONSE_BODY"
SUCCESS=true
break
else
echo "Attempt $ATTEMPT failed: Blocking endpoint returned HTTP code $HTTP_RESPONSE_CODE"
echo "Response body: $HTTP_RESPONSE_BODY"

if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
echo "Retrying in 2 seconds..."
sleep 2
fi
fi

ATTEMPT=$((ATTEMPT + 1))
done

if [ "$SUCCESS" = false ]; then
echo "ERROR: Blocking endpoint failed after $MAX_ATTEMPTS attempts"
exit 1
fi

# Step 7: Run test 2
- name: Trigger Streaming Endpoint
run: |
MAX_ATTEMPTS=3
ATTEMPT=1
SUCCESS=false

while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
echo "Attempt $ATTEMPT of $MAX_ATTEMPTS for streaming endpoint..."

# Trigger endpoint
HTTP_RESPONSE=$(timeout 10s curl -s -w "%{http_code}" http://localhost:$QUARKUS_PORT/chat/streaming)
HTTP_RESPONSE_CODE="${HTTP_RESPONSE: -3}"
#HTTP_RESPONSE_BODY="$HTTP_RESPONSE%???}"

# Check response code
if [ "$HTTP_RESPONSE_CODE" == "200" ]; then
echo "SUCCESS: Streaming endpoint returned HTTP code: ${HTTP_RESPONSE: -3}"
# do not show ugly streaming response body
#echo "HTTP Response body: $HTTP_RESPONSE_BODY"
SUCCESS=true
break
else
echo "Attempt $ATTEMPT failed: Streaming endpoint returned HTTP code $HTTP_RESPONSE_CODE"

if [ $ATTEMPT -lt $MAX_ATTEMPTS ]; then
echo "Retrying in 2 seconds..."
sleep 2
fi
fi

ATTEMPT=$((ATTEMPT + 1))
done

if [ "$SUCCESS" = false ]; then
echo "ERROR: Streaming endpoint failed after $MAX_ATTEMPTS attempts"
exit 1
fi

# Step 8: Cleanup & Shutdown
- name: Cleanup & Shutdown
run: |
# Clean shutdown
kill $APP_PID || true
wait $APP_PID 2>/dev/null || true