name: Run tests & Publish to Docker Registry

on: [push, pull_request]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.7]

    # service containers to run with `postgres-job`
    services:
      # label used to access the service container
      postgres:
        # Docker Hub image
        image: postgres:13
        # service environment variables
        # `POSTGRES_HOST` is `postgres`
        env:
          # optional (defaults to `postgres`)
          POSTGRES_DB: test
          # required
          POSTGRES_PASSWORD: test
          # optional (defaults to `5432`)
          POSTGRES_PORT: 5432
          # optional (defaults to `postgres`)
          POSTGRES_USER: test
        ports:
          - 15432:5432
        # set health checks to wait until postgres has started
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5

    steps:
      - uses: actions/checkout@v2

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v2
        with:
          python-version: ${{ matrix.python-version }}

      - uses: actions/cache@v1
        with:
          path: ~/.cache/poetry
          key: ${{ runner.os }}-poetry-${{ hashFiles('**/poetry.lock') }}
          restore-keys: |
            ${{ runner.os }}-poetry-

      - name: Install dependencies
        run: |
          python -m pip install poetry==1.0.10
          poetry config virtualenvs.create false
          poetry install

      - name: Check formatting & linting
        run: |
          poetry run black --check .
          flake8

      - name: Test with pytest
        run: |
          pytest --cov=. --cov-report=term:skip-covered --cov-report=html:htmlcov --cov-fail-under=60

      - name: Archive code coverage results
        uses: actions/upload-artifact@v2
        with:
          name: code-coverage-report
          path: htmlcov

      - name: Publish to Docker Registry
        if: github.event_name == 'push' && github.ref == 'refs/heads/master'
        uses: docker/build-push-action@v1
        with:
          repository: simplelogin/app-ci
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
          tag_with_ref: true

      - name: Create Sentry release
        if: github.event_name == 'push' && github.ref == 'refs/heads/master'
        uses: getsentry/action-release@v1
        env:
          SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
          SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }}

      - name: Send Telegram message
        if: github.event_name == 'push' && github.ref == 'refs/heads/master'
        uses: appleboy/telegram-action@master
        with:
          to: ${{ secrets.TELEGRAM_TO }}
          token: ${{ secrets.TELEGRAM_TOKEN }}
          args: Docker image pushed on ${{ github.ref }}
