name: Release Ubuntu 20.04

on:
  workflow_dispatch:
    inputs:
      build_type:
        type: choice
        description: "Memgraph Build type. Default value is Release."
        default: 'Release'
        options:
          - Release
          - RelWithDebInfo

  schedule:
    - cron: "0 22 * * *"

jobs:
  community_build:
    name: "Community build"
    runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
    env:
      THREADS: 24
      MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
      MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
    timeout-minutes: 960

    steps:
      - name: Set up repository
        uses: actions/checkout@v3
        with:
          # Number of commits to fetch. `0` indicates all history for all
          # branches and tags. (default: 1)
          fetch-depth: 0

      - name: Build community binaries
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Initialize dependencies.
          ./init

          # Set default build_type to Release
          INPUT_BUILD_TYPE=${{ github.event.inputs.build_type }}
          BUILD_TYPE=${INPUT_BUILD_TYPE:-"Release"}

          # Build community binaries.
          cd build
          cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMG_ENTERPRISE=OFF ..
          make -j$THREADS

      - name: Run unit tests
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run unit tests.
          cd build
          ctest -R memgraph__unit --output-on-failure

  coverage_build:
    name: "Coverage build"
    runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
    env:
      THREADS: 24
      MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
      MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}

    steps:
      - name: Set up repository
        uses: actions/checkout@v3
        with:
          # Number of commits to fetch. `0` indicates all history for all
          # branches and tags. (default: 1)
          fetch-depth: 0

      - name: Build coverage binaries
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Initialize dependencies.
          ./init

          # Build coverage binaries.
          cd build
          cmake -DTEST_COVERAGE=ON ..
          make -j$THREADS memgraph__unit

      - name: Run unit tests
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run unit tests.
          cd build
          ctest -R memgraph__unit --output-on-failure

      - name: Compute code coverage
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Compute code coverage.
          cd tools/github
          ./coverage_convert

          # Package code coverage.
          cd generated
          tar -czf code_coverage.tar.gz coverage.json html report.json summary.rmu

      - name: Save code coverage
        uses: actions/upload-artifact@v3
        with:
          name: "Code coverage"
          path: tools/github/generated/code_coverage.tar.gz

  debug_build:
    name: "Debug build"
    runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
    env:
      THREADS: 24
      MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
      MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}

    steps:
      - name: Set up repository
        uses: actions/checkout@v3
        with:
          # Number of commits to fetch. `0` indicates all history for all
          # branches and tags. (default: 1)
          fetch-depth: 0

      - name: Build debug binaries
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Initialize dependencies.
          ./init

          # Build debug binaries.
          cd build
          cmake ..
          make -j$THREADS

      - name: Run leftover CTest tests
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run leftover CTest tests (all except unit and benchmark tests).
          cd build
          ctest -E "(memgraph__unit|memgraph__benchmark)" --output-on-failure

      - name: Run drivers tests
        run: |
          ./tests/drivers/run.sh

      - name: Run integration tests
        run: |
          tests/integration/run.sh

      - name: Run cppcheck and clang-format
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run cppcheck and clang-format.
          cd tools/github
          ./cppcheck_and_clang_format diff

      - name: Save cppcheck and clang-format errors
        uses: actions/upload-artifact@v3
        with:
          name: "Code coverage"
          path: tools/github/cppcheck_and_clang_format.txt

  release_build:
    name: "Release build"
    runs-on: [self-hosted, Linux, X64, Ubuntu20.04]
    env:
      THREADS: 24
      MEMGRAPH_ENTERPRISE_LICENSE: ${{ secrets.MEMGRAPH_ENTERPRISE_LICENSE }}
      MEMGRAPH_ORGANIZATION_NAME: ${{ secrets.MEMGRAPH_ORGANIZATION_NAME }}
    timeout-minutes: 960

    steps:
      - name: Set up repository
        uses: actions/checkout@v3
        with:
          # Number of commits to fetch. `0` indicates all history for all
          # branches and tags. (default: 1)
          fetch-depth: 0

      - name: Build release binaries
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Initialize dependencies.
          ./init

          # Set default build_type to Release
          INPUT_BUILD_TYPE=${{ github.event.inputs.build_type }}
          BUILD_TYPE=${INPUT_BUILD_TYPE:-"Release"}

          # Build release binaries.
          cd build
          cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE ..
          make -j$THREADS

      - name: Create enterprise DEB package
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          cd build

          # create mgconsole
          # we use the -B to force the build
          make -j$THREADS -B mgconsole

          # Create enterprise DEB package.
          mkdir output && cd output
          cpack -G DEB --config ../CPackConfig.cmake

      - name: Save enterprise DEB package
        uses: actions/upload-artifact@v3
        with:
          name: "Enterprise DEB package"
          path: build/output/memgraph*.deb

      - name: Run micro benchmark tests
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run micro benchmark tests.
          cd build
          # The `eval` benchmark needs a large stack limit.
          ulimit -s 262144
          ctest -R memgraph__benchmark -V

      - name: Run macro benchmark tests
        run: |
          cd tests/macro_benchmark
          ./harness QuerySuite MemgraphRunner \
            --groups aggregation 1000_create unwind_create dense_expand match \
            --no-strict

      - name: Run parallel macro benchmark tests
        run: |
          cd tests/macro_benchmark
          ./harness QueryParallelSuite MemgraphRunner \
            --groups aggregation_parallel create_parallel bfs_parallel \
            --num-database-workers 9 --num-clients-workers 30 \
            --no-strict

      - name: Run GQL Behave tests
        run: |
          cd tests
          ./setup.sh /opt/toolchain-v4/activate
          cd gql_behave
          ./continuous_integration

      - name: Save quality assurance status
        uses: actions/upload-artifact@v3
        with:
          name: "GQL Behave Status"
          path: |
            tests/gql_behave/gql_behave_status.csv
            tests/gql_behave/gql_behave_status.html

      - name: Run unit tests
        run: |
          # Activate toolchain.
          source /opt/toolchain-v4/activate

          # Run unit tests.
          cd build
          ctest -R memgraph__unit --output-on-failure

      - name: Run e2e tests
        run: |
          cd tests
          ./setup.sh /opt/toolchain-v4/activate
          source ve3/bin/activate_e2e
          cd e2e
          ./run.sh

      - name: Run stress test (plain)
        run: |
          cd tests/stress
          ./continuous_integration

      - name: Run stress test (SSL)
        run: |
          cd tests/stress
          ./continuous_integration --use-ssl

      - name: Run stress test (large)
        run: |
          cd tests/stress
          ./continuous_integration --large-dataset

      - name: Run durability test (plain)
        run: |
          cd tests/stress
          source ve3/bin/activate
          python3 durability --num-steps 5

      - name: Run durability test (large)
        run: |
          cd tests/stress
          source ve3/bin/activate
          python3 durability --num-steps 20
