feat: Update colours + styling #7976
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Run Integration Tests v2 | |
concurrency: | |
group: Run-Integration-Tests-${{ github.workflow }}-${{ github.head_ref || github.event.workflow_run.head_branch || github.run_id }} | |
cancel-in-progress: true | |
on: | |
merge_group: | |
pull_request: | |
branches: | |
- main | |
- "release/**" | |
env: | |
# Private Registry Configuration | |
PRIVATE_REGISTRY: experimental-registry.blacksmith.sh:5000 | |
PRIVATE_REGISTRY_USERNAME: ${{ secrets.PRIVATE_REGISTRY_USERNAME }} | |
PRIVATE_REGISTRY_PASSWORD: ${{ secrets.PRIVATE_REGISTRY_PASSWORD }} | |
# Test Environment Variables | |
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} | |
CONFLUENCE_TEST_SPACE_URL: ${{ secrets.CONFLUENCE_TEST_SPACE_URL }} | |
CONFLUENCE_USER_NAME: ${{ secrets.CONFLUENCE_USER_NAME }} | |
CONFLUENCE_ACCESS_TOKEN: ${{ secrets.CONFLUENCE_ACCESS_TOKEN }} | |
JIRA_BASE_URL: ${{ secrets.JIRA_BASE_URL }} | |
JIRA_USER_EMAIL: ${{ secrets.JIRA_USER_EMAIL }} | |
JIRA_API_TOKEN: ${{ secrets.JIRA_API_TOKEN }} | |
PERM_SYNC_SHAREPOINT_CLIENT_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_CLIENT_ID }} | |
PERM_SYNC_SHAREPOINT_PRIVATE_KEY: ${{ secrets.PERM_SYNC_SHAREPOINT_PRIVATE_KEY }} | |
PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD: ${{ secrets.PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD }} | |
PERM_SYNC_SHAREPOINT_DIRECTORY_ID: ${{ secrets.PERM_SYNC_SHAREPOINT_DIRECTORY_ID }} | |
jobs: | |
discover-test-dirs: | |
runs-on: blacksmith-2vcpu-ubuntu-2404-arm | |
outputs: | |
test-dirs: ${{ steps.set-matrix.outputs.test-dirs }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Discover test directories | |
id: set-matrix | |
run: | | |
# Find all leaf-level directories in both test directories | |
tests_dirs=$(find backend/tests/integration/tests -mindepth 1 -maxdepth 1 -type d ! -name "__pycache__" -exec basename {} \; | sort) | |
connector_dirs=$(find backend/tests/integration/connector_job_tests -mindepth 1 -maxdepth 1 -type d ! -name "__pycache__" -exec basename {} \; | sort) | |
# Create JSON array with directory info | |
all_dirs="" | |
for dir in $tests_dirs; do | |
all_dirs="$all_dirs{\"path\":\"tests/$dir\",\"name\":\"tests-$dir\"}," | |
done | |
for dir in $connector_dirs; do | |
all_dirs="$all_dirs{\"path\":\"connector_job_tests/$dir\",\"name\":\"connector-$dir\"}," | |
done | |
# Remove trailing comma and wrap in array | |
all_dirs="[${all_dirs%,}]" | |
echo "test-dirs=$all_dirs" >> $GITHUB_OUTPUT | |
prepare-build: | |
runs-on: blacksmith-2vcpu-ubuntu-2404-arm | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Setup Python | |
uses: actions/setup-python@v5 | |
with: | |
python-version: "3.11" | |
cache: "pip" | |
cache-dependency-path: | | |
backend/requirements/default.txt | |
backend/requirements/dev.txt | |
- name: Install Python dependencies | |
run: | | |
python -m pip install --upgrade pip | |
pip install --retries 5 --timeout 30 -r backend/requirements/default.txt | |
pip install --retries 5 --timeout 30 -r backend/requirements/dev.txt | |
- name: Generate OpenAPI schema | |
working-directory: ./backend | |
env: | |
PYTHONPATH: "." | |
run: | | |
python scripts/onyx_openapi_schema.py --filename generated/openapi.json | |
- name: Generate OpenAPI Python client | |
working-directory: ./backend | |
run: | | |
docker run --rm \ | |
-v "${{ github.workspace }}/backend/generated:/local" \ | |
openapitools/openapi-generator-cli generate \ | |
-i /local/openapi.json \ | |
-g python \ | |
-o /local/onyx_openapi_client \ | |
--package-name onyx_openapi_client \ | |
--skip-validate-spec \ | |
--openapi-normalizer "SIMPLIFY_ONEOF_ANYOF=true,SET_OAS3_NULLABLE=true" | |
- name: Upload OpenAPI artifacts | |
uses: actions/upload-artifact@v4 | |
with: | |
name: openapi-artifacts | |
path: backend/generated/ | |
build-backend-image: | |
runs-on: blacksmith-16vcpu-ubuntu-2404-arm | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Login to Private Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.PRIVATE_REGISTRY }} | |
username: ${{ env.PRIVATE_REGISTRY_USERNAME }} | |
password: ${{ env.PRIVATE_REGISTRY_PASSWORD }} | |
- name: Set up Docker Buildx | |
uses: useblacksmith/setup-docker-builder@v1 | |
- name: Build and push Backend Docker image | |
uses: useblacksmith/build-push-action@v2 | |
with: | |
context: ./backend | |
file: ./backend/Dockerfile | |
platforms: linux/arm64 | |
tags: ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-backend:test-${{ github.run_id }} | |
push: true | |
build-model-server-image: | |
runs-on: blacksmith-16vcpu-ubuntu-2404-arm | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Login to Private Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.PRIVATE_REGISTRY }} | |
username: ${{ env.PRIVATE_REGISTRY_USERNAME }} | |
password: ${{ env.PRIVATE_REGISTRY_PASSWORD }} | |
- name: Set up Docker Buildx | |
uses: useblacksmith/setup-docker-builder@v1 | |
- name: Build and push Model Server Docker image | |
uses: useblacksmith/build-push-action@v2 | |
with: | |
context: ./backend | |
file: ./backend/Dockerfile.model_server | |
platforms: linux/arm64 | |
tags: ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-model-server:test-${{ github.run_id }} | |
push: true | |
outputs: type=registry | |
provenance: false | |
build-integration-image: | |
needs: prepare-build | |
runs-on: blacksmith-16vcpu-ubuntu-2404-arm | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Login to Private Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.PRIVATE_REGISTRY }} | |
username: ${{ env.PRIVATE_REGISTRY_USERNAME }} | |
password: ${{ env.PRIVATE_REGISTRY_PASSWORD }} | |
- name: Download OpenAPI artifacts | |
uses: actions/download-artifact@v4 | |
with: | |
name: openapi-artifacts | |
path: backend/generated/ | |
- name: Set up Docker Buildx | |
uses: useblacksmith/setup-docker-builder@v1 | |
- name: Build and push integration test Docker image | |
uses: useblacksmith/build-push-action@v2 | |
with: | |
context: ./backend | |
file: ./backend/tests/integration/Dockerfile | |
platforms: linux/arm64 | |
tags: ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-integration:test-${{ github.run_id }} | |
push: true | |
integration-tests: | |
needs: | |
[ | |
discover-test-dirs, | |
build-backend-image, | |
build-model-server-image, | |
build-integration-image, | |
] | |
runs-on: blacksmith-8vcpu-ubuntu-2404-arm | |
strategy: | |
fail-fast: false | |
matrix: | |
test-dir: ${{ fromJson(needs.discover-test-dirs.outputs.test-dirs) }} | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Login to Private Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.PRIVATE_REGISTRY }} | |
username: ${{ env.PRIVATE_REGISTRY_USERNAME }} | |
password: ${{ env.PRIVATE_REGISTRY_PASSWORD }} | |
# needed for pulling Vespa, Redis, Postgres, and Minio images | |
# otherwise, we hit the "Unauthenticated users" limit | |
# https://docs.docker.com/docker-hub/usage/ | |
- name: Login to Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_TOKEN }} | |
- name: Pull Docker images | |
run: | | |
# Pull all images from registry in parallel | |
echo "Pulling Docker images in parallel..." | |
# Pull images from private registry | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-backend:test-${{ github.run_id }}) & | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-model-server:test-${{ github.run_id }}) & | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-integration:test-${{ github.run_id }}) & | |
# Wait for all background jobs to complete | |
wait | |
echo "All Docker images pulled successfully" | |
# Re-tag to remove registry prefix for docker-compose | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-backend:test-${{ github.run_id }} onyxdotapp/onyx-backend:test | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-model-server:test-${{ github.run_id }} onyxdotapp/onyx-model-server:test | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-integration:test-${{ github.run_id }} onyxdotapp/onyx-integration:test | |
# NOTE: Use pre-ping/null pool to reduce flakiness due to dropped connections | |
# NOTE: don't need web server for integration tests | |
- name: Start Docker containers | |
run: | | |
cd deployment/docker_compose | |
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true \ | |
AUTH_TYPE=basic \ | |
POSTGRES_POOL_PRE_PING=true \ | |
POSTGRES_USE_NULL_POOL=true \ | |
REQUIRE_EMAIL_VERIFICATION=false \ | |
DISABLE_TELEMETRY=true \ | |
IMAGE_TAG=test \ | |
INTEGRATION_TESTS_MODE=true \ | |
CHECK_TTL_MANAGEMENT_TASK_FREQUENCY_IN_HOURS=0.001 \ | |
docker compose -f docker-compose.dev.yml -p onyx-stack up \ | |
relational_db \ | |
index \ | |
cache \ | |
minio \ | |
api_server \ | |
inference_model_server \ | |
indexing_model_server \ | |
background \ | |
-d | |
id: start_docker | |
- name: Wait for service to be ready | |
run: | | |
echo "Starting wait-for-service script..." | |
docker logs -f onyx-stack-api_server-1 & | |
start_time=$(date +%s) | |
timeout=300 # 5 minutes in seconds | |
while true; do | |
current_time=$(date +%s) | |
elapsed_time=$((current_time - start_time)) | |
if [ $elapsed_time -ge $timeout ]; then | |
echo "Timeout reached. Service did not become ready in 5 minutes." | |
exit 1 | |
fi | |
# Use curl with error handling to ignore specific exit code 56 | |
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health || echo "curl_error") | |
if [ "$response" = "200" ]; then | |
echo "Service is ready!" | |
break | |
elif [ "$response" = "curl_error" ]; then | |
echo "Curl encountered an error, possibly exit code 56. Continuing to retry..." | |
else | |
echo "Service not ready yet (HTTP status $response). Retrying in 5 seconds..." | |
fi | |
sleep 5 | |
done | |
echo "Finished waiting for service." | |
- name: Start Mock Services | |
run: | | |
cd backend/tests/integration/mock_services | |
docker compose -f docker-compose.mock-it-services.yml \ | |
-p mock-it-services-stack up -d | |
- name: Run Integration Tests for ${{ matrix.test-dir.name }} | |
uses: nick-fields/retry@v3 | |
with: | |
timeout_minutes: 20 | |
max_attempts: 3 | |
retry_wait_seconds: 10 | |
command: | | |
echo "Running integration tests for ${{ matrix.test-dir.path }}..." | |
docker run --rm --network onyx-stack_default \ | |
--name test-runner \ | |
-e POSTGRES_HOST=relational_db \ | |
-e POSTGRES_USER=postgres \ | |
-e POSTGRES_PASSWORD=password \ | |
-e POSTGRES_DB=postgres \ | |
-e DB_READONLY_USER=db_readonly_user \ | |
-e DB_READONLY_PASSWORD=password \ | |
-e POSTGRES_POOL_PRE_PING=true \ | |
-e POSTGRES_USE_NULL_POOL=true \ | |
-e VESPA_HOST=index \ | |
-e REDIS_HOST=cache \ | |
-e API_SERVER_HOST=api_server \ | |
-e OPENAI_API_KEY=${OPENAI_API_KEY} \ | |
-e SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN} \ | |
-e CONFLUENCE_TEST_SPACE_URL=${CONFLUENCE_TEST_SPACE_URL} \ | |
-e CONFLUENCE_USER_NAME=${CONFLUENCE_USER_NAME} \ | |
-e CONFLUENCE_ACCESS_TOKEN=${CONFLUENCE_ACCESS_TOKEN} \ | |
-e JIRA_BASE_URL=${JIRA_BASE_URL} \ | |
-e JIRA_USER_EMAIL=${JIRA_USER_EMAIL} \ | |
-e JIRA_API_TOKEN=${JIRA_API_TOKEN} \ | |
-e PERM_SYNC_SHAREPOINT_CLIENT_ID=${PERM_SYNC_SHAREPOINT_CLIENT_ID} \ | |
-e PERM_SYNC_SHAREPOINT_PRIVATE_KEY="${PERM_SYNC_SHAREPOINT_PRIVATE_KEY}" \ | |
-e PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD=${PERM_SYNC_SHAREPOINT_CERTIFICATE_PASSWORD} \ | |
-e PERM_SYNC_SHAREPOINT_DIRECTORY_ID=${PERM_SYNC_SHAREPOINT_DIRECTORY_ID} \ | |
-e TEST_WEB_HOSTNAME=test-runner \ | |
-e MOCK_CONNECTOR_SERVER_HOST=mock_connector_server \ | |
-e MOCK_CONNECTOR_SERVER_PORT=8001 \ | |
onyxdotapp/onyx-integration:test \ | |
/app/tests/integration/${{ matrix.test-dir.path }} | |
# ------------------------------------------------------------ | |
# Always gather logs BEFORE "down": | |
- name: Dump API server logs | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.dev.yml -p onyx-stack logs --no-color api_server > $GITHUB_WORKSPACE/api_server.log || true | |
- name: Dump all-container logs (optional) | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.dev.yml -p onyx-stack logs --no-color > $GITHUB_WORKSPACE/docker-compose.log || true | |
- name: Upload logs | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: docker-all-logs-${{ matrix.test-dir.name }} | |
path: ${{ github.workspace }}/docker-compose.log | |
# ------------------------------------------------------------ | |
- name: Stop Docker containers | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.dev.yml -p onyx-stack down -v | |
multitenant-tests: | |
needs: | |
[ | |
build-backend-image, | |
build-model-server-image, | |
build-integration-image, | |
] | |
runs-on: blacksmith-8vcpu-ubuntu-2404-arm | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Login to Private Registry | |
uses: docker/login-action@v3 | |
with: | |
registry: ${{ env.PRIVATE_REGISTRY }} | |
username: ${{ env.PRIVATE_REGISTRY_USERNAME }} | |
password: ${{ env.PRIVATE_REGISTRY_PASSWORD }} | |
- name: Login to Docker Hub | |
uses: docker/login-action@v3 | |
with: | |
username: ${{ secrets.DOCKER_USERNAME }} | |
password: ${{ secrets.DOCKER_TOKEN }} | |
- name: Pull Docker images | |
run: | | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-backend:test-${{ github.run_id }}) & | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-model-server:test-${{ github.run_id }}) & | |
(docker pull ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-integration:test-${{ github.run_id }}) & | |
wait | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-backend:test-${{ github.run_id }} onyxdotapp/onyx-backend:test | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-model-server:test-${{ github.run_id }} onyxdotapp/onyx-model-server:test | |
docker tag ${{ env.PRIVATE_REGISTRY }}/integration-test-onyx-integration:test-${{ github.run_id }} onyxdotapp/onyx-integration:test | |
- name: Start Docker containers for multi-tenant tests | |
run: | | |
cd deployment/docker_compose | |
ENABLE_PAID_ENTERPRISE_EDITION_FEATURES=true \ | |
MULTI_TENANT=true \ | |
AUTH_TYPE=cloud \ | |
REQUIRE_EMAIL_VERIFICATION=false \ | |
DISABLE_TELEMETRY=true \ | |
IMAGE_TAG=test \ | |
DEV_MODE=true \ | |
docker compose -f docker-compose.multitenant-dev.yml -p onyx-stack up \ | |
relational_db \ | |
index \ | |
cache \ | |
minio \ | |
api_server \ | |
inference_model_server \ | |
indexing_model_server \ | |
background \ | |
-d | |
id: start_docker_multi_tenant | |
- name: Wait for service to be ready (multi-tenant) | |
run: | | |
echo "Starting wait-for-service script for multi-tenant..." | |
docker logs -f onyx-stack-api_server-1 & | |
start_time=$(date +%s) | |
timeout=300 | |
while true; do | |
current_time=$(date +%s) | |
elapsed_time=$((current_time - start_time)) | |
if [ $elapsed_time -ge $timeout ]; then | |
echo "Timeout reached. Service did not become ready in 5 minutes." | |
exit 1 | |
fi | |
response=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8080/health || echo "curl_error") | |
if [ "$response" = "200" ]; then | |
echo "Service is ready!" | |
break | |
elif [ "$response" = "curl_error" ]; then | |
echo "Curl encountered an error; retrying..." | |
else | |
echo "Service not ready yet (HTTP $response). Retrying in 5 seconds..." | |
fi | |
sleep 5 | |
done | |
echo "Finished waiting for service." | |
- name: Run Multi-Tenant Integration Tests | |
run: | | |
echo "Running multi-tenant integration tests..." | |
docker run --rm --network onyx-stack_default \ | |
--name test-runner \ | |
-e POSTGRES_HOST=relational_db \ | |
-e POSTGRES_USER=postgres \ | |
-e POSTGRES_PASSWORD=password \ | |
-e DB_READONLY_USER=db_readonly_user \ | |
-e DB_READONLY_PASSWORD=password \ | |
-e POSTGRES_DB=postgres \ | |
-e POSTGRES_USE_NULL_POOL=true \ | |
-e VESPA_HOST=index \ | |
-e REDIS_HOST=cache \ | |
-e API_SERVER_HOST=api_server \ | |
-e OPENAI_API_KEY=${OPENAI_API_KEY} \ | |
-e SLACK_BOT_TOKEN=${SLACK_BOT_TOKEN} \ | |
-e TEST_WEB_HOSTNAME=test-runner \ | |
-e AUTH_TYPE=cloud \ | |
-e MULTI_TENANT=true \ | |
-e SKIP_RESET=true \ | |
-e REQUIRE_EMAIL_VERIFICATION=false \ | |
-e DISABLE_TELEMETRY=true \ | |
-e IMAGE_TAG=test \ | |
-e DEV_MODE=true \ | |
onyxdotapp/onyx-integration:test \ | |
/app/tests/integration/multitenant_tests | |
- name: Dump API server logs (multi-tenant) | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.multitenant-dev.yml -p onyx-stack logs --no-color api_server > $GITHUB_WORKSPACE/api_server_multitenant.log || true | |
- name: Dump all-container logs (multi-tenant) | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.multitenant-dev.yml -p onyx-stack logs --no-color > $GITHUB_WORKSPACE/docker-compose-multitenant.log || true | |
- name: Upload logs (multi-tenant) | |
if: always() | |
uses: actions/upload-artifact@v4 | |
with: | |
name: docker-all-logs-multitenant | |
path: ${{ github.workspace }}/docker-compose-multitenant.log | |
- name: Stop multi-tenant Docker containers | |
if: always() | |
run: | | |
cd deployment/docker_compose | |
docker compose -f docker-compose.multitenant-dev.yml -p onyx-stack down -v | |
required: | |
runs-on: blacksmith-2vcpu-ubuntu-2404-arm | |
needs: [integration-tests, multitenant-tests] | |
if: ${{ always() }} | |
steps: | |
- uses: actions/github-script@v7 | |
with: | |
script: | | |
const needs = ${{ toJSON(needs) }}; | |
const failed = Object.values(needs).some(n => n.result !== 'success'); | |
if (failed) { | |
core.setFailed('One or more upstream jobs failed or were cancelled.'); | |
} else { | |
core.notice('All required jobs succeeded.'); | |
} |