Skip to content

fix: 更新自動修復服務以忽略刪除路徑請求的回應,確保使用正確的 API 端點 #35

fix: 更新自動修復服務以忽略刪除路徑請求的回應,確保使用正確的 API 端點

fix: 更新自動修復服務以忽略刪除路徑請求的回應,確保使用正確的 API 端點 #35

Workflow file for this run

name: CI/CD Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main, develop]
env:
PYTHON_VERSION: '3.12'
NODE_VERSION: '20'
jobs:
# Backend Tests
test-backend:
name: Backend Tests
runs-on: ubuntu-latest
services:
redis:
image: redis:7-alpine
ports:
- 6379:6379
options: >-
--health-cmd "redis-cli ping"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: backend/requirements.txt
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y ffmpeg
- name: Install Python dependencies
working-directory: backend
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-cov pytest-asyncio pytest-mock coverage
- name: Run tests with coverage
working-directory: backend
env:
FLASK_ENV: testing
TESTING: "true"
DATABASE_URL: "sqlite:///:memory:"
REDIS_URL: "redis://localhost:6379/0"
MEDIAMTX_API_URL: "http://localhost:9998"
MEDIAMTX_RTSP_URL: "rtsp://localhost:8555"
run: |
pytest \
--cov=app \
--cov-report=term-missing \
--cov-report=xml:coverage.xml \
--cov-fail-under=80 \
-v \
--tb=short
- name: Upload coverage reports
uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: backend/coverage.xml
flags: backend
name: backend-coverage
fail_ci_if_error: false
- name: Upload coverage artifact
uses: actions/upload-artifact@v4
with:
name: backend-coverage-report
path: backend/coverage.xml
# Backend Lint
lint-backend:
name: Backend Lint
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
cache: 'pip'
cache-dependency-path: backend/requirements.txt
- name: Install dependencies
working-directory: backend
run: |
python -m pip install --upgrade pip
pip install black isort flake8
- name: Run Black
working-directory: backend
run: black --check --diff app tests
- name: Run isort
working-directory: backend
run: isort --check-only --diff app tests
- name: Run Flake8
working-directory: backend
run: flake8 app tests
# Frontend Tests
test-frontend:
name: Frontend Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
cache-dependency-path: frontend/package-lock.json
- name: Install dependencies
working-directory: frontend
run: npm ci
- name: Run lint
working-directory: frontend
run: npm run lint || true # Don't fail on lint warnings
- name: Run type check
working-directory: frontend
run: npm run build
# Build Docker Images
build-images:
name: Build Docker Images
runs-on: ubuntu-latest
needs: [test-backend, test-frontend]
if: github.event_name == 'push' && github.ref == 'refs/heads/main'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build backend image
uses: docker/build-push-action@v5
with:
context: ./backend
file: ./backend/Dockerfile
push: false
tags: mtx-toolkit-backend:latest
cache-from: type=gha
cache-to: type=gha,mode=max
- name: Build frontend image
uses: docker/build-push-action@v5
with:
context: ./frontend
file: ./frontend/Dockerfile
push: false
tags: mtx-toolkit-frontend:latest
cache-from: type=gha
cache-to: type=gha,mode=max
# Docker Test Environment
test-docker:
name: Docker Integration Tests
runs-on: ubuntu-latest
needs: [test-backend]
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Run tests in Docker
run: |
docker compose -f docker-compose.test.yml up \
--build \
--abort-on-container-exit \
--exit-code-from test-backend
- name: Extract coverage report
if: always()
run: |
docker compose -f docker-compose.test.yml cp \
test-backend:/app/coverage.xml ./coverage-docker.xml || true
- name: Upload Docker test coverage
uses: actions/upload-artifact@v4
if: always()
with:
name: docker-coverage-report
path: coverage-docker.xml
- name: Cleanup
if: always()
run: docker compose -f docker-compose.test.yml down -v
# Security Scan
security-scan:
name: Security Scan
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}
- name: Install safety
run: pip install safety
- name: Run safety check
working-directory: backend
run: safety check -r requirements.txt --full-report || true
# Summary
ci-summary:
name: CI Summary
runs-on: ubuntu-latest
needs: [test-backend, lint-backend, test-frontend, test-docker]
if: always()
steps:
- name: Check results
run: |
echo "Backend Tests: ${{ needs.test-backend.result }}"
echo "Backend Lint: ${{ needs.lint-backend.result }}"
echo "Frontend Tests: ${{ needs.test-frontend.result }}"
echo "Docker Tests: ${{ needs.test-docker.result }}"
if [ "${{ needs.test-backend.result }}" != "success" ] || \
[ "${{ needs.lint-backend.result }}" != "success" ] || \
[ "${{ needs.test-frontend.result }}" != "success" ]; then
echo "Some jobs failed!"
exit 1
fi
echo "All required jobs passed!"