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@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 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