Linters, static analysis, CI/CD integration, code quality gates
Автоматизируй всё, что можно автоматизировать. Люди должны проверять архитектуру, а линтеры — отступы.
# .pre-commit-config.yaml
repos:
# Форматирование
- repo: https://github.com/psf/black
rev: 24.0.0
hooks:
- id: black
args: [--line-length=100]
# Сортировка импортов
- repo: https://github.com/pycqa/isort
rev: 5.13.0
hooks:
- id: isort
args: [--profile=black]
# Линтинг
- repo: https://github.com/pycqa/flake8
rev: 7.0.0
hooks:
- id: flake8
args: [--max-line-length=100, --extend-ignore=E203]
# Типы
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0
hooks:
- id: mypy
args: [--strict, --ignore-missing-imports]| Инструмент | Проверяет | Не проверяет |
|---|---|---|
| Black | Форматирование, отступы, скобки | Логика, имена, типы |
| isort | Порядок импортов | Логика импортов |
| flake8 | Стиль (PEP 8), ошибки | Форматирование (Black) |
| mypy | Типы | Логика, стиль |
| pylint | Всё (очень строгий) | Много ложных срабатываний |
# Bandit: уязвимости в коде
bandit -r myapp/
# Вывод:
[main] INFO profile include tests: None
[main] INFO profile exclude tests: None
[main] INFO running on Python 3.11
>> Issue: [B324:hashlib] Use of weak SHA1 hash for security.
Severity: High Confidence: High
Location: myapp/auth.py:42# Safety: уязвимости в зависимостях
safety check
# Вывод:
+==============================================================================+
| REPORT |
+==============================================================================+
| requests < 2.20.0 │ CVE-2018-18074 │ HIGH |
+==============================================================================+
# pip-audit: альтернатива
pip-audit# .github/workflows/code_quality.yml
name: Code Quality
on: [pull_request]
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.11'
- name: Install dependencies
run: pip install black flake8 isort mypy
- name: Black (форматирование)
run: black --check myapp/
- name: isort (импорты)
run: isort --check myapp/
- name: flake8 (стиль)
run: flake8 myapp/
- name: mypy (типы)
run: mypy myapp/
- name: bandit (безопасность)
run: bandit -r myapp/
- name: safety (зависимости)
run: safety check
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Run tests
run: pytest --cov=myapp --cov-fail-under=80# .gitlab-ci.yml
stages:
- lint
- test
- security
lint:
stage: lint
script:
- black --check myapp/
- flake8 myapp/
- mypy myapp/
test:
stage: test
script:
- pytest --cov=myapp --cov-fail-under=80
security:
stage: security
script:
- bandit -r myapp/
- safety check# pytest.ini
[pytest]
addopts = --cov=myapp --cov-fail-under=80
# setup.cfg для flake8
[flake8]
max-line-length = 100
max-complexity = 10
exclude = .git,__pycache__,migrations# GitHub branch protection
# Требуется для мержа:
# ✅ Status checks passed (CI)
# ✅ Minimum 1 approval
# ✅ No requested changes
# ✅ Branch up to date| Инструмент | Что делает |
|---|---|
| CodeClimate | Метрики, дублирование, сложность |
| SonarQube | Полный анализ: баги, уязвимости, запах кода |
| Codacy | Автоматический review, метрики |
| Reviewdog | Интеграция линтеров с PR комментариями |
# .github/workflows/reviewdog.yml
name: Reviewdog
on: [pull_request]
jobs:
review:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: flake8 с reviewdog
uses: reviewdog/action-flake8@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
reporter: github-pr-reviewКлючевая мысль: Автоматизируйте стиль, типы, безопасность. Люди должны фокусироваться на архитектуре и логике, а не на отступах.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.