Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 9 additions & 7 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
## Copyright (c) 2024, 2026, Oracle and/or its affiliates.
## Licensed under the Universal Permissive License v1.0 as shown at http://oss.oracle.com/licenses/upl.
# spell-checker:disable

# Ignore everything
## Ignore everything
**

# Keep the src directory and pyproject.toml file
## Keep the src directory and pyproject.toml file
!src/
!pyproject.toml

# Inside src, ignore specific things
## Inside src, ignore specific things
src/**/Dockerfile*
src/**/tests/
src/**/__pycache__/
src/**/.pytest_cache/
src/**/tns_admin/
Expand All @@ -18,7 +20,7 @@ src/**/.*
src/**/*.sh
src/**/*.log

# But explicitly keep these
!src/.streamlit
!src/client/spring_ai/templates/start.sh
!src/entrypoint.sh
## But explicitly keep these
!src/client/app/.streamlit
!src/client/source/spring_ai/templates/start.sh
!src/entrypoint.py
269 changes: 239 additions & 30 deletions .github/workflows/pytest.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Workflow for running tests on server code
# Workflow for running tests with targeted CI based on changed files
# spell-checker: disable
name: Test Suite

on:
Expand All @@ -13,10 +14,70 @@ on:
workflow_dispatch:

jobs:
check:
if: github.event.pull_request.draft == false
detect-changes:
if: github.event.pull_request.draft == false || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-latest
permissions:
contents: read
outputs:
client: ${{ steps.changes.outputs.client }}
server: ${{ steps.changes.outputs.server }}
helm: ${{ steps.changes.outputs.helm }}
opentofu: ${{ steps.changes.outputs.opentofu }}
steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0

- name: Detect changed files
id: changes
run: |
# workflow_dispatch → run everything
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "client=true" >> $GITHUB_OUTPUT
echo "server=true" >> $GITHUB_OUTPUT
echo "helm=true" >> $GITHUB_OUTPUT
echo "opentofu=true" >> $GITHUB_OUTPUT
exit 0
fi

CHANGED=$(git diff --name-only ${{ github.event.pull_request.base.sha }}..HEAD)
echo "Changed files:"
echo "$CHANGED"

# Client: src/client + shared paths
if echo "$CHANGED" | grep -qE '^(src/client/|src/tests/|src/_version\.py|src/logging_config\.py|pyproject\.toml|pytest\.ini|\.yamllint)'; then
echo "client=true" >> $GITHUB_OUTPUT
else
echo "client=false" >> $GITHUB_OUTPUT
fi

# Server: src/server + shared paths
if echo "$CHANGED" | grep -qE '^(src/server/|src/tests/|src/_version\.py|src/logging_config\.py|pyproject\.toml|pytest\.ini|\.yamllint)'; then
echo "server=true" >> $GITHUB_OUTPUT
else
echo "server=false" >> $GITHUB_OUTPUT
fi

# Helm
if echo "$CHANGED" | grep -qE '^helm/'; then
echo "helm=true" >> $GITHUB_OUTPUT
else
echo "helm=false" >> $GITHUB_OUTPUT
fi

# OpenTofu
if echo "$CHANGED" | grep -qE '^opentofu/'; then
echo "opentofu=true" >> $GITHUB_OUTPUT
else
echo "opentofu=false" >> $GITHUB_OUTPUT
fi

check-client:
needs: detect-changes
if: needs.detect-changes.outputs.client == 'true'
runs-on: ubuntu-latest
# Block merging if the job fails
permissions:
pull-requests: write

Expand All @@ -31,57 +92,205 @@ jobs:
- name: Cache dependencies
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-client-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pip-client-

- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel setuptools uv
uv pip install -e ".[client,dev]" --system

- name: Run yamllint
run: yamllint src/client

- name: Run Pyright
run: pyright src/client

- name: Run Ruff
run: ruff check src/client

- name: Run Tests
run: pytest src/client/tests src/tests -v --junitxml=test-results-client.xml --cov=src/client --cov-report=xml:coverage-client.xml --cov-report=term

- name: Upload Test Results
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-client
path: |
~/.cache/pip
src/.tox
key: ${{ runner.os }}-pip-${{ hashFiles('src/pyproject.toml') }}
test-results-client.xml
coverage-client.xml

check-server:
needs: detect-changes
if: needs.detect-changes.outputs.server == 'true'
runs-on: ubuntu-latest
permissions:
pull-requests: write

steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.11"

- name: Cache dependencies
uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-server-${{ hashFiles('pyproject.toml') }}
restore-keys: |
${{ runner.os }}-pip-
${{ runner.os }}-pip-server-

- name: Install dependencies
run: |
python -m pip install --upgrade pip wheel setuptools uv
uv pip install torch==2.10.0+cpu -f https://download.pytorch.org/whl/cpu/torch --system
uv pip install -e ".[all-test]" --system
uv pip install -e ".[server,dev]" --system

