fix: 更新自動修復服務以忽略刪除路徑請求的回應,確保使用正確的 API 端點 #35
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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!" |