name: PR Checks

# Pre-merge CI to run on push and pull_request events, even if this seems
# redundant, we avoid concurrency with the below configuration.
#
on:
  pull_request:
  workflow_dispatch:

# Use the concurrency feature to ensure we don't run redundant workflows
#
concurrency:
  group: ${{ github.repository }}-${{ github.ref }}-${{ github.workflow }}
  cancel-in-progress: true

# Left to-do:
# - coverage
# - publishing docs to gh-pages
# - persistent artifact cache
# - overnight jobs
# - wsl tasks (TODO: Check if GitHub's Windows runners allow WSL)
#
# New opportunities:
# - run tests on mac (GitHub provides MacOS runners)
# - standardize WSL tasks by using GitHub-provided runners

jobs:
  tests:
    runs-on: ubuntu-24.04
    continue-on-error: ${{ matrix.allow-failure || false }}

    strategy:
      fail-fast: false
      matrix:

        # The names here should map to a valid service defined in
        # "../compose/ci.docker-compose.yml"
        test-name:
          - debian-12
          - debian-13
          - fedora-42
          - fedora-43
          - fedora-missing-deps
          - ubuntu-22.04
          - lint
          - mypy

        include:
          - test-name: plugins-master
            allow-failure: true

    steps:
      - name: Disable AppArmor restriction for bubblewrap
        run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

      - name: Check out repository
        uses: actions/checkout@v2
        # BuildStream requires tags to be able to find its version.
        with:
          fetch-depth: 0

      - name: Run tests with Docker Compose
        run: |
          ${GITHUB_WORKSPACE}/.github/run-ci.sh ${{ matrix.test-name }}

  # Matrix of tests which run against remote services which we bring up adjacently
  service-tests:
    runs-on: ubuntu-24.04

    strategy:
      matrix:

        # The names here map to valid services defined in "../compose/ci.docker-compose.yml",
        # and they also map to corresponding filenames of services which are expected
        # to be run in the background
        test-name:
          - buildbarn
          - buildgrid

    steps:
      - name: Disable AppArmor restriction for bubblewrap
        run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

      - name: Check out repository
        uses: actions/checkout@v2
        # BuildStream requires tags to be able to find its version.
        with:
          fetch-depth: 0

      - name: Bring up the RE cluster
        run: |
          ${GITHUB_WORKSPACE}/.github/run-ci.sh --service ${{ matrix.test-name }}

  build_docs:
    runs-on: ubuntu-24.04
    steps:
      - name: Disable AppArmor restriction for bubblewrap
        run: sudo sysctl -w kernel.apparmor_restrict_unprivileged_userns=0

      - name: Check out repository
        uses: actions/checkout@v2
        # BuildStream requires tags to be able to find its version.
        with:
          fetch-depth: 0

      - name: Give `testuser` ownership of the source directory
        run: sudo chown -R 1000:1000 ${GITHUB_WORKSPACE}

      - name: Build documentation using Docker Compose
        run: |
          docker compose \
            --env-file ${GITHUB_WORKSPACE}/.github/common.env \
            --file ${GITHUB_WORKSPACE}/.github/compose/ci.docker-compose.yml \
            run \
            docs

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: docs
          path: doc/build/html

  build_wheels:
    name: Build Python wheel packages on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-24.04]

    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Fetch latest BuildBox release
        run: ${GITHUB_WORKSPACE}/.github/wheel-helpers/fetch-latest-buildbox-release.sh

      - name: Build wheels
        run: pipx run cibuildwheel==v3.1.4

      - uses: actions/upload-artifact@v4
        with:
          name: wheels
          path: ./wheelhouse/*.whl

  test_wheels:
    name: "Test Python packages: ${{ matrix.test-name }}"
    needs: [build_wheels]
    runs-on: ubuntu-24.04

    strategy:
      matrix:
        # The names here should map to a valid service defined in
        # "../compose/ci.docker-compose.yml"
        test-name:
          - wheels-manylinux_2_28-cp310
          - wheels-manylinux_2_28-cp311
          - wheels-manylinux_2_28-cp312
          - wheels-manylinux_2_28-cp313
          - wheels-manylinux_2_28-cp314

    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - uses: actions/download-artifact@v4
        with:
          name: wheels
          path: ./wheelhouse

      - name: Run tests with Docker Compose
        run: |
          ${GITHUB_WORKSPACE}/.github/run-ci.sh ${{ matrix.test-name }}
