Dockerfile.build 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # syntax=docker/dockerfile:1.4
  2. # Smartbotic Database Package Builder — Debian 13 (trixie)
  3. # Produces 4 .deb packages: server, libclient, libclient-dev, cli
  4. #
  5. # Usage:
  6. # docker buildx build -f packaging/Dockerfile.build \
  7. # --build-arg BASE_IMAGE=smartbotic-db-build-base:debian13 \
  8. # --target packages --output "type=local,dest=dist/" .
  9. ARG BASE_IMAGE=debian:trixie
  10. FROM ${BASE_IMAGE} AS builder
  11. ARG BUILD_VERSION=0.0.0
  12. ARG BUILD_DEB_REVISION=1
  13. ARG BUILD_JOBS=16
  14. ARG BUILD_GIT_COMMIT=unknown
  15. # v2.8.0 — promote it to an ENV so the CMake build can bake it into the binary.
  16. # It was declared here since v2.4 and passed by build.sh, but never promoted, so
  17. # nothing consumed it and packages recorded no provenance.
  18. ENV BUILD_GIT_COMMIT=${BUILD_GIT_COMMIT}
  19. ENV DEBIAN_FRONTEND=noninteractive
  20. ENV BUILD_VERSION=${BUILD_VERSION}
  21. ENV BUILD_DEB_REVISION=${BUILD_DEB_REVISION}
  22. ENV BUILD_JOBS=${BUILD_JOBS}
  23. ENV CCACHE_DIR=/ccache
  24. ENV CCACHE_MAXSIZE=2G
  25. ENV CCACHE_COMPRESS=1
  26. ENV CCACHE_COMPRESSLEVEL=6
  27. ENV PATH="/usr/lib/ccache:${PATH}"
  28. # Install deps if not using pre-built base
  29. RUN if [ ! -f /etc/smartbotic-db-build-base ]; then \
  30. apt-get update && apt-get install -y --no-install-recommends \
  31. build-essential cmake ninja-build git pkg-config ca-certificates ccache \
  32. libssl-dev liblz4-dev \
  33. protobuf-compiler libprotobuf-dev libgrpc++-dev protobuf-compiler-grpc \
  34. nlohmann-json3-dev libspdlog-dev libfmt-dev dpkg-dev \
  35. && rm -rf /var/lib/apt/lists/*; \
  36. else echo "Using pre-built base: $(cat /etc/smartbotic-db-build-base)"; fi
  37. WORKDIR /build
  38. COPY CMakeLists.txt VERSION ./
  39. COPY proto/ ./proto/
  40. COPY client/ ./client/
  41. COPY service/ ./service/
  42. COPY cli/ ./cli/
  43. COPY tests/ ./tests/
  44. COPY packaging/ ./packaging/
  45. # Build with shared libs + Release
  46. RUN --mount=type=cache,target=/ccache,id=smartbotic-db-ccache \
  47. cmake -B build -G Ninja \
  48. -DCMAKE_BUILD_TYPE=Release \
  49. -DCMAKE_C_COMPILER_LAUNCHER=ccache \
  50. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  51. -DSMARTBOTIC_DB_BUILD_SERVICE=ON \
  52. -DSMARTBOTIC_DB_BUILD_CLIENT=ON \
  53. -DSMARTBOTIC_DB_BUILD_CLI=ON \
  54. -DSMARTBOTIC_DB_BUILD_TESTS=ON \
  55. -DBUILD_SHARED_LIBS=ON \
  56. && cmake --build build --parallel ${BUILD_JOBS} \
  57. && ccache --show-stats || true
  58. # Run tests
  59. RUN cd build && LD_LIBRARY_PATH=./client:$LD_LIBRARY_PATH ./tests/test_vector_storage
  60. # Package
  61. FROM builder AS packager
  62. RUN mkdir -p /packages
  63. ENV OUTPUT_DIR=/packages
  64. RUN chmod +x /build/packaging/deb/create-debs.sh && \
  65. /build/packaging/deb/create-debs.sh
  66. # Output
  67. FROM scratch AS packages
  68. COPY --from=packager /packages/*.deb /