Skip to content

ci(deps): bump actions/upload-artifact from 5 to 6 #43

ci(deps): bump actions/upload-artifact from 5 to 6

ci(deps): bump actions/upload-artifact from 5 to 6 #43

Workflow file for this run

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