name: Integration Test on: push: branches: - main - dev pull_request: branches: - main - dev jobs: cypress-run: name: Run Cypress Integration Tests runs-on: ubuntu-latest steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Build and run Compose Stack run: | docker compose up --detach --build - name: Preload Ollama model run: | docker exec ollama ollama pull qwen:0.5b-chat-v1.5-q2_K - name: Cypress run uses: cypress-io/github-action@v6 with: browser: chrome wait-on: 'http://localhost:3000' config: baseUrl=http://localhost:3000 - uses: actions/upload-artifact@v4 if: always() name: Upload Cypress videos with: name: cypress-videos path: cypress/videos if-no-files-found: ignore - name: Extract Compose logs if: always() run: | docker compose logs > compose-logs.txt - uses: actions/upload-artifact@v4 if: always() name: Upload Compose logs with: name: compose-logs path: compose-logs.txt if-no-files-found: ignore migration_test: name: Run Migration Tests runs-on: ubuntu-latest services: postgres: image: postgres env: POSTGRES_PASSWORD: postgres options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 mysql: image: mysql env: MYSQL_ROOT_PASSWORD: mysql MYSQL_DATABASE: mysql options: >- --health-cmd "mysqladmin ping -h localhost" --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 3306:3306 steps: - name: Checkout Repository uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Set up uv uses: yezz123/setup-uv@v4 with: uv-venv: venv - name: Activate virtualenv run: | . venv/bin/activate echo PATH=$PATH >> $GITHUB_ENV - name: Install dependencies run: | uv pip install -r backend/requirements.txt - name: Test backend with SQLite id: sqlite run: | cd backend WEBUI_SECRET_KEY=secret-key GLOBAL_LOG_LEVEL=debug uvicorn main:app --port "8080" --forwarded-allow-ips '*' & UVICORN_PID=$! # Wait up to 20 seconds for the server to start for i in {1..20}; do curl -s http://localhost:8080/api/config > /dev/null && break sleep 1 if [ $i -eq 20 ]; then echo "Server failed to start" kill -9 $UVICORN_PID exit 1 fi done # Check that the server is still running after 5 seconds sleep 5 if ! kill -0 $UVICORN_PID; then echo "Server has stopped" exit 1 fi - name: Test backend with Postgres if: success() || steps.sqlite.conclusion == 'failure' run: | cd backend export DATABASE_URL=postgresql://postgres:postgres@localhost:5432/postgres WEBUI_SECRET_KEY=secret-key GLOBAL_LOG_LEVEL=debug uvicorn main:app --port "8081" --forwarded-allow-ips '*' & UVICORN_PID=$! # Wait up to 20 seconds for the server to start for i in {1..20}; do curl -s http://localhost:8081/api/config > /dev/null && break sleep 1 if [ $i -eq 20 ]; then echo "Server failed to start" kill -9 $UVICORN_PID exit 1 fi done # Check that the server is still running after 5 seconds sleep 5 if ! kill -0 $UVICORN_PID; then echo "Server has stopped" exit 1 fi - name: Test backend with MySQL if: success() || steps.sqlite.conclusion == 'failure' || steps.postgres.conclusion == 'failure' run: | cd backend export DATABASE_URL=mysql://root:mysql@localhost:3306/mysql WEBUI_SECRET_KEY=secret-key GLOBAL_LOG_LEVEL=debug uvicorn main:app --port "8083" --forwarded-allow-ips '*' & UVICORN_PID=$! # Wait up to 20 seconds for the server to start for i in {1..20}; do curl -s http://localhost:8083/api/config > /dev/null && break sleep 1 if [ $i -eq 20 ]; then echo "Server failed to start" kill -9 $UVICORN_PID exit 1 fi done # Check that the server is still running after 5 seconds sleep 5 if ! kill -0 $UVICORN_PID; then echo "Server has stopped" exit 1 fi