From 69a5d69f080da6b97cca435eb807c1b0bed4713c Mon Sep 17 00:00:00 2001 From: Ravi Prasad Date: Fri, 18 Sep 2026 00:07:24 -0500 Subject: [PATCH] ci: upgrade test workflow into automated health check & quality gate --- .gitea/workflows/test.yml | 77 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/.gitea/workflows/test.yml b/.gitea/workflows/test.yml index 7f5e316..97ece40 100644 --- a/.gitea/workflows/test.yml +++ b/.gitea/workflows/test.yml @@ -1,10 +1,75 @@ -# .gitea/workflows/test.yml -name: test -on: [push] +name: CI Health Check & Quality Gate + +on: + push: + branches: + - main + - dev + pull_request: + workflow_dispatch: jobs: - test: + healthcheck: runs-on: ubuntu-latest + name: Code, dbt & Live App Health Check steps: - - uses: actions/checkout@v4 - - run: node --version + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Install System Dependencies + run: | + apt-get update && apt-get install -y curl unzip git ca-certificates + + - name: Install uv + run: | + curl -LsSf https://astral.sh/uv/install.sh | sh + echo "$HOME/.local/bin" >> $GITHUB_PATH + echo "/root/.local/bin" >> $GITHUB_PATH + + - name: Install Project Dependencies + run: | + export PATH="$HOME/.local/bin:/root/.local/bin:$PATH" + uv sync + + - name: Python Syntax & Compilation Verification + run: | + export PATH="$HOME/.local/bin:/root/.local/bin:$PATH" + echo "==> Validating Python scripts compilation..." + uv run python -m py_compile streamlit_app/app.py scripts/db_storage.py + echo "✓ Python scripts compiled without errors" + + - name: dbt Manifest & Model Validation + run: | + export PATH="$HOME/.local/bin:/root/.local/bin:$PATH" + echo "==> Validating dbt package dependencies..." + uv run dbt deps --project-dir dbt_nba --profiles-dir dbt_nba + echo "==> Validating dbt models, seeds, and tests compilation..." + uv run dbt parse --project-dir dbt_nba --profiles-dir dbt_nba + echo "✓ All dbt models, seeds, and macros validated" + + - name: Cloudflare R2 Storage Probe (Optional if secrets present) + env: + S3_ENDPOINT_URL: ${{ secrets.S3_ENDPOINT_URL }} + S3_BUCKET_NAME: ${{ secrets.S3_BUCKET_NAME }} + S3_ACCESS_KEY_ID: ${{ secrets.S3_ACCESS_KEY_ID }} + S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY }} + S3_REGION: ${{ secrets.S3_REGION || 'auto' }} + S3_DB_KEY: ${{ secrets.S3_DB_KEY || 'dbt_nba.duckdb' }} + run: | + export PATH="$HOME/.local/bin:/root/.local/bin:$PATH" + if [ -n "${S3_ENDPOINT_URL:-}" ]; then + echo "==> Probing Cloudflare R2 storage status..." + uv run python scripts/db_storage.py status + else + echo "==> S3 secrets not configured for this step; skipping storage probe." + fi + + - name: Live Production App Health Probe + run: | + echo "==> Probing production endpoint https://streamlit.turbo-data.com/_stcore/health..." + HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" https://streamlit.turbo-data.com/_stcore/health || echo "000") + if [ "$HTTP_STATUS" = "200" ]; then + echo "✓ Production Streamlit dashboard is healthy (HTTP $HTTP_STATUS)" + else + echo "⚠️ Production health check returned HTTP $HTTP_STATUS (may still be starting or initializing)" + fi