name: CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

permissions:
  contents: read

jobs:

# Commented 2024-11-06, lack of workers in github causes CI failures
#  arm64_test:
#    name: CMake test arm64 (with modern protobuf,grpc and abseil)
#    runs-on: actuated-arm64-4cpu-16gb
#    steps:
#    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
#      with:
#        submodules: 'recursive'
#    - name: setup
#      env:
#        CXX_STANDARD: '17'
#        CC: /usr/bin/gcc-10
#        CXX: /usr/bin/g++-10
#      run: |
#        sudo -E ./ci/setup_gcc10.sh
#        sudo -E ./ci/setup_ci_environment.sh
#    - name: install dependencies
#      run: |
#        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release

  cmake_test:
    name: CMake test (prometheus, elasticsearch, zipkin)
    runs-on: ubuntu-22.04
    env:
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
        sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev nlohmann-json3-dev
    - name: run cmake tests
      run: |
        ./ci/do_ci.sh cmake.test

  cmake_fetch_content_test:
    name: CMake FetchContent usage with opentelemetry-cpp
    runs-on: ubuntu-24.04
    env:
      CXX_STANDARD: '17'
      CMAKE_VERSION: '3.16.0'
      BUILD_TYPE: 'Release'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'false'
    - name: checkout googletest
      run: |
        git submodule update --init --recursive ./third_party/googletest
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
        sudo -E ./ci/setup_cmake.sh
    - name: install dependencies
      run: |
        sudo -E apt-get update
        sudo -E apt-get install -y zlib1g-dev
    - name: run fetch content cmake test
      run: |
        ./ci/do_ci.sh cmake.fetch_content.test

  cmake_gcc_maintainer_sync_test:
    name: CMake gcc 14 (maintainer mode, sync)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/gcc-14
      CXX: /usr/bin/g++-14
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake gcc (maintainer mode, sync, Debug)
      env:
        BUILD_TYPE: Debug
      run: |
        ./ci/do_ci.sh cmake.maintainer.sync.test
    - name: run cmake gcc (maintainer mode, sync, Release)
      env:
        BUILD_TYPE: Release
      run: |
        ./ci/do_ci.sh cmake.maintainer.sync.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_gcc_maintainer_async_test:
    name: CMake gcc 14 (maintainer mode, async)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/gcc-14
      CXX: /usr/bin/g++-14
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake gcc (maintainer mode, async, Debug)
      env:
        BUILD_TYPE: Debug
      run: |
        ./ci/do_ci.sh cmake.maintainer.async.test
    - name: run cmake gcc (maintainer mode, async, Release)
      env:
        BUILD_TYPE: Release
      run: |
        ./ci/do_ci.sh cmake.maintainer.async.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_clang_maintainer_sync_test:
    name: CMake clang 18 (maintainer mode, sync)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/clang-18
      CXX: /usr/bin/clang++-18
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake clang (maintainer mode, sync)
      run: |
        ./ci/do_ci.sh cmake.maintainer.sync.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_clang_maintainer_cxx14_async_test:
    name: CMake clang 18 with C++14 (maintainer mode, async)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/clang-18
      CXX: /usr/bin/clang++-18
      CXX_STANDARD: '14'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: | # install c++14 compatible third-party versions
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file ./install/cmake/third_party_stable
    - name: run cmake clang (maintainer mode, async)
      run: |
        ./ci/do_ci.sh cmake.maintainer.async.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_clang_yaml_config:
    name: CMake clang 18 (maintainer mode, yaml config)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/clang-18
      CXX: /usr/bin/clang++-18
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake clang (maintainer mode, sync)
      run: |
        ./ci/do_ci.sh cmake.maintainer.yaml.test
    - name: install shelltest
      run: sudo apt update && sudo apt-get install -y shelltestrunner
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run otlp func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)
    - name: run configuration func test
      run: |
        (cd ./functional/configuration; ./run_test.sh)

  cmake_clang_maintainer_async_test:
    name: CMake clang 18 (maintainer mode, async)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/clang-18
      CXX: /usr/bin/clang++-18
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake clang (maintainer mode, async)
      run: |
        ./ci/do_ci.sh cmake.maintainer.async.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_clang_maintainer_abiv2_test:
    name: CMake clang 18 (maintainer mode, abiv2)
    runs-on: ubuntu-24.04
    env:
      CC: /usr/bin/clang-18
      CXX: /usr/bin/clang++-18
      CXX_STANDARD: '17'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run cmake clang (maintainer mode, abiv2)
      run: |
        ./ci/do_ci.sh cmake.maintainer.abiv2.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_msvc_maintainer_test:
    name: CMake msvc (maintainer mode)
    runs-on: windows-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run tests
      run: ./ci/do_ci.ps1 cmake.maintainer.test

  cmake_msvc_maintainer_test_stl_cxx20:
    name: CMake msvc (maintainer mode) with C++20
    runs-on: windows-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run tests
      env:
        CXX_STANDARD: '20'
      run: ./ci/do_ci.ps1 cmake.maintainer.cxx20.stl.test

  cmake_msvc_maintainer_abiv2_test:
    name: CMake msvc (maintainer mode, abiv2)
    runs-on: windows-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run tests
      env:
        CXX_STANDARD: '20'
      run: ./ci/do_ci.ps1 cmake.maintainer.abiv2.test

  cmake_with_async_export_test:
    name: CMake test (without otlp-exporter and with async export)
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      env:
        CC: /usr/bin/gcc-12
        CXX: /usr/bin/g++-12
      run: |
        sudo -E ./ci/setup_ci_environment.sh
        sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev
    - name: run cmake tests (without otlp-exporter)
      env:
        CC: /usr/bin/gcc-12
        CXX: /usr/bin/g++-12
      run: |
        ./ci/do_ci.sh cmake.with_async_export.test

  cmake_opentracing_shim_test:
    name: CMake test (with opentracing-shim)
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run cmake tests (enable opentracing-shim)
      run: ./ci/do_ci.sh cmake.opentracing_shim.test

  cmake_test_cxx14_gcc:
    name: CMake C++14 test(GCC)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file ./install/cmake/third_party_stable --packages "googletest;benchmark"
    - name: run tests
      env:
        CXX_STANDARD: '14'
      run: ./ci/do_ci.sh cmake.c++14.test
    - name: run tests (enable stl)
      env:
        CXX_STANDARD: '14'
      run: ./ci/do_ci.sh cmake.c++14.stl.test

  cmake_test_cxx17_gcc:
    name: CMake C++17 test(GCC)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CXX_STANDARD: '17'
      run: ./ci/do_ci.sh cmake.c++17.test
    - name: run tests (enable stl)
      env:
        CXX_STANDARD: '17'
      run: ./ci/do_ci.sh cmake.c++17.stl.test

  cmake_test_cxx20_gcc:
    name: CMake C++20 test(GCC)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CXX_STANDARD: '20'
      run: ./ci/do_ci.sh cmake.c++20.test
    - name: run tests (enable stl)
      env:
        CXX_STANDARD: '20'
      run: ./ci/do_ci.sh cmake.c++20.stl.test

  cmake_test_cxx20_clang:
    name: CMake C++20 test(Clang with libc++)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
        CXX_STANDARD: '20'
      run: ./ci/do_ci.sh cmake.c++20.test
    - name: run tests (enable stl)
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
        CXX_STANDARD: '20'
      run: ./ci/do_ci.sh cmake.c++20.stl.test

  cmake_test_cxx23_gcc:
    name: CMake C++23 test(GCC)
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CXX_STANDARD: '23'
      run: ./ci/do_ci.sh cmake.c++23.test
    - name: run tests (enable stl)
      env:
        CXX_STANDARD: '23'
      run: ./ci/do_ci.sh cmake.c++23.stl.test

  cmake_test_cxx23_clang:
    name: CMake C++23 test(Clang with libc++)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
        CXX_STANDARD: '23'
      run: ./ci/do_ci.sh cmake.c++23.test
    - name: run tests (enable stl)
      env:
        CC: /usr/bin/clang
        CXX: /usr/bin/clang++
        CXXFLAGS: "-stdlib=libc++"
        CXX_STANDARD: '23'
      run: ./ci/do_ci.sh cmake.c++23.stl.test

  cmake_otprotocol_test:
    name: CMake test (with otlp-exporter)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run otlp exporter tests
      run: |
        ./ci/do_ci.sh cmake.exporter.otprotocol.test
    - name: generate test cert
      run: |
        (cd ./functional/cert; ./generate_cert.sh)
    - name: run func test
      run: |
        (cd ./functional/otlp; ./run_test.sh)

  cmake_modern_protobuf_grpc_with_abseil_test:
    name: CMake test (with modern protobuf,grpc and abseil)
    runs-on: ubuntu-latest
    env:
      CXX_STANDARD: '14'
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit
    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file install/cmake/third_party_stable
    - name: run otlp exporter tests
      run: |
        ./ci/do_ci.sh cmake.exporter.otprotocol.test

  cmake_do_not_install_test:
    name: CMake do not install test (with otlp-exporter)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run otlp exporter tests
      run: |
        ./ci/do_ci.sh cmake.do_not_install.test

  cmake_otprotocol_shared_libs_with_static_grpc_test:
    name: CMake test (build shared libraries with otlp-exporter and static gRPC)
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run otlp exporter tests
      run: |
        ./ci/do_ci.sh cmake.exporter.otprotocol.shared_libs.with_static_grpc.test

  plugin_test:
    name: Plugin -> CMake
    runs-on: ubuntu-latest
    # Deprecated, pending removal
    if: false
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      env:
        CC: /usr/bin/gcc-12
        CXX: /usr/bin/g++-12
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: run tests
      env:
        CC: /usr/bin/gcc-12
        CXX: /usr/bin/g++-12
      run: ./ci/do_ci.sh cmake.test_example_plugin

  bazel_test:
    name: Bazel
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_test
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.test

  bazel_test_async:
    name: Bazel with async export
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_test
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.with_async_export.test

  bazel_valgrind:
    name: Bazel valgrind
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_valgrind
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.valgrind

  bazel_noexcept:
    name: Bazel noexcept
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_noexcept
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.noexcept

  bazel_nortti:
    name: Bazel nortti
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_nortti
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.nortti

  bazel_asan:
    name: Bazel asan config
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_asan
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.asan

  bazel_ubsan:
    name: Bazel ubsan config
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_ubsan
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.ubsan

  bazel_tsan:
    name: Bazel tsan config
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_tsan
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: ./ci/do_ci.sh bazel.tsan

  bazel_osx:
    name: Bazel on MacOS
    runs-on: macos-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Install CMake
      env:
        CMAKE_VERSION: 3.31.6 # the macos runner installs CMake 4.x and is not compatible with opentracing
      run: |
        ./ci/setup_cmake_macos.sh
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /Users/runner/.cache/bazel
        key: bazel_osx
    - name: run tests
      run: ./ci/do_ci.sh bazel.macos.test

  benchmark:
    name: Benchmark
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: Mount Bazel Cache
      uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
      env:
        cache-name: bazel_cache
      with:
        path: /home/runner/.cache/bazel
        key: bazel_benchmark
    - name: setup
      run: |
        sudo ./ci/setup_ci_environment.sh
        sudo ./ci/install_bazelisk.sh
    - name: run tests
      run: |
        env BENCHMARK_DIR=/benchmark
        ./ci/do_ci.sh benchmark
    - name: Upload benchmark results
      uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
      with:
        name: benchmark_reports
        path: /home/runner/benchmark

  format:
    name: Format
    runs-on: ubuntu-24.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
    - name: setup
      run: sudo ./ci/install_format_tools.sh
    - name: run tests
      run: ./ci/do_ci.sh format

  copyright:
    name: Copyright
    runs-on: ubuntu-22.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
    - name: check copyright
      run: ./tools/check_copyright.sh

  windows:
    name: CMake -> exporter proto
    runs-on: windows-2022
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run cmake test
      run: ./ci/do_ci.ps1 cmake.test
    - name: run otprotocol test
      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.test

  windows-build-dll:
    name: CMake -> exporter proto (Build as DLL)
    runs-on: windows-2022
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run cmake test (DLL build)
      run: ./ci/do_ci.ps1 cmake.dll.test
    - name: run cmake cxx20 test (DLL build)
      run: ./ci/do_ci.ps1 cmake.dll.cxx20.test
    - name: run otprotocol test (DLL build)
      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.dll.test

  windows_with_async_export:
    name: CMake (With async export) -> exporter proto
    runs-on: windows-2022
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run cmake test
      run: ./ci/do_ci.ps1 cmake.with_async_export.test
    - name: run otprotocol test
      run: ./ci/do_ci.ps1 cmake.exporter.otprotocol.with_async_export.test

  windows_bazel:
    name: Bazel Windows
    runs-on: windows-2022
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/install_windows_bazelisk.ps1
    - name: run tests
      run: ./ci/do_ci.ps1 bazel.build

  windows_plugin_test:
    name: Plugin -> CMake Windows
    runs-on: windows-2022
    # Deprecated, pending removal
    if: false
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        ./ci/setup_windows_ci_environment.ps1
    - name: run tests
      run: ./ci/do_ci.ps1 cmake.test_example_plugin

  code_coverage:
    name: Code coverage
    runs-on: ubuntu-24.04
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      with:
        submodules: 'recursive'
    - name: setup
      run: |
        sudo -E ./ci/setup_ci_environment.sh
    - name: install dependencies
      run: |
        sudo -E ./ci/install_thirdparty.sh --install-dir /usr/local --tags-file third_party_release
    - name: run tests and generate report
      env:
        CC: /usr/bin/gcc-13
        CXX: /usr/bin/g++-13
        OTELCPP_CMAKE_BUILD_ARGS: "--parallel 2" # Limit parallelism to avoid hitting runner limits
      run: ./ci/do_ci.sh code.coverage
    - name: upload report
      uses: codecov/codecov-action@57e3a136b779b570ffcdbf80b3bdc90e7fab3de2 # v6.0.0
      with:
        files: /home/runner/build/coverage.info

  markdown-lint:
    runs-on: ubuntu-latest

    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - name: check out code
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

    - name: install markdownlint-cli
      run: sudo npm install -g markdownlint-cli@0.46.0

    - name: run markdownlint
      run: markdownlint .

  shellcheck:
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - name: check out code
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
    - name: install shellcheck
      run: sudo apt install --assume-yes shellcheck
    - name: run shellcheck
      run: find . -name \*.sh | xargs shellcheck --severity=error

  misspell:
    runs-on: ubuntu-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - name: check out code
      uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
    - name: install misspell
      run: |
        curl -L -o ./install-misspell.sh https://git.io/misspell
        sh ./install-misspell.sh
    - name: run misspell
      run: ./bin/misspell -error .

  docfx_check:
    name: DocFX check
    runs-on: windows-latest
    steps:
    - name: Harden the runner (Audit all outbound calls)
      uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
      with:
        egress-policy: audit

    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
    - name: install docfx
      run: choco install docfx -y --version=2.58.5
    - name: run ./ci/docfx.cmd
      shell: cmd
      run: ./ci/docfx.cmd

  w3c_trace_context_compliance_v1:
    name: W3C Distributed Tracing Validation V1
    runs-on: ubuntu-latest
    steps:
      - name: Harden the runner (Audit all outbound calls)
        uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
        with:
          egress-policy: audit

      - name: Checkout open-telemetry/opentelemetry-cpp
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          submodules: 'recursive'
      - name: setup
        env:
          CC: /usr/bin/gcc-12
          CXX: /usr/bin/g++-12
        run: |
          sudo -E ./ci/setup_ci_environment.sh
          sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev
      - name: run w3c trace-context test server (background)
        env:
          CXX_STANDARD: '17'
        run: |
          ./ci/do_ci.sh cmake.w3c.trace-context.build-server
          cd $HOME/build/ext/test/w3c_tracecontext_http_test_server
          ./w3c_tracecontext_http_test_server &
      - name: Checkout w3c/trace-context repo
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          repository: w3c/trace-context
          path: trace-context
      - name: install dependencies
        run: |
          sudo apt update && sudo apt install python3-pip
          sudo pip3 install aiohttp==3.11.18
      - name: run w3c trace-context test suite
        env:
          SPEC_LEVEL: 1
        run:
          |
          python ${GITHUB_WORKSPACE}/trace-context/test/test.py http://localhost:30000/test TraceContextTest AdvancedTest
          curl http://localhost:30000/stop

  w3c_trace_context_compliance_v2:
    name: W3C Distributed Tracing Validation V2
    runs-on: ubuntu-latest
    steps:
      - name: Harden the runner (Audit all outbound calls)
        uses: step-security/harden-runner@a5ad31d6a139d249332a2605b85202e8c0b78450 # v2.19.1
        with:
          egress-policy: audit

      - name: Checkout open-telemetry/opentelemetry-cpp
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          submodules: 'recursive'
      - name: setup
        env:
          CC: /usr/bin/gcc-12
          CXX: /usr/bin/g++-12
        run: |
          sudo -E ./ci/setup_ci_environment.sh
          sudo -E apt-get install -y zlib1g-dev libcurl4-openssl-dev
      - name: run w3c trace-context test server (background)
        env:
          CXX_STANDARD: '17'
        run: |
          ./ci/do_ci.sh cmake.w3c.trace-context.build-server
          cd $HOME/build/ext/test/w3c_tracecontext_http_test_server
          ./w3c_tracecontext_http_test_server &
      - name: Checkout w3c/trace-context repo
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          repository: w3c/trace-context
          path: trace-context
      - name: install dependencies
        run: |
          sudo apt update && sudo apt install python3-pip
          sudo pip3 install aiohttp==3.11.18
      - name: run w3c trace-context test suite
        env:
          SPEC_LEVEL: 2
        run:
          |
          python ${GITHUB_WORKSPACE}/trace-context/test/test.py http://localhost:30000/test TraceContext2Test
          curl http://localhost:30000/stop
