content: # Copyright 2021 Google LLC
  #
  # Licensed under the Apache License, Version 2.0 (the "License");
  # you may not use this file except in compliance with the License.
  # You may obtain a copy of the License at
  #
  #     https://www.apache.org/licenses/LICENSE-2.0
  #
  # Unless required by applicable law or agreed to in writing, software
  # distributed under the License is distributed on an "AS IS" BASIS,
  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  # See the License for the specific language governing permissions and
  # limitations under the License.
  
  FROM ubuntu:20.04
  
  ENV DEBIAN_FRONTEND=noninteractive
  RUN apt-get update && \
      apt-get --no-install-recommends install -y \
          automake \
          build-essential \
          clang \
          cmake \
          curl \
          gawk \
          git \
          gcc \
          g++ \
          cmake \
          libcurl4-openssl-dev \
          libssl-dev \
          libtool \
          lsb-release \
          make \
          ninja-build \
          patch \
          pkg-config \
          python3 \
          python3-dev \
          python3-pip \
          tar \
          unzip \
          zip \
          wget \
          zlib1g-dev \
          apt-utils \
          ca-certificates \
          apt-transport-https
  # Install Python packages used in the integration tests.
  RUN update-alternatives --install /usr/bin/python python $(which python3) 10
  RUN pip3 install setuptools wheel
  # The Cloud Pub/Sub emulator needs Java :shrug:
  RUN apt update && apt install -y openjdk-13-jre
  
  # Install all the direct (and indirect) dependencies for google-cloud-cpp.
  # Use a different directory for each build, and remove the downloaded
  # files and any temporary artifacts after a successful build to keep the
  # image smaller (and with fewer layers)
  
  WORKDIR /var/tmp/build/abseil-cpp
  RUN curl -fsSL https://github.com/abseil/abseil-cpp/archive/20250127.1.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
        -DCMAKE_BUILD_TYPE="Release" \
        -DABSL_BUILD_TESTING=OFF \
        -DABSL_PROPAGATE_CXX_STD=ON \
        -DBUILD_SHARED_LIBS=yes \
        -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/googletest
  RUN curl -fsSL https://github.com/google/googletest/archive/v1.16.0.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
        -DCMAKE_BUILD_TYPE="Release" \
        -DBUILD_SHARED_LIBS=yes \
        -S . -B cmake-out -GNinja  && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/benchmark
  RUN curl -fsSL https://github.com/google/benchmark/archive/v1.9.2.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
          -DCMAKE_BUILD_TYPE="Release" \
          -DBUILD_SHARED_LIBS=yes \
          -DBENCHMARK_ENABLE_TESTING=OFF \
          -S . -B cmake-out -GNinja  && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/crc32c
  RUN curl -fsSL https://github.com/google/crc32c/archive/1.1.2.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
        -DCMAKE_BUILD_TYPE="Release" \
        -DBUILD_SHARED_LIBS=yes \
        -DCRC32C_BUILD_TESTS=OFF \
        -DCRC32C_BUILD_BENCHMARKS=OFF \
        -DCRC32C_USE_GLOG=OFF \
        -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/nlohmann-json
  RUN curl -fsSL https://github.com/nlohmann/json/archive/v3.11.3.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
        -DCMAKE_BUILD_TYPE="Release" \
        -DBUILD_SHARED_LIBS=yes \
        -DBUILD_TESTING=OFF \
        -DJSON_BuildTests=OFF \
        -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/protobuf
  RUN curl -fsSL https://github.com/protocolbuffers/protobuf/archive/v29.4.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
          -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_SHARED_LIBS=yes \
          -Dprotobuf_BUILD_TESTS=OFF \
          -Dprotobuf_ABSL_PROVIDER=package \
          -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/c-ares
  RUN curl -fsSL https://github.com/c-ares/c-ares/archive/refs/tags/cares-1_17_1.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
          -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_SHARED_LIBS=yes \
          -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/re2
  RUN curl -fsSL https://github.com/google/re2/archive/2025-07-22.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_SHARED_LIBS=ON \
          -DRE2_BUILD_TESTING=OFF \
          -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/
  RUN curl -fsSL https://github.com/open-telemetry/opentelemetry-cpp/archive/v1.20.0.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
          -DCMAKE_CXX_STANDARD=14 \
          -DCMAKE_BUILD_TYPE=Release \
          -DCMAKE_POSITION_INDEPENDENT_CODE=TRUE \
          -DBUILD_SHARED_LIBS=ON \
          -DWITH_EXAMPLES=OFF \
          -DWITH_STL=CXX14 \
          -DWITH_ABSEIL=ON \
          -DBUILD_TESTING=OFF \
          -DOPENTELEMETRY_INSTALL=ON \
          -DOPENTELEMETRY_ABI_VERSION_NO=2 \
          -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && cd /var/tmp && rm -fr build
  
  WORKDIR /var/tmp/build/grpc
  RUN curl -fsSL https://github.com/grpc/grpc/archive/v1.69.0.tar.gz | \
      tar -xzf - --strip-components=1 && \
      cmake \
          -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_SHARED_LIBS=ON \
          -DgRPC_INSTALL=ON \
          -DgRPC_BUILD_TESTS=OFF \
          -DgRPC_ABSL_PROVIDER=package \
          -DgRPC_CARES_PROVIDER=package \
          -DgRPC_PROTOBUF_PROVIDER=package \
          -DgRPC_RE2_PROVIDER=package \
          -DgRPC_SSL_PROVIDER=package \
          -DgRPC_ZLIB_PROVIDER=package \
          -DgRPC_OPENTELEMETRY_PROVIDER=package \
          -DgRPC_BUILD_GRPCPP_OTEL_PLUGIN=ON \
          -S . -B cmake-out -GNinja && \
      cmake --build cmake-out --target install && \
      ldconfig && \
      cd /var/tmp && rm -fr build
  
  # Install the Cloud SDK and some of the emulators. We use the emulators to run
  # integration tests for the client libraries.
  COPY . /var/tmp/ci
  WORKDIR /var/tmp/downloads
  RUN /var/tmp/ci/install-cloud-sdk.sh
  ENV CLOUD_SDK_LOCATION=/usr/local/google-cloud-sdk
  ENV PATH=${CLOUD_SDK_LOCATION}/bin:${PATH}
  
  WORKDIR /var/tmp/sccache
  RUN curl -fsSL https://github.com/mozilla/sccache/releases/download/v0.10.0/sccache-v0.10.0-x86_64-unknown-linux-musl.tar.gz | \
      tar -zxf - --strip-components=1 && \
      mkdir -p /usr/local/bin && \
      mv sccache /usr/local/bin/sccache && \
      chmod +x /usr/local/bin/sccache
  
  # Update the ld.conf cache in case any libraries were installed in /usr/local/lib*
  RUN ldconfig /usr/local/lib*
  