ci: 全流程 CI/CD 自动化测试 Pipeline #34
Workflow file for this run
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: Backend CI | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| on: | |
| pull_request: | |
| paths: | |
| - "**.py" | |
| - "requirements*.txt" | |
| - "pyproject.toml" | |
| - "pytest.ini" | |
| - ".github/workflows/backend-ci.yml" | |
| push: | |
| branches: [master, develop] | |
| paths: | |
| - "**.py" | |
| - "requirements*.txt" | |
| - "pyproject.toml" | |
| - "pytest.ini" | |
| - ".github/workflows/backend-ci.yml" | |
| env: | |
| COVERAGE_PYTHON: "3.9" | |
| jobs: | |
| lint: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.9" | |
| cache: "pip" | |
| - name: Install dependencies | |
| run: pip install -r requirements-dev.txt | |
| - name: Ruff format check | |
| run: ruff format --check . | |
| - name: Ruff lint | |
| run: ruff check . | |
| - name: MyPy type check | |
| run: mypy domain/ application/ infrastructure/ interfaces/ | |
| continue-on-error: true | |
| unit-tests: | |
| runs-on: ubuntu-latest | |
| needs: lint | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.9"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| cache: "pip" | |
| - name: Install dependencies | |
| run: pip install -r requirements-dev.txt | |
| - name: Run unit tests with coverage | |
| run: | | |
| pytest tests/unit \ | |
| -v \ | |
| --tb=short \ | |
| --cov=domain \ | |
| --cov=application \ | |
| --cov=infrastructure \ | |
| --cov=interfaces \ | |
| --cov-report=term-missing \ | |
| --junitxml=test-results-unit.xml | |
| env: | |
| ANTHROPIC_API_KEY: "test-placeholder" | |
| ARK_API_KEY: "test-placeholder" | |
| - name: Rename coverage data | |
| if: matrix.python-version == env.COVERAGE_PYTHON | |
| run: mv .coverage .coverage.unit | |
| - name: Upload unit test results | |
| if: always() && matrix.python-version == env.COVERAGE_PYTHON | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: unit-test-results | |
| path: | | |
| test-results-unit.xml | |
| .coverage.unit | |
| integration-tests: | |
| runs-on: ubuntu-latest | |
| needs: lint | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| python-version: ["3.9"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| cache: "pip" | |
| - name: Install dependencies | |
| run: pip install -r requirements-dev.txt | |
| - name: Run integration tests with coverage | |
| run: | | |
| pytest tests/integration \ | |
| -v \ | |
| --tb=short \ | |
| --cov=domain \ | |
| --cov=application \ | |
| --cov=infrastructure \ | |
| --cov=interfaces \ | |
| --cov-report=term-missing \ | |
| --junitxml=test-results-integration.xml | |
| env: | |
| ANTHROPIC_API_KEY: "test-placeholder" | |
| ARK_API_KEY: "test-placeholder" | |
| - name: Rename coverage data | |
| if: matrix.python-version == env.COVERAGE_PYTHON | |
| run: mv .coverage .coverage.integration | |
| - name: Upload integration test results | |
| if: always() && matrix.python-version == env.COVERAGE_PYTHON | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: integration-test-results | |
| path: | | |
| test-results-integration.xml | |
| .coverage.integration | |
| coverage-report: | |
| runs-on: ubuntu-latest | |
| needs: [unit-tests, integration-tests] | |
| if: needs.unit-tests.result == 'success' && needs.integration-tests.result == 'success' | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ env.COVERAGE_PYTHON }} | |
| - name: Install coverage tools | |
| run: pip install coverage pytest-cov | |
| - name: Download unit artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: unit-test-results | |
| path: . | |
| - name: Download integration artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: integration-test-results | |
| path: . | |
| - name: Combine and report coverage | |
| run: | | |
| coverage combine .coverage.unit .coverage.integration | |
| coverage report --fail-under=60 | |
| coverage xml -o coverage-combined.xml | |
| - name: Coverage comment on PR | |
| if: github.event_name == 'pull_request' | |
| uses: py-cov-action/python-coverage-comment-action@v3 | |
| with: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| MINIMUM_GREEN: 80 | |
| MINIMUM_ORANGE: 60 |