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: Maximize build space uses: AdityaGarg8/remove-unwanted-software@v4.1 with: remove-android: 'true' remove-haskell: 'true' remove-codeql: 'true' - name: Checkout Repository uses: actions/checkout@v4 - name: Build and run Compose Stack run: | docker compose \ --file docker-compose.yaml \ --file docker-compose.api.yaml \ --file docker-compose.a1111-test.yaml \ up --detach --build - name: Delete Docker build cache run: | docker builder prune --all --force - name: Wait for Ollama to be up timeout-minutes: 5 run: | until curl --output /dev/null --silent --fail http://localhost:11434; do printf '.' sleep 1 done echo "Service is up!" - 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 # pytest: # name: Run Backend Tests # runs-on: ubuntu-latest # steps: # - uses: actions/checkout@v4 # - name: Set up Python # uses: actions/setup-python@v5 # with: # python-version: ${{ matrix.python-version }} # - name: Install dependencies # run: | # python -m pip install --upgrade pip # pip install -r backend/requirements.txt # - name: pytest run # run: | # ls -al # cd backend # PYTHONPATH=. pytest . -o log_cli=true -o log_cli_level=INFO 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@v5 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 env: WEBUI_SECRET_KEY: secret-key GLOBAL_LOG_LEVEL: debug run: | cd backend uvicorn open_webui.main:app --port "8080" --forwarded-allow-ips '*' & UVICORN_PID=$! # Wait up to 40 seconds for the server to start for i in {1..40}; do curl -s http://localhost:8080/api/config > /dev/null && break sleep 1 if [ $i -eq 40 ]; 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' env: WEBUI_SECRET_KEY: secret-key GLOBAL_LOG_LEVEL: debug DATABASE_URL: postgresql://postgres:postgres@localhost:5432/postgres DATABASE_POOL_SIZE: 10 DATABASE_POOL_MAX_OVERFLOW: 10 DATABASE_POOL_TIMEOUT: 30 run: | cd backend uvicorn open_webui.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 # Check that service will reconnect to postgres when connection will be closed status_code=$(curl --write-out %{http_code} -s --output /dev/null http://localhost:8081/health/db) if [[ "$status_code" -ne 200 ]] ; then echo "Server has failed before postgres reconnect check" exit 1 fi echo "Terminating all connections to postgres..." python -c "import os, psycopg2 as pg2; \ conn = pg2.connect(dsn=os.environ['DATABASE_URL'].replace('+pool', '')); \ cur = conn.cursor(); \ cur.execute('SELECT pg_terminate_backend(psa.pid) FROM pg_stat_activity psa WHERE datname = current_database() AND pid <> pg_backend_pid();')" status_code=$(curl --write-out %{http_code} -s --output /dev/null http://localhost:8081/health/db) if [[ "$status_code" -ne 200 ]] ; then echo "Server has not reconnected to postgres after connection was closed: returned status $status_code" exit 1 fi # - name: Test backend with MySQL # if: success() || steps.sqlite.conclusion == 'failure' || steps.postgres.conclusion == 'failure' # env: # WEBUI_SECRET_KEY: secret-key # GLOBAL_LOG_LEVEL: debug # DATABASE_URL: mysql://root:mysql@localhost:3306/mysql # run: | # cd backend # uvicorn open_webui.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