name: linux

# build on c/cpp changes or workflow changes
on:
  push:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'util/ci/**'
      - 'misc/irrlichtmt_tag.txt'
      - 'Dockerfile'
      - '.dockerignore'
      - '.github/workflows/linux.yml'
  pull_request:
    paths:
      - 'lib/**.[ch]'
      - 'lib/**.cpp'
      - 'src/**.[ch]'
      - 'src/**.cpp'
      - '**/CMakeLists.txt'
      - 'cmake/Modules/**'
      - 'util/ci/**'
      - 'misc/irrlichtmt_tag.txt'
      - 'Dockerfile'
      - '.dockerignore'
      - '.github/workflows/linux.yml'

env:
  MINETEST_POSTGRESQL_CONNECT_STRING: 'host=localhost user=minetest password=minetest dbname=minetest'

jobs:
  # Older gcc version (should be close to our minimum supported version)
  gcc_7:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps g++-7

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: gcc-7
          CXX: g++-7

      - name: Test
        run: |
          ./bin/minetest --run-unittests

  # Current gcc version
  gcc_12:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps g++-12 libluajit-5.1-dev

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: gcc-12
          CXX: g++-12

      - name: Test
        run: |
          mkdir nowrite
          chmod a-w nowrite
          cd nowrite
          ../bin/minetest --run-unittests

  # Older clang version (should be close to our minimum supported version)
  clang_7:
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-7 valgrind

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-7
          CXX: clang++-7

      - name: Unittest
        run: |
          ./bin/minetest --run-unittests

      - name: Valgrind
        run: |
          valgrind --leak-check=full --leak-check-heuristics=all --undef-value-errors=no --error-exitcode=9 ./bin/minetest --run-unittests

  # Current clang version
  clang_14:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-14 gdb

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-14
          CXX: clang++-14

      - name: Test
        run: |
          ./bin/minetest --run-unittests

      - name: Integration test + devtest
        run: |
          ./util/test_multiplayer.sh

  # Build with prometheus-cpp (server-only)
  clang_9_prometheus:
    name: "clang_9 (PROMETHEUS=1)"
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - name: Install deps
        run: |
          source ./util/ci/common.sh
          install_linux_deps clang-9

      - name: Build prometheus-cpp
        run: |
          ./util/ci/build_prometheus_cpp.sh

      - name: Build
        run: |
          ./util/ci/build.sh
        env:
          CC: clang-9
          CXX: clang++-9
          CMAKE_FLAGS: "-DENABLE_PROMETHEUS=1 -DBUILD_CLIENT=0"

      - name: Test
        run: |
          ./bin/minetestserver --run-unittests

  docker:
    name: "Docker image"
    runs-on: ubuntu-20.04
    steps:
      - uses: actions/checkout@v3
      - name: Build docker image
        run: |
          docker build . -t minetest:latest
          docker run --rm minetest:latest /usr/local/bin/minetestserver --version
