Dockerfile.build 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. # syntax=docker/dockerfile:1.4
  2. # smartbotic-automation Package Builder
  3. # Compiles the C++ binaries + WebUI bundle, then assembles a single .deb.
  4. #
  5. # Build:
  6. # docker buildx build -f packaging/Dockerfile.build \
  7. # --build-arg BASE_IMAGE=smartbotic-automation-build-base:debian13 \
  8. # --build-arg BUILD_VERSION=1.0.0 \
  9. # --target packages \
  10. # --output "type=local,dest=dist/debian13/" .
  11. ARG BASE_IMAGE=debian:trixie
  12. FROM ${BASE_IMAGE} AS builder
  13. ARG BUILD_VERSION=0.0.0
  14. ARG BUILD_DEB_REVISION=1
  15. ARG BUILD_JOBS=8
  16. ARG BUILD_GIT_COMMIT=unknown
  17. ENV DEBIAN_FRONTEND=noninteractive
  18. ENV BUILD_VERSION=${BUILD_VERSION}
  19. ENV BUILD_DEB_REVISION=${BUILD_DEB_REVISION}
  20. ENV BUILD_JOBS=${BUILD_JOBS}
  21. ENV CCACHE_DIR=/ccache
  22. ENV CCACHE_MAXSIZE=5G
  23. ENV PATH="/usr/lib/ccache:${PATH}"
  24. # Fall back to fresh dep install if the base image isn't our prebuilt one
  25. RUN if [ ! -f /etc/smartbotic-automation-build-base ]; then \
  26. apt-get update && apt-get install -y --no-install-recommends \
  27. build-essential cmake ninja-build git pkg-config ccache dpkg-dev \
  28. libssl-dev zlib1g-dev libbrotli-dev uuid-dev \
  29. protobuf-compiler libprotobuf-dev libgrpc++-dev protobuf-compiler-grpc \
  30. nlohmann-json3-dev libspdlog-dev libfmt-dev libcurl4-openssl-dev libwebsockets-dev \
  31. nodejs npm libsmartbotic-db-client-dev \
  32. && rm -rf /var/lib/apt/lists/*; \
  33. else echo "Using pre-built base: $(cat /etc/smartbotic-automation-build-base)"; fi
  34. WORKDIR /build
  35. # WebUI build (cached separately from C++)
  36. COPY webui/package.json webui/package-lock.json ./webui/
  37. RUN --mount=type=cache,target=/npm-cache,id=smartbotic-automation-npm-cache \
  38. cd webui && npm ci --cache /npm-cache
  39. COPY VERSION ./
  40. COPY webui/ ./webui/
  41. RUN cd webui && npm run build
  42. # C++ build
  43. COPY CMakeLists.txt ./
  44. COPY cmake/ ./cmake/
  45. COPY proto/ ./proto/
  46. COPY lib/ ./lib/
  47. COPY src/ ./src/
  48. COPY config/ ./config/
  49. COPY nodes/ ./nodes/
  50. COPY packaging/ ./packaging/
  51. RUN --mount=type=cache,target=/ccache,id=smartbotic-automation-ccache \
  52. cmake -B build -G Ninja \
  53. -DCMAKE_BUILD_TYPE=Release \
  54. -DCMAKE_C_COMPILER_LAUNCHER=ccache \
  55. -DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
  56. && cmake --build build --parallel ${BUILD_JOBS} \
  57. && (ccache --show-stats || true)
  58. # ----- Package assembly stage -----
  59. FROM builder AS packager
  60. RUN mkdir -p /packages
  61. RUN chmod +x /build/packaging/scripts/create-deb.sh \
  62. && OUTPUT_DIR=/packages /build/packaging/scripts/create-deb.sh
  63. # ----- Final export stage -----
  64. FROM scratch AS packages
  65. COPY --from=packager /packages/*.deb /