stages: - lint - test - build - publish variables: PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" UV_CACHE_DIR: "$CI_PROJECT_DIR/.cache/uv" cache: paths: - .cache/pip - .cache/uv - .venv .python-base: image: python:3.12-slim before_script: - apt-get update && apt-get install -y --no-install-recommends libatomic1 && rm -rf /var/lib/apt/lists/* - pip install uv - uv sync --extra dev # Linting stage ruff-lint: extends: .python-base stage: lint script: - uv run ruff check . rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH ruff-format: extends: .python-base stage: lint script: - uv run ruff format --check . rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH pyright: extends: .python-base stage: lint script: - uv run pyright rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Test stage - run tests on multiple Python versions .test-base: stage: test before_script: - apt-get update && apt-get install -y --no-install-recommends libatomic1 && rm -rf /var/lib/apt/lists/* - pip install uv - uv sync --extra dev script: - uv run pytest --cov=fastapi_traffic --cov-report=xml --cov-report=term coverage: '/TOTAL.*\s+(\d+%)/' artifacts: reports: coverage_report: coverage_format: cobertura path: coverage.xml when: always rules: - if: $CI_PIPELINE_SOURCE == "merge_request_event" - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH test-py310: extends: .test-base image: python:3.10-slim test-py311: extends: .test-base image: python:3.11-slim test-py312: extends: .test-base image: python:3.12-slim # Build stage build-package: extends: .python-base stage: build script: - uv build artifacts: paths: - dist/ expire_in: 1 week rules: - if: $CI_COMMIT_TAG - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH # Publish to GitLab Package Registry publish-gitlab: extends: .python-base stage: publish script: - uv build - pip install twine - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/* rules: - if: $CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+$/ needs: - build-package