name: Build on: push: branches: [main] tags: ['v*'] pull_request: branches: [main] workflow_dispatch: env: LATEST_PY_VERSION: '3.11' PYTEST_VERBOSE: 'true' jobs: # Run tests for each supported python version test: runs-on: ubuntu-latest strategy: matrix: python-version: ['3.7', '3.8', '3.9', '3.10', '3.11', 'pypy3.9'] fail-fast: false services: nginx: image: kennethreitz/httpbin ports: - 80:80 steps: # Set up python + poetry - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - uses: snok/install-poetry@v1.3 with: virtualenvs-in-project: true # Start integration test databases - uses: supercharge/mongodb-github-action@1.8.0 with: mongodb-version: 5.0 - uses: supercharge/redis-github-action@1.4.0 with: redis-version: 6 - uses: rrainn/dynamodb-action@v2.0.1 # Cache packages per python version, and reuse until lockfile changes - name: Cache python packages id: cache uses: actions/cache@v3 with: path: .venv key: venv-${{ matrix.python-version }}-latest-${{ hashFiles('poetry.lock') }} - name: Install dependencies if: steps.cache.outputs.cache-hit != 'true' run: poetry install -v -E all # Run tests with coverage report - name: Run unit + integration tests if: ${{ !contains(matrix.python-version, 'pypy') }} run: | source $VENV nox -e cov -- xml # pypy tests aren't run in parallel, so too slow for integration tests - name: Run unit tests only if: ${{ contains(matrix.python-version, 'pypy') }} run: | source $VENV pytest tests/unit # Latest python version: send coverage report to codecov - name: "Upload coverage report to Codecov" if: ${{ matrix.python-version == env.LATEST_PY_VERSION }} uses: codecov/codecov-action@v3 # Run code analysis checks via pre-commit hooks analyze: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: actions/setup-python@v4 with: python-version: ${{ env.LATEST_PY_VERSION }} - name: Run style checks & linting uses: pre-commit/action@v3.0.0