name: CI on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.11', '3.12'] services: postgres: image: postgres:14 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: peikarband_test ports: - 5432:5432 options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 redis: image: redis:7 ports: - 6379:6379 options: >- --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v3 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Cache pip packages uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements*.txt') }} restore-keys: | ${{ runner.os }}-pip- - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install -r requirements-dev.txt - name: Lint with flake8 run: | flake8 src/ --count --select=E9,F63,F7,F82 --show-source --statistics flake8 src/ --count --max-complexity=10 --max-line-length=120 --statistics - name: Type check with mypy run: | mypy src/ - name: Check formatting with black run: | black --check src/ - name: Check imports with isort run: | isort --check-only src/ - name: Run tests with pytest env: DATABASE_URL: postgresql://postgres:postgres@localhost:5432/peikarband_test REDIS_URL: redis://localhost:6379/0 SECRET_KEY: test-secret-key JWT_SECRET_KEY: test-jwt-secret CELERY_BROKER_URL: redis://localhost:6379/1 CELERY_RESULT_BACKEND: redis://localhost:6379/2 run: | pytest tests/ -v --cov=src --cov-report=xml --cov-report=term-missing - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: file: ./coverage.xml fail_ci_if_error: false security: 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: | python -m pip install --upgrade pip pip install bandit safety - name: Run Bandit security scan run: | bandit -r src/ -f json -o bandit-report.json || true - name: Run Safety check run: | safety check --json || true