name: C++ Tests

on:
  workflow_call:
    inputs:
      continuous-run:
        required: true
        description: "Boolean string denoting whether this run is continuous --
          empty string for presubmit, non-empty string for continuous."
        type: string
      safe-checkout:
        required: true
        description: "The SHA key for the commit we want to run over"
        type: string
      continuous-prefix:
        required: true
        description: "The string continuous-only tests should be prefixed with when displaying test
          results."
        type: string


permissions:
  contents: read

jobs:
  linux:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        config:
          - { name: Optimized, flags: --config=opt }
          - { name: Debug, flags: --config=dbg, continuous-only: true }
          - { name: ASAN, flags: --config=asan, runner: ubuntu-22-4core }
          - { name: MSAN, flags: --config=docker-msan, runner: ubuntu-22-4core, continuous-only: true }
          - { name: TSAN, flags: --config=tsan, runner: ubuntu-22-4core, continuous-only: true }
          - { name: UBSAN, flags: --config=ubsan, runner: ubuntu-22-4core, continuous-only: true,}
          - { name: No-RTTI, flags: --cxxopt=-fno-rtti, continuous-only: true }
        include:
          # Set defaults
          - image: us-docker.pkg.dev/protobuf-build/containers/test/linux/sanitize:8.0.1-d415763a389bb62a6f126b08c992e83f9f7dc1b4
          - targets: //pkg/... //src/... //third_party/utf8_range/... //conformance:conformance_framework_tests
          # Override cases with custom images
          - config: { name: "Bazel8", flags: --cxxopt="-Wno-self-assign-overloaded" }
            cache_key: Bazel8
            image: "us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:8.0.1-d415763a389bb62a6f126b08c992e83f9f7dc1b4"
            targets: "//src/... //third_party/utf8_range/..."
          - config: { name: "Bazel9", flags: "--cxxopt=-Wno-self-assign-overloaded" }
            cache_key: Bazel9
            image: "us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:9.0.0-7932bf8b25fb76a111e7257d151a6a58d5c3c671"
            targets: "//src/... //third_party/utf8_range/..."
          - config: { name: "TCMalloc" }
            cache_key: TcMalloc
            image: "us-docker.pkg.dev/protobuf-build/containers/test/linux/tcmalloc:8.0.1-d415763a389bb62a6f126b08c992e83f9f7dc1b4"
            targets: "//src/... //third_party/utf8_range/..."
          - config: { name: "aarch64", flags: "--platforms=//build_defs:linux-aarch_64" }
            cache_key: aarch64-bazel8
            targets: "//src/... //src/google/protobuf/compiler:protoc_aarch64_test //third_party/utf8_range/..."
            image: "us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:8.0.1-aarch64-168f9c9d015a0fa16611e1e9eede796fe9bfbb69"
    name: ${{ matrix.config.continuous-only && inputs.continuous-prefix || '' }} Linux ${{ matrix.config.name }}
    runs-on: ${{ matrix.config.runner || 'ubuntu-latest' }}
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.config.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Run tests
        if: ${{ !matrix.config.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/bazel-docker@v5
        with:
          image: ${{ matrix.image }}
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-cache: cpp_linux/${{ matrix.cache_key }}
          bazel: test ${{ matrix.targets }} ${{ matrix.config.flags }}
          exclude-targets: ${{ matrix.exclude-targets }}

  linux-gcc:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        version: ['7.5', '9.1', '9.5', '13.1']
        include:
          - version: 9.1
            continuous-only: true
          - version: 9.5
            continuous-only: true
    name: ${{ matrix.config.continuous-only && inputs.continuous-prefix || '' }} Linux GCC ${{ matrix.version }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v5
        if: ${{ !matrix.config.continuous-only || inputs.continuous-run }}
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Run tests
        uses: protocolbuffers/protobuf-ci/bazel-docker@v5
        if: ${{ !matrix.config.continuous-only || inputs.continuous-run }}
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/gcc:8.0.1-${{ matrix.version }}-e78301df86b3e4c46ec9ac4d98be00e19305d8f3
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-cache: cpp_linux/gcc-${{ matrix.version }}
          bazel: test //pkg/... //src/... //third_party/utf8_range/... //conformance:conformance_framework_tests

  linux-release:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        arch: [x86_64, aarch64]
        include:
          - arch: aarch64
            continuous-only: true
    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} Linux Release ${{ matrix.arch }}
    runs-on: ubuntu-22-4core
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Cross compile protoc for ${{ matrix.arch }}
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        id: cross-compile
        uses: protocolbuffers/protobuf-ci/cross-compile-protoc@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/common/linux/bazel:8.0.1-d415763a389bb62a6f126b08c992e83f9f7dc1b4
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          architecture: linux-${{ matrix.arch }}
      - name: Setup sccache
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: linux-release-${{ matrix.arch }}
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
      - name: Run tests
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/docker@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/emulation:8.0.1-${{ matrix.arch }}-168f9c9d015a0fa16611e1e9eede796fe9bfbb69
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          entrypoint: bash
          command: >
            -c "set -ex;
            sccache -z;
            cmake . -DWITH_PROTOC=/workspace/${{ steps.cross-compile.outputs.protoc }}
            -Dprotobuf_BUILD_TESTS=ON
            -Dprotobuf_BUILD_CONFORMANCE=ON -DCMAKE_CXX_STANDARD=17
            -Dprotobuf_WITH_ZLIB=OFF ${{ env.SCCACHE_CMAKE_FLAGS }};
            cmake --build . --parallel 20;
            ctest --no-tests=error --parallel 20;
            sccache -s"

  linux-cmake:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        include:
          - flags: -Dprotobuf_BUILD_EXAMPLES=ON -DCMAKE_CXX_STANDARD=17 -Dprotobuf_BUILD_CONFORMANCE=ON
          - name: Ninja
            flags: -G Ninja -DCMAKE_CXX_STANDARD=17
            continuous-only: true
          - name: Shared
            flags: -Dprotobuf_BUILD_SHARED_LIBS=ON -Dprotobuf_BUILD_EXAMPLES=ON -DCMAKE_CXX_STANDARD=17
            continuous-only: true
          - name: C++20
            flags: -DCMAKE_CXX_STANDARD=20
          - name: Package
            flags: -DCMAKE_CXX_STANDARD=17 -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=ON
          - name: Fetch
            flags: -DCMAKE_CXX_STANDARD=17 -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON

    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} Linux CMake ${{ matrix.name}}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup sccache
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: linux-cmake
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Run tests
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/docker@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/cmake:3.16.9-9626718698895971df3953d4aa2321d7425f3c5f
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          command: >-
            /test.sh ${{ matrix.flags}} ${{ env.SCCACHE_CMAKE_FLAGS }}
            -Dprotobuf_BUILD_TESTS=ON ${{ matrix.package_flags }}

  linux-cmake-install:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        type: [package, static, fetch]
        include:
          # Set defaults
          - type: package
            name: Install
            flags: -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=ON -Dprotobuf_BUILD_SHARED_LIBS=ON
          - type: static
            name: Install (static)
            flags: -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=ON -Dprotobuf_BUILD_SHARED_LIBS=OFF
          - type: fetch
            name: Install (Fetch)
            flags: -Dprotobuf_FORCE_FETCH_DEPENDENCIES=ON -Dprotobuf_BUILD_SHARED_LIBS=ON
            continuous-only: true
    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }}Linux CMake ${{ matrix.name }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v5
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup sccache
        uses: protocolbuffers/protobuf-ci/sccache@v5
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        with:
          cache-prefix: linux-cmake-install
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/docker@v5
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/cmake:3.16.9-9626718698895971df3953d4aa2321d7425f3c5f
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          command: >-
            /install.sh -DCMAKE_CXX_STANDARD=17 ${{ env.SCCACHE_CMAKE_FLAGS }}
            ${{ matrix.flags }}
            \&\&
            cp build/install_manifest.txt .
            \&\&
            /test.sh
            ${{ env.SCCACHE_CMAKE_FLAGS }}
            -Dprotobuf_REMOVE_INSTALLED_HEADERS=ON
            -Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF
            -Dprotobuf_BUILD_CONFORMANCE=ON
            -DCMAKE_CXX_STANDARD=17
            ${{ matrix.flags }}

      - name: Clean up install manifest
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        run: |
          set -ex
          mkdir manifest
          cat install_manifest.txt | sort | sed 's:/usr/local/::g' > manifest/all.txt
          cat manifest/all.txt | grep -E '^include/' | grep -vE 'internal' | sed 's:^include/::g' > manifest/include.txt
          cat manifest/all.txt | grep -E '^bin/' | grep -vE '\-[0-9]+\.[0-9]+\.[0-9]+$' | sed 's:^bin/::g' > manifest/bin.txt
          cat manifest/all.txt | grep -E '^lib/' | grep -vE '\.[0-9]+\.[0-9]+\.[0-9]+$' | sed 's:^lib/::g' > manifest/lib.txt

      - name: Upload install manifest
        uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f  # v6.0.0
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        with:
          name: installed_files_${{ matrix.type }}
          path: manifest/*.txt

  install-manifests:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        type: [include, bin, lib]
        build: [static, package]
        include:
            - type: lib
              build: static
              golden: 'lib_static'
            - type: lib
              build: package
              golden: 'lib_shared'
    name: Check Installed Files
    needs: linux-cmake-install
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Download manifest
        uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131  # v7.0.0
        with:
          name: installed_files_${{ matrix.build }}
          path: ${{ matrix.build }}
      
      - name: Compare against golden
        run: |
          set +e
          GOLDEN_FILE=cmake/installed_${{ matrix.golden || matrix.type }}_golden.txt
          DIFF="$(diff -u ${GOLDEN_FILE} ${{ matrix.build }}/${{ matrix.type }}.txt)"
          if [ -n "$DIFF" ]; then
            echo "Installed files do not match goldens!"
            echo "If this is expected, please update the golden file: ${GOLDEN_FILE}"
            echo "The following diffs were found:"
            echo "$DIFF"
            exit 1
          else
            echo "Installed files match goldens."
          fi

  # This test should always be skipped on presubmit
  linux-cmake-examples:
    name: ${{ inputs.continuous-prefix }} Linux CMake Examples
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        if: ${{ inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup sccache
        if: ${{ inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: linux-cmake-examples
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Run tests
        if: ${{ inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/docker@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/cmake:3.16.9-9626718698895971df3953d4aa2321d7425f3c5f
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          command: >-
            /install.sh -DCMAKE_CXX_STANDARD=17 ${{ env.SCCACHE_CMAKE_FLAGS }}
            -Dprotobuf_LOCAL_DEPENDENCIES_ONLY=OFF
            -Dprotobuf_BUILD_EXAMPLES=OFF -Dprotobuf_BUILD_TESTS=ON \&\&
            mkdir examples/build \&\&
            cd examples/build \&\&
            cmake .. -DCMAKE_CXX_STANDARD=17 \&\&
            cmake --build .

  linux-cmake-gcc:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        include:
          - name: C++17
            flags: -DCMAKE_CXX_STANDARD=17
            continuous-only: true
          - name: C++20
            flags: -DCMAKE_CXX_STANDARD=20

    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} Linux CMake GCC ${{ matrix.name }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup sccache
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: linux-cmake-gcc
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Run tests
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/docker@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/gcc:8.0.1-12.2-168f9c9d015a0fa16611e1e9eede796fe9bfbb69
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          entrypoint: bash
          command: >-
              -c 'set -ex;
              cd /workspace;
              sccache -z;
              cmake . -Dprotobuf_BUILD_TESTS=ON ${{ matrix.flags }} ${{ env.SCCACHE_CMAKE_FLAGS }};
              cmake --build . --parallel 20;
              ctest --no-tests=error --verbose --parallel 20;
              sccache -s'

  linux-cmake-32-bit:
    name: Linux CMake 32-bit
    runs-on: ubuntu-latest
    steps:
      - name: Checkout pending changes
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup sccache
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: linux-cmake-32-bit
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      - name: Run tests
        uses: protocolbuffers/protobuf-ci/docker@v5
        with:
          image: us-docker.pkg.dev/protobuf-build/containers/test/linux/32bit@sha256:d6028ab408c49932836cdc514116f06886d7f6868a4d430630aa52adc5aee2fc
          platform: linux/386
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          entrypoint: bash
          command: >-
              -c 'set -ex;
              cd /workspace;
              sccache -z;
              cmake . -DCMAKE_CXX_STANDARD=17 -Dprotobuf_BUILD_TESTS=ON ${{ env.SCCACHE_CMAKE_FLAGS }};
              cmake --build . --parallel 20;
              ctest --no-tests=error --verbose --parallel 20;
              sccache -s'

  non-linux:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        include:
          - name: MacOS Bazel
            os: macos-14
            cache_key: macos-14-bazel8
            bazel: test //src/... //third_party/utf8_range/... //conformance:conformance_framework_tests
          - name: MacOS Intel Bazel
            os: macos-14
            cache_key: macos-14-intel
            bazel: test --cpu=darwin_x86_64 //src/... //third_party/utf8_range/... //conformance:conformance_framework_tests
          - name: Windows Bazel
            os: windows-2022
            cache_key: windows-2022-msvc-cl
            bazel: test //src/...  --config=msvc-cl --test_tag_filters=-conformance --build_tag_filters=-conformance
          - name: Windows Bazel C++20
            os: windows-2022
            cache_key: windows-2022-msvc-cl
            bazel: test //src/...  --config=msvc-cl --cxxopt="-std:c++20" --test_tag_filters=-conformance --build_tag_filters=-conformance
          - name: Windows Bazel clang-cl
            os: windows-2022
            cache_key: windows-2022-clang-cl
            bazel: test //src/...  --test_tag_filters=-conformance --build_tag_filters=-conformance
    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}
      - name: Run tests
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/bazel@v5
        with:
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel: ${{ matrix.bazel }}
          bazel-cache: cpp_${{ matrix.cache_key }}
          version: ${{ matrix.bazel_version || '8.0.1' }}

  non-linux-cmake:
    strategy:
      fail-fast: false   # Don't cancel all jobs if one fails.
      matrix:
        include:
          - name: MacOS CMake
            os: macos-14
            cache-prefix: macos-cmake
            continuous-only: true
          - name: Windows CMake
            os: windows-2022
            flags: >-
              -G Ninja -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF
              -Dprotobuf_BUILD_SHARED_LIBS=OFF
              -Dprotobuf_BUILD_EXAMPLES=ON
            vsversion: '2022'
            cache-prefix: windows-2022-cmake
          - name: Windows CMake 32-bit
            os: windows-2022
            flags: >-
              -G Ninja -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF
            vsversion: '2022'
            windows-arch: 'win32'
            cache-prefix: windows-2022-win32-cmake
            continuous-only: true
          - name: Windows CMake Shared
            os: windows-2022
            flags: >-
              -G Ninja -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF
              -Dprotobuf_BUILD_SHARED_LIBS=ON
            vsversion: '2022'
            cache-prefix: windows-2022-cmake
          - name: Windows CMake Install
            os: windows-2022
            install-flags: >-
              -G Ninja -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF
            flags: >-
              -G Ninja -Dprotobuf_WITH_ZLIB=OFF -Dprotobuf_BUILD_CONFORMANCE=OFF
              -Dprotobuf_REMOVE_INSTALLED_HEADERS=ON
              -Dprotobuf_BUILD_PROTOBUF_BINARIES=OFF
            vsversion: '2022'
            cache-prefix: windows-2022-cmake
            continuous-only: true
    name: ${{ matrix.continuous-only && inputs.continuous-prefix || '' }} ${{ matrix.name }}
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout pending changes
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/checkout@v5
        with:
          ref: ${{ inputs.safe-checkout }}

      - name: Setup MSVC
        if: ${{ runner.os == 'Windows' && (!matrix.continuous-only || inputs.continuous-run) }}
        uses: ilammy/msvc-dev-cmd@cec98b9d092141f74527d0afa6feb2af698cfe89 # v1.12.1
        with:
          arch: ${{ matrix.windows-arch || 'x64' }}
          vsversion: ${{ matrix.vsversion }}

      - name: Setup sccache
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/sccache@v5
        with:
          cache-prefix: ${{ matrix.cache-prefix }}
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}

      # Install phase.
      - name: Configure CMake for install
        if: ${{ matrix.install-flags && (!matrix.continuous-only || inputs.continuous-run) }}
        uses: protocolbuffers/protobuf-ci/bash@v5
        with:
          bazel-version: 8.0.1
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          command: >-
            cmake . -DCMAKE_CXX_STANDARD=17 -Dprotobuf_BUILD_TESTS=ON ${{ matrix.install-flags }}
            ${{ env.SCCACHE_CMAKE_FLAGS }} -Dprotobuf_ALLOW_CCACHE=ON
      - name: Build for install
        if: ${{ matrix.install-flags && (!matrix.continuous-only || inputs.continuous-run) }}
        shell: bash
        run: VERBOSE=1 cmake --build . --parallel 20
      - name: Install
        if: ${{ matrix.install-flags && (!matrix.continuous-only || inputs.continuous-run) }}
        shell: bash
        run: cmake --build . --target install
      - name: Report and clear sccache stats
        if: ${{ matrix.install-flags && (!matrix.continuous-only || inputs.continuous-run) }}
        shell: bash
        run: sccache -s && sccache -z
      - name: Clear CMake cache
        if: ${{ matrix.install-flags && (!matrix.continuous-only || inputs.continuous-run) }}
        shell: bash
        run: cmake --build . --target clean && rm CMakeCache.txt

      - name: Configure CMake
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        uses: protocolbuffers/protobuf-ci/bash@v5
        with:
          credentials: ${{ secrets.GAR_SERVICE_ACCOUNT }}
          bazel-version: 8.0.1
          command: >-
            cmake . -DCMAKE_CXX_STANDARD=17 -Dprotobuf_BUILD_TESTS=ON ${{ matrix.flags }}
            ${{ env.SCCACHE_CMAKE_FLAGS }} -Dprotobuf_ALLOW_CCACHE=ON

      - name: Build
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        shell: bash
        run: VERBOSE=1 cmake --build . --parallel 20

      - name: Test
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        shell: bash
        run: ctest --no-tests=error --verbose --parallel 20 -C Debug

      - name: Report sccache stats
        if: ${{ !matrix.continuous-only || inputs.continuous-run }}
        shell: bash
        run: sccache -s
