name: CI Pipeline
on:
push:
branches: [ main, develop ]
paths-ignore:
- '**.md'
- 'docs/**'
- '.gitignore'
- 'LICENSE'
pull_request:
branches: [ main ]
paths-ignore:
- '**.md'
- 'docs/**'
- '.gitignore'
- 'LICENSE'
workflow_call: # Allow other workflows to call this one
workflow_dispatch:
inputs:
python-version:
description: 'Python version to test'
required: false
default: '3.12'
type: choice
options:
- '3.11'
- '3.12'
- 'all'
env:
UV_CACHE_DIR: /tmp/.uv-cache
jobs:
ci-quality:
name: Code Quality Check
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
enable-cache: true
cache-dependency-glob: "pyproject.toml"
- name: Set up Python
run: uv python install 3.12
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Check code formatting
id: format
run: |
echo "### π¨ Code Formatting" >> $GITHUB_STEP_SUMMARY
if uv run ruff format --check .; then
echo "β
Code formatting is correct" >> $GITHUB_STEP_SUMMARY
else
echo "β Code formatting issues found" >> $GITHUB_STEP_SUMMARY
echo "Run \`uv run ruff format .\` to fix" >> $GITHUB_STEP_SUMMARY
exit 1
fi
- name: Run linting
id: lint
run: |
echo "### π§Ή Linting" >> $GITHUB_STEP_SUMMARY
if uv run ruff check .; then
echo "β
No linting issues" >> $GITHUB_STEP_SUMMARY
else
echo "β Linting issues found" >> $GITHUB_STEP_SUMMARY
echo "Run \`uv run ruff check --fix .\` to fix" >> $GITHUB_STEP_SUMMARY
exit 1
fi
- name: Type checking
id: typecheck
continue-on-error: true
run: |
echo "### π Type Checking" >> $GITHUB_STEP_SUMMARY
if uv run mypy src/; then
echo "β
Type checking passed" >> $GITHUB_STEP_SUMMARY
else
echo "β οΈ Type checking issues (non-blocking)" >> $GITHUB_STEP_SUMMARY
fi
- name: Security scan
id: security
continue-on-error: true
run: |
echo "### π Security" >> $GITHUB_STEP_SUMMARY
if uv run bandit -r src/ -q; then
echo "β
No security issues" >> $GITHUB_STEP_SUMMARY
else
echo "β οΈ Security warnings found" >> $GITHUB_STEP_SUMMARY
fi
ci-tests:
name: Tests (Python ${{ matrix.python-version }})
runs-on: ubuntu-latest
needs: ci-quality
strategy:
matrix:
python-version: ${{ (github.event.inputs.python-version == 'all' && fromJSON('["3.11", "3.12"]')) || (github.event.inputs.python-version && fromJSON(format('["{0}"]', github.event.inputs.python-version))) || fromJSON('["3.12"]') }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v4
with:
version: "latest"
enable-cache: true
cache-dependency-glob: "pyproject.toml"
- name: Set up Python ${{ matrix.python-version }}
run: uv python install ${{ matrix.python-version }}
- name: Install dependencies
run: uv sync --all-extras --dev
- name: Run unit tests
run: |
echo "### π§ͺ Unit Tests (Python ${{ matrix.python-version }})" >> $GITHUB_STEP_SUMMARY
# Run CI-safe tests that don't need real Karma
if uv run pytest tests/unit/test_basic_functionality.py tests/unit/test_http_server.py -v --tb=short; then
echo "β
Tests passed" >> $GITHUB_STEP_SUMMARY
else
echo "β Tests failed" >> $GITHUB_STEP_SUMMARY
exit 1
fi
env:
KARMA_URL: http://localhost:8080
ci-docker-build:
name: Docker Build Test
runs-on: ubuntu-latest
needs: ci-quality
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ./docker/Dockerfile
push: false
tags: karma-mcp:ci-${{ github.sha }}
platforms: linux/amd64
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Test Docker image
run: |
echo "### π³ Docker Build" >> $GITHUB_STEP_SUMMARY
echo "β
Docker image built successfully" >> $GITHUB_STEP_SUMMARY
echo "Image: karma-mcp:ci-${{ github.sha }}" >> $GITHUB_STEP_SUMMARY
ci-final-status:
name: CI Pipeline Summary
runs-on: ubuntu-latest
needs: [ci-quality, ci-tests, ci-docker-build]
if: always()
steps:
- name: Check status
run: |
echo "## π CI Pipeline Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "${{ needs.ci-quality.result }}" == "success" ]]; then
echo "β
Code Quality: Passed" >> $GITHUB_STEP_SUMMARY
else
echo "β Code Quality: Failed" >> $GITHUB_STEP_SUMMARY
fi
if [[ "${{ needs.ci-tests.result }}" == "success" ]]; then
echo "β
Tests: Passed" >> $GITHUB_STEP_SUMMARY
else
echo "β Tests: Failed" >> $GITHUB_STEP_SUMMARY
fi
if [[ "${{ needs.ci-docker-build.result }}" == "success" ]]; then
echo "β
Docker Build: Passed" >> $GITHUB_STEP_SUMMARY
else
echo "β Docker Build: Failed" >> $GITHUB_STEP_SUMMARY
fi
# Fail if any required job failed
if [[ "${{ needs.ci-quality.result }}" != "success" ]] || \
[[ "${{ needs.ci-tests.result }}" != "success" ]] || \
[[ "${{ needs.ci-docker-build.result }}" != "success" ]]; then
exit 1
fi