Bringing in first version of CI
This commit is contained in:
parent
bb64af9e7a
commit
e020e3353c
392
.github/workflows/ci.yml
vendored
Normal file
392
.github/workflows/ci.yml
vendored
Normal file
@ -0,0 +1,392 @@
|
||||
name: Continuous Integration
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, unit-testing-ci ]
|
||||
pull_request:
|
||||
branches: [ main ]
|
||||
workflow_dispatch: # Allow manual triggering
|
||||
|
||||
env:
|
||||
# Test database credentials (using properly formatted fake values for CI)
|
||||
# These are fake but properly formatted values that will pass validation
|
||||
SUPABASE_URL: ${{ secrets.SUPABASE_URL || 'https://xyzcompanytest.supabase.co' }}
|
||||
SUPABASE_SERVICE_KEY: ${{ secrets.SUPABASE_SERVICE_KEY || 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZS1kZW1vIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImV4cCI6MTk4MzgxMjk5Nn0.EGIM96RAZx35lJzdJsyH-qQwv8Hdp7fsn3W0YpN81IU' }}
|
||||
NODE_VERSION: '18'
|
||||
PYTHON_VERSION: '3.12'
|
||||
|
||||
jobs:
|
||||
# Job 1: Frontend Testing (React/TypeScript/Vitest)
|
||||
# Will enable this after overhaul of frontend for linting
|
||||
frontend-tests:
|
||||
name: Frontend Tests (React + Vitest)
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./archon-ui-main
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ env.NODE_VERSION }}
|
||||
cache: 'npm'
|
||||
cache-dependency-path: archon-ui-main/package-lock.json
|
||||
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
# - name: Run ESLint
|
||||
# run: npm run lint
|
||||
#
|
||||
# - name: Run TypeScript type check
|
||||
# run: npx tsc --noEmit
|
||||
#
|
||||
# - name: Run Vitest tests with coverage
|
||||
# run: npm run test:coverage:run
|
||||
#
|
||||
# - name: Generate test summary
|
||||
# if: always()
|
||||
# run: npm run test:coverage:summary
|
||||
#
|
||||
# - name: Upload frontend test results
|
||||
# if: always()
|
||||
# uses: actions/upload-artifact@v4
|
||||
# with:
|
||||
# name: frontend-test-results
|
||||
# path: |
|
||||
# archon-ui-main/coverage/test-results.json
|
||||
# archon-ui-main/public/test-results/
|
||||
# retention-days: 30
|
||||
#
|
||||
# - name: Upload frontend coverage to Codecov
|
||||
# if: always()
|
||||
# uses: codecov/codecov-action@v4
|
||||
# with:
|
||||
# files: ./archon-ui-main/public/test-results/coverage/lcov.info
|
||||
# flags: frontend
|
||||
# name: frontend-coverage
|
||||
# token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
# Job 2: Backend Testing (Python/pytest)
|
||||
backend-tests:
|
||||
name: Backend Tests (Python + pytest)
|
||||
runs-on: ubuntu-latest
|
||||
defaults:
|
||||
run:
|
||||
working-directory: ./python
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install uv
|
||||
uses: astral-sh/setup-uv@v4
|
||||
with:
|
||||
version: "latest"
|
||||
|
||||
- name: Set up Python
|
||||
run: uv python install ${{ env.PYTHON_VERSION }}
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
uv sync --dev
|
||||
uv add pytest-cov
|
||||
|
||||
- name: Run linting with ruff (if available)
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if uv run which ruff > /dev/null 2>&1; then
|
||||
echo "Running ruff linting..."
|
||||
uv run ruff check src/ tests/ || true
|
||||
else
|
||||
echo "Ruff not found, skipping linting"
|
||||
fi
|
||||
|
||||
- name: Run type checking with mypy (if available)
|
||||
continue-on-error: true
|
||||
run: |
|
||||
if uv run which mypy > /dev/null 2>&1; then
|
||||
echo "Running mypy type checking..."
|
||||
uv run mypy src/ || true
|
||||
else
|
||||
echo "MyPy not found, skipping type checking"
|
||||
fi
|
||||
|
||||
- name: Run all tests
|
||||
run: |
|
||||
echo "Running all unit tests..."
|
||||
uv run pytest tests/ --verbose --tb=short \
|
||||
--cov=src --cov-report=xml --cov-report=html \
|
||||
--cov-report=term-missing \
|
||||
--junitxml=test-results.xml || true
|
||||
|
||||
- name: Upload backend test results
|
||||
if: always()
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: backend-test-results
|
||||
path: |
|
||||
python/test-results.xml
|
||||
python/htmlcov/
|
||||
python/coverage.xml
|
||||
retention-days: 30
|
||||
|
||||
- name: Upload backend coverage to Codecov
|
||||
if: always()
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./python/coverage.xml
|
||||
flags: backend
|
||||
name: backend-coverage
|
||||
token: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
# Job 3: Docker Build Test
|
||||
docker-build-test:
|
||||
name: Docker Build Tests
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
service: [server, mcp, agents, frontend]
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build server service
|
||||
if: matrix.service == 'server'
|
||||
run: |
|
||||
docker build \
|
||||
--file python/Dockerfile.server \
|
||||
--tag archon-server:test \
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||
--build-arg ARCHON_SERVER_PORT=8181 \
|
||||
python/
|
||||
|
||||
- name: Build MCP service
|
||||
if: matrix.service == 'mcp'
|
||||
run: |
|
||||
docker build \
|
||||
--file python/Dockerfile.mcp \
|
||||
--tag archon-mcp:test \
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||
--build-arg ARCHON_MCP_PORT=8051 \
|
||||
python/
|
||||
|
||||
- name: Build agents service
|
||||
if: matrix.service == 'agents'
|
||||
run: |
|
||||
docker build \
|
||||
--file python/Dockerfile.agents \
|
||||
--tag archon-agents:test \
|
||||
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||
--build-arg ARCHON_AGENTS_PORT=8052 \
|
||||
python/
|
||||
|
||||
- name: Build frontend service
|
||||
if: matrix.service == 'frontend'
|
||||
run: |
|
||||
docker build \
|
||||
--tag archon-frontend:test \
|
||||
archon-ui-main/
|
||||
|
||||
- name: Test container health check (for the containers that can run without proper env vars)
|
||||
if: matrix.service != 'frontend' && matrix.service != 'server'
|
||||
run: |
|
||||
# Only test MCP and agents services (they don't require real Supabase connection)
|
||||
# Skip server and frontend as they need real database
|
||||
case "${{ matrix.service }}" in
|
||||
"mcp")
|
||||
docker run -d --name test-${{ matrix.service }} \
|
||||
-e SUPABASE_URL=${{ env.SUPABASE_URL }} \
|
||||
-e SUPABASE_SERVICE_KEY=${{ env.SUPABASE_SERVICE_KEY }} \
|
||||
-e ARCHON_MCP_PORT=8051 \
|
||||
-e API_SERVICE_URL=http://localhost:8181 \
|
||||
-e AGENTS_SERVICE_URL=http://localhost:8052 \
|
||||
-p 8051:8051 \
|
||||
archon-${{ matrix.service }}:test
|
||||
;;
|
||||
"agents")
|
||||
docker run -d --name test-${{ matrix.service }} \
|
||||
-e SUPABASE_URL=${{ env.SUPABASE_URL }} \
|
||||
-e SUPABASE_SERVICE_KEY=${{ env.SUPABASE_SERVICE_KEY }} \
|
||||
-e ARCHON_AGENTS_PORT=8052 \
|
||||
-p 8052:8052 \
|
||||
archon-${{ matrix.service }}:test
|
||||
;;
|
||||
esac
|
||||
|
||||
# Wait for container to start
|
||||
sleep 30
|
||||
|
||||
# Check if container is still running
|
||||
if docker ps | grep -q test-${{ matrix.service }}; then
|
||||
echo "✅ Container test-${{ matrix.service }} is running"
|
||||
else
|
||||
echo "❌ Container test-${{ matrix.service }} failed to start"
|
||||
docker logs test-${{ matrix.service }}
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Cleanup test containers
|
||||
if: always()
|
||||
run: |
|
||||
docker stop test-${{ matrix.service }} || true
|
||||
docker rm test-${{ matrix.service }} || true
|
||||
|
||||
# Job 4: Integration Test (Docker Compose)
|
||||
integration-test:
|
||||
name: Full Integration Test
|
||||
runs-on: ubuntu-latest
|
||||
needs: [frontend-tests, backend-tests, docker-build-test]
|
||||
if: github.event_name == 'pull_request' || github.ref == 'refs/heads/main'
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Create test environment file
|
||||
run: |
|
||||
cat > .env << EOF
|
||||
SUPABASE_URL=${{ env.SUPABASE_URL }}
|
||||
SUPABASE_SERVICE_KEY=${{ env.SUPABASE_SERVICE_KEY }}
|
||||
OPENAI_API_KEY=sk-test-1234567890abcdef
|
||||
LOG_LEVEL=INFO
|
||||
HOST=localhost
|
||||
ARCHON_UI_PORT=3737
|
||||
ARCHON_SERVER_PORT=8181
|
||||
ARCHON_MCP_PORT=8051
|
||||
ARCHON_AGENTS_PORT=8052
|
||||
EOF
|
||||
|
||||
- name: Start services with Docker Compose
|
||||
run: |
|
||||
docker-compose up -d --build
|
||||
|
||||
- name: Wait for services to be ready
|
||||
run: |
|
||||
echo "Waiting for services to start..."
|
||||
sleep 60
|
||||
|
||||
# Check service health
|
||||
for i in {1..10}; do
|
||||
if curl -f http://localhost:3737 > /dev/null 2>&1; then
|
||||
echo "✅ Frontend is responding"
|
||||
break
|
||||
fi
|
||||
echo "⏳ Waiting for frontend... attempt $i/10"
|
||||
sleep 10
|
||||
done
|
||||
|
||||
for i in {1..10}; do
|
||||
if curl -f http://localhost:8181/health > /dev/null 2>&1; then
|
||||
echo "✅ Server health check passed"
|
||||
break
|
||||
fi
|
||||
echo "⏳ Waiting for server health... attempt $i/10"
|
||||
sleep 10
|
||||
done
|
||||
|
||||
- name: Run basic API health checks
|
||||
run: |
|
||||
echo "Testing API endpoints..."
|
||||
|
||||
# Health endpoint
|
||||
if curl -f http://localhost:8181/health; then
|
||||
echo "✅ Server health endpoint works"
|
||||
else
|
||||
echo "❌ Server health endpoint failed"
|
||||
fi
|
||||
|
||||
# MCP health endpoint
|
||||
if curl -f http://localhost:8051/health; then
|
||||
echo "✅ MCP health endpoint works"
|
||||
else
|
||||
echo "❌ MCP health endpoint failed"
|
||||
fi
|
||||
|
||||
# Agents health endpoint
|
||||
if curl -f http://localhost:8052/health; then
|
||||
echo "✅ Agents health endpoint works"
|
||||
else
|
||||
echo "❌ Agents health endpoint failed"
|
||||
fi
|
||||
|
||||
- name: Show service logs on failure
|
||||
if: failure()
|
||||
run: |
|
||||
echo "=== Docker Compose Logs ==="
|
||||
docker-compose logs --tail=50
|
||||
|
||||
echo "=== Container Status ==="
|
||||
docker-compose ps
|
||||
|
||||
- name: Cleanup
|
||||
if: always()
|
||||
run: |
|
||||
docker-compose down --volumes --remove-orphans
|
||||
|
||||
# Job 5: Test Results Summary
|
||||
test-summary:
|
||||
name: Test Results Summary
|
||||
runs-on: ubuntu-latest
|
||||
needs: [frontend-tests, backend-tests, docker-build-test]
|
||||
if: always()
|
||||
|
||||
steps:
|
||||
- name: Download all artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
|
||||
- name: Create test summary
|
||||
run: |
|
||||
echo "# 🧪 Archon V2 Alpha - CI Test Results" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Frontend Results
|
||||
echo "## 🎨 Frontend Tests (React + Vitest)" >> $GITHUB_STEP_SUMMARY
|
||||
if [ -f "frontend-test-results/coverage/test-results.json" ]; then
|
||||
echo "✅ Frontend tests completed" >> $GITHUB_STEP_SUMMARY
|
||||
else
|
||||
echo "❌ Frontend tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Backend Results
|
||||
echo "## 🐍 Backend Tests (Python + pytest)" >> $GITHUB_STEP_SUMMARY
|
||||
if [ -d "backend-test-results-unit" ]; then
|
||||
echo "✅ Unit tests completed" >> $GITHUB_STEP_SUMMARY
|
||||
else
|
||||
echo "❌ Unit tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
|
||||
if [ -d "backend-test-results-integration" ]; then
|
||||
echo "✅ Integration tests completed" >> $GITHUB_STEP_SUMMARY
|
||||
else
|
||||
echo "❌ Integration tests failed or incomplete" >> $GITHUB_STEP_SUMMARY
|
||||
fi
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Docker Build Results
|
||||
echo "## 🐳 Docker Build Tests" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Docker build tests completed - check individual job results" >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Coverage Information
|
||||
echo "## 📊 Coverage Reports" >> $GITHUB_STEP_SUMMARY
|
||||
echo "Coverage reports have been uploaded to Codecov and are available as artifacts." >> $GITHUB_STEP_SUMMARY
|
||||
echo "" >> $GITHUB_STEP_SUMMARY
|
||||
|
||||
# Architecture Context
|
||||
echo "## 🏗️ Architecture Tested" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Frontend**: React + TypeScript + Vite (Port 3737)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Server**: FastAPI + Socket.IO + Python (Port 8181)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **MCP Service**: MCP protocol server (Port 8051)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Agents Service**: PydanticAI agents (Port 8052)" >> $GITHUB_STEP_SUMMARY
|
||||
echo "- **Database**: Supabase (PostgreSQL + pgvector)" >> $GITHUB_STEP_SUMMARY
|
||||
Loading…
Reference in New Issue
Block a user