name: CI

on:
  push:
    branches:
      - main
  pull_request: ~
  workflow_dispatch: ~

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

jobs:
  tests:
    name: Tests
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      -
        name: Build Docker images
        uses: docker/bake-action@v4
        with:
          pull: true
          load: true
          files: |
            compose.yaml
            compose.override.yaml
          set: |
            *.cache-from=type=gha,scope=${{github.ref}}
            *.cache-from=type=gha,scope=refs/heads/main
            *.cache-to=type=gha,scope=${{github.ref}},mode=max
      -
        name: Start services
        run: docker compose up --wait --no-build
      -
        name: Check HTTP reachability
        run: curl -v --fail-with-body http://localhost
      -
        name: Check API reachability
        run: curl -vk --fail-with-body https://localhost
      -
        name: Generate JWT keys (without passphrase)
        run: docker compose exec -T php bin/console lexik:jwt:generate-keypair --overwrite
      -
        name: Create test database
        run: docker compose exec -T php bin/console -e test doctrine:database:create
      -
        name: Run migrations
        run: docker compose exec -T php bin/console -e test doctrine:migrations:migrate --no-interaction
      -
        name: Run PHPUnit
        run: docker compose exec -T php bin/phpunit
      -
        name: Doctrine Schema Validator
        run: docker compose exec -T php bin/console -e test doctrine:schema:validate
  lint:
    name: Docker Lint
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      -
        name: Lint Dockerfiles
        uses: hadolint/hadolint-action@v3.1.0
        with:
          recursive: true