- name: Run yamllint
run: yamllint src/server

- name: Run Pyright
run: pyright src/server

- name: Run Ruff
run: ruff check src/server

- name: Run Tests
run: pytest src/server/tests src/tests -v --junitxml=test-results-server.xml --cov=src/server --cov-report=xml:coverage-server.xml --cov-report=term

- name: Upload Test Results
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results-server
path: |
test-results-server.xml
coverage-server.xml

check-docling-version:
needs: detect-changes
if: needs.detect-changes.outputs.client == 'true' || needs.detect-changes.outputs.server == 'true'
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Verify docling versions match
run: |
PYPROJECT=$(grep -oP 'docling==\K[0-9.]+' pyproject.toml)
SERVER=$(grep -oP 'docling==\K[0-9.]+' src/server/Dockerfile)
CLIENT=$(grep -oP 'docling==\K[0-9.]+' src/Dockerfile)
echo "pyproject.toml: $PYPROJECT"
echo "src/server/Dockerfile: $SERVER"
echo "src/Dockerfile: $CLIENT"
if [ -z "$PYPROJECT" ] || [ -z "$SERVER" ] || [ -z "$CLIENT" ]; then
echo "::error::Failed to extract docling version from one or more files"
exit 1
fi
if [ "$PYPROJECT" != "$SERVER" ] || [ "$PYPROJECT" != "$CLIENT" ]; then
echo "::error::docling version mismatch between pyproject.toml and Dockerfiles"
exit 1
fi

check-helm:
needs: detect-changes
if: needs.detect-changes.outputs.helm == 'true'
runs-on: ubuntu-latest
permissions:
contents: read

steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.11"

- name: Install dependencies
run: |
pip install yamllint
HELM_INSTALL_SCRIPT=$(mktemp)
curl -fsSL -o "$HELM_INSTALL_SCRIPT" https://raw.githubusercontent.com/helm/helm/v4.1.4/scripts/get-helm-3
EXPECTED_HASH="38b65f882d9cae3891755bdb03becc6a01ae6f9cb24826c191f219ddfee70a5d"
ACTUAL_HASH=$(sha256sum "$HELM_INSTALL_SCRIPT" | cut -d' ' -f1)
if [ "$ACTUAL_HASH" != "$EXPECTED_HASH" ]; then
echo "Helm install script hash mismatch!"
echo "Helm install script hash mismatch!"
echo "Expected: $EXPECTED_HASH"
echo "Actual: $ACTUAL_HASH"
exit 1
fi
bash "$HELM_INSTALL_SCRIPT"

- name: Run yamllint on Code
run: yamllint .
- name: Run yamllint
run: yamllint helm/

- name: Run Helm Lint (basic structure)
run: helm lint helm/

- name: Run Helm Lint (with required values)
run: helm lint helm/ --set global.api.apiKey=test-api-key

- name: Run Pylint on IaC Code
run: pylint opentofu
check-opentofu:
needs: detect-changes
if: needs.detect-changes.outputs.opentofu == 'true'
runs-on: ubuntu-latest
permissions:
contents: read

- name: Run Pylint on Source Code
run: pylint src
steps:
- name: Checkout Code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Run Pylint on Tests
run: pylint tests
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
with:
python-version: "3.11"

- name: Run All Tests
run: pytest tests -v --junitxml=test-results.xml --cov=src --cov-report=xml --cov-report=term
- name: Install dependencies
run: pip install ruff

- name: Upload Test Results
if: always()
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: test-results
path: |
test-results.xml
coverage.xml
.coverage
- name: Run Ruff
run: ruff check opentofu

check:
needs:
- detect-changes
- check-client
- check-server
- check-docling-version
- check-helm
- check-opentofu
if: always() && (github.event.pull_request.draft == false || github.event_name == 'workflow_dispatch')
runs-on: ubuntu-latest
permissions: {}

steps:
- name: Evaluate results
run: |
echo "detect-changes: ${{ needs.detect-changes.result }}"
echo "check-client: ${{ needs.check-client.result }}"
echo "check-server: ${{ needs.check-server.result }}"
echo "check-docling-version: ${{ needs.check-docling-version.result }}"
echo "check-helm: ${{ needs.check-helm.result }}"
echo "check-opentofu: ${{ needs.check-opentofu.result }}"

# Fail if any upstream job failed (skipped is OK)
if [ "${{ needs.detect-changes.result }}" = "failure" ] || \
[ "${{ needs.check-client.result }}" = "failure" ] || \
[ "${{ needs.check-server.result }}" = "failure" ] || \
[ "${{ needs.check-docling-version.result }}" = "failure" ] || \
[ "${{ needs.check-helm.result }}" = "failure" ] || \
[ "${{ needs.check-opentofu.result }}" = "failure" ]; then
echo "One or more jobs failed"
exit 1
fi

echo "All jobs passed or were skipped"
Loading
Loading