ci(deps): bump actions/upload-artifact from 5 to 6 #43
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 | |
| on: | |
| push: | |
| branches: ["**"] | |
| pull_request: | |
| branches: [main] | |
| env: | |
| PRIMARY_PYTHON_VERSION: '3.13' | |
| UV_CACHE_DIR: ~/.cache/uv | |
| PYTHONUNBUFFERED: "1" | |
| FORCE_COLOR: "1" | |
| jobs: | |
| lint: | |
| runs-on: ubuntu-latest | |
| name: Lint & Format check | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| # Cache pre-commit hooks (only needed for lint job) | |
| - name: Cache pre-commit | |
| uses: actions/cache@v4 | |
| with: | |
| path: ~/.cache/pre-commit | |
| key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }} | |
| - name: Set up Python ${{ env.PRIMARY_PYTHON_VERSION }} | |
| run: uv python install ${{ env.PRIMARY_PYTHON_VERSION }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| - name: Run ruff check | |
| run: uv run ruff check src tests | |
| - name: Run ruff format check | |
| run: uv run ruff format --check src tests | |
| type-check: | |
| runs-on: ubuntu-latest | |
| name: Type check | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| - name: Set up Python ${{ env.PRIMARY_PYTHON_VERSION }} | |
| run: uv python install ${{ env.PRIMARY_PYTHON_VERSION }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| - name: Run mypy | |
| env: | |
| PYTHONPATH: ${{ github.workspace }}/src | |
| run: uv run python -m mypy src | |
| security: | |
| runs-on: ubuntu-latest | |
| name: Security Check | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| - name: Set up Python ${{ env.PRIMARY_PYTHON_VERSION }} | |
| run: uv python install ${{ env.PRIMARY_PYTHON_VERSION }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| - name: Run bandit security check | |
| run: uv run bandit -r src/ -f json -o bandit-report.json || true | |
| - name: Upload bandit report | |
| uses: actions/upload-artifact@v6 | |
| if: always() | |
| with: | |
| name: bandit-report-${{ env.PRIMARY_PYTHON_VERSION }} | |
| path: bandit-report.json | |
| unit-tests: | |
| runs-on: ${{ matrix.os }} | |
| needs: [lint, type-check] | |
| timeout-minutes: 30 # Prevent hanging jobs | |
| strategy: | |
| fail-fast: false # Don't cancel other jobs on failure | |
| # matrix: | |
| # python-version: ["3.12", "3.13"] | |
| # os: ["ubuntu-latest"] | |
| matrix: | |
| include: | |
| # --- Lightweight combinations | |
| - python-version: "3.10" | |
| os: "ubuntu-latest" | |
| # test-type: "minimal" | |
| coverage: false | |
| - python-version: "3.11" | |
| os: "ubuntu-latest" | |
| # test-type: "minimal" | |
| coverage: false | |
| - python-version: "3.12" | |
| os: "ubuntu-latest" | |
| # test-type: "standard" | |
| coverage: false | |
| # --- Full test on latest | |
| - python-version: "3.13" | |
| os: "ubuntu-latest" | |
| # test-type: "full" | |
| coverage: true | |
| # --- Cross-platform on latest Python only | |
| - python-version: "3.13" | |
| os: "windows-latest" | |
| # test-type: "standard" | |
| coverage: false | |
| - python-version: "3.13" | |
| os: "macos-latest" | |
| # test-type: "standard" | |
| coverage: false | |
| name: Unit tests Python ${{ matrix.python-version }} on ${{ matrix.os }} | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| - name: Set up Python ${{ matrix.python-version }} on ${{ matrix.os }} | |
| run: uv python install ${{ matrix.python-version }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| # - name: Run tests with coverage | |
| # env: | |
| # PYTHONPATH: ${{ github.workspace }}/src | |
| # run: | | |
| # uv run python -m pytest tests/ \ | |
| # --cov=src/smpp \ | |
| # --cov-report=html \ | |
| # --cov-report=xml \ | |
| # --cov-report=term-missing \ | |
| # --junitxml=pytest-report.xml | |
| # - name: Upload coverage | |
| # uses: actions/upload-artifact@v6 | |
| # with: | |
| # name: coverage-${{ matrix.python-version }}-${{ matrix.os }} | |
| # path: | | |
| # coverage.xml | |
| # htmlcov/ | |
| - name: Run tests with coverage | |
| env: | |
| PYTHONPATH: ${{ github.workspace }}/src | |
| shell: bash | |
| run: | | |
| if [[ "${{ matrix.coverage }}" == "true" ]]; then | |
| uv run python -m pytest tests/ \ | |
| --cov=src/smpp \ | |
| --cov-report=xml \ | |
| --cov-report=html \ | |
| --junitxml=pytest-report.xml | |
| else | |
| uv run python -m pytest tests/ \ | |
| --junitxml=pytest-report.xml | |
| fi | |
| - name: Upload coverage | |
| if: matrix.coverage == true | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: coverage-${{ matrix.python-version }}-${{ matrix.os }} | |
| path: | | |
| coverage.xml | |
| htmlcov/ | |
| integration-test: | |
| runs-on: ubuntu-latest | |
| needs: [lint, type-check] | |
| name: Integration Tests on Python 3.13 and ubuntu-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| - name: Set up Python ${{ env.PRIMARY_PYTHON_VERSION }} | |
| run: uv python install ${{ env.PRIMARY_PYTHON_VERSION }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| - name: Run integration tests | |
| env: | |
| PYTHONPATH: ${{ github.workspace }}/src | |
| run: | | |
| # Run examples to ensure they work | |
| cd examples | |
| uv run python --version | |
| echo "Testing client example..." | |
| timeout 10s uv run python client.py || true | |
| echo "Testing server example..." | |
| timeout 10s uv run python server.py || true | |
| - name: Test import | |
| env: | |
| PYTHONPATH: ${{ github.workspace }}/src | |
| run: | | |
| uv run python -c "$(cat << 'EOF' | |
| import smpp | |
| from smpp.client import SMPPClient | |
| from smpp.server import SMPPServer | |
| from smpp.protocol import BindTransmitter, SubmitSm | |
| print('All imports successful') | |
| EOF | |
| )" | |
| coverage-report: | |
| runs-on: ubuntu-latest | |
| needs: [unit-tests] | |
| if: always() && needs.unit-tests.result == 'success' | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Download coverage from Python 3.13 | |
| uses: actions/download-artifact@v6 | |
| with: | |
| name: coverage-3.13-ubuntu-latest | |
| - name: Upload to Codecov | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| slug: codcod/smppai | |
| file: ./coverage.xml | |
| fail_ci_if_error: false | |
| - name: Upload coverage reports | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: final-coverage-report | |
| path: | | |
| coverage.xml | |
| htmlcov/ | |
| build: | |
| runs-on: ubuntu-latest | |
| name: Build package | |
| needs: [lint, type-check] | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v5 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| with: | |
| enable-cache: true | |
| cache-dependency-glob: "uv.lock" | |
| - name: Set up Python ${{ env.PRIMARY_PYTHON_VERSION }} | |
| run: uv python install ${{ env.PRIMARY_PYTHON_VERSION }} | |
| - name: Install dependencies | |
| run: | | |
| uv sync --all-extras --dev | |
| uv pip install -e . | |
| - name: Build package | |
| run: uv build | |
| - name: Check package | |
| run: uv run twine check dist/* | |
| - name: Test installation | |
| run: | | |
| pip install dist/*.whl | |
| python -c "import smpp; print('Package installs correctly')" | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v6 | |
| with: | |
| name: dist-${{ env.PRIMARY_PYTHON_VERSION }} | |
| path: dist/ | |
| all-checks: | |
| if: always() | |
| runs-on: ubuntu-latest | |
| name: All checks status | |
| needs: [lint, type-check, security, unit-tests, integration-test, build] | |
| # steps: | |
| # - name: Check all jobs status | |
| # run: | | |
| # if [[ "${{ needs.lint.result }}" != "success" || \ | |
| # "${{ needs.type-check.result }}" != "success" || \ | |
| # "${{ needs.test.result }}" != "success" || \ | |
| # "${{ needs.build.result }}" != "success" || \ | |
| # "${{ needs.integration-test.result }}" != "success" ]]; then | |
| # echo "One or more checks failed" | |
| # exit 1 | |
| # else | |
| # echo "All checks passed successfully" | |
| # fi | |
| steps: | |
| - name: Summarize results | |
| run: | | |
| echo "## CI Results" >> $GITHUB_STEP_SUMMARY | |
| echo "| Job | Status |" >> $GITHUB_STEP_SUMMARY | |
| echo "|-----|--------|" >> $GITHUB_STEP_SUMMARY | |
| echo "| Lint | ${{ needs.lint.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| Type Check | ${{ needs.type-check.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| Security | ${{ needs.security.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| Tests | ${{ needs.unit-tests.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| Integration | ${{ needs.integration-test.result }} |" >> $GITHUB_STEP_SUMMARY | |
| echo "| Build | ${{ needs.build.result }} |" >> $GITHUB_STEP_SUMMARY | |
| - name: Check required jobs | |
| run: | | |
| # Fix: Use proper bash syntax for needs reference | |
| if [[ "${{ needs.lint.result }}" != "success" || \ | |
| "${{ needs.type-check.result }}" != "success" || \ | |
| "${{ needs.unit-tests.result }}" != "success" ]]; then | |
| echo "Required job failed" | |
| exit 1 | |
| fi |