Skip to content

Commit 6e0faa4

Browse files
feat(ci): add GitLab CI configuration for building mod_datadog (#35)
Add GitLab CI pipeline to build mod_datadog.so with RUM support for amd64 and arm64 architectures. Includes musl toolchain build from scratch using LLVM 17.0.6. --------- Co-authored-by: Xavier Lamorlette <xavier.lamorlette@datadoghq.com>
1 parent 7745646 commit 6e0faa4

File tree

7 files changed

+187
-3
lines changed

7 files changed

+187
-3
lines changed

.gitlab-ci.yml

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
variables:
2+
DOCKER_REGISTRY: registry.ddbuild.io
3+
CI_DOCKER_IMAGE_BASE: $DOCKER_REGISTRY/ci/httpd-datadog
4+
GIT_SUBMODULE_STRATEGY: recursive
5+
GIT_SUBMODULE_DEPTH: 1
6+
GIT_CONFIG_COUNT: 1
7+
GIT_CONFIG_KEY_0: url.https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.ddbuild.io/DataDog/.insteadOf
8+
GIT_CONFIG_VALUE_0: https://github.com/DataDog/
9+
10+
stages:
11+
- ci-image
12+
- build
13+
14+
build-ci-image:
15+
stage: ci-image
16+
allow_failure: true
17+
tags: ["arch:$ARCH"]
18+
image: $DOCKER_REGISTRY/docker:20.10.13
19+
parallel:
20+
matrix:
21+
- ARCH: amd64
22+
TOOLCHAIN_ARCH: x86_64
23+
- ARCH: arm64
24+
TOOLCHAIN_ARCH: aarch64
25+
script:
26+
- HASH=$(sha256sum .gitlab/Dockerfile | cut -d ' ' -f 1)
27+
- echo "DOCKERFILE_HASH=$HASH" >> docker.env
28+
- IMAGE_TAG="$CI_DOCKER_IMAGE_BASE/$ARCH:$HASH"
29+
- |
30+
if docker buildx imagetools inspect "$IMAGE_TAG" > /dev/null 2>&1; then
31+
echo "Image $IMAGE_TAG already exists. Skipping build."
32+
exit 0
33+
fi
34+
- >
35+
docker buildx build
36+
--tag $IMAGE_TAG
37+
--platform linux/$ARCH
38+
--build-arg ARCH=$TOOLCHAIN_ARCH
39+
--push
40+
--file .gitlab/Dockerfile
41+
.
42+
artifacts:
43+
reports:
44+
dotenv: docker.env
45+
46+
build:
47+
stage: build
48+
needs: [build-ci-image]
49+
parallel:
50+
matrix:
51+
- ARCH: amd64
52+
TOOLCHAIN_ARCH: x86_64
53+
- ARCH: arm64
54+
TOOLCHAIN_ARCH: aarch64
55+
image: $CI_DOCKER_IMAGE_BASE/$ARCH:$DOCKERFILE_HASH
56+
tags: ["arch:$ARCH"]
57+
script:
58+
- git config --global --add safe.directory $PWD
59+
- >
60+
cmake --preset=ci-release
61+
-DHTTPD_DATADOG_ENABLE_RUM=ON
62+
-DCMAKE_TOOLCHAIN_FILE=/sysroot/${TOOLCHAIN_ARCH}-none-linux-musl/Toolchain.cmake
63+
-B build .
64+
- cmake --build build -j --verbose
65+
- cmake --install build --prefix dist
66+
- mkdir -p artifacts/$ARCH
67+
- cp dist/lib/mod_datadog.so artifacts/$ARCH/
68+
- cp dist/lib/mod_datadog.so.debug artifacts/$ARCH/ || true
69+
artifacts:
70+
paths:
71+
- artifacts/$ARCH/mod_datadog.so
72+
- artifacts/$ARCH/mod_datadog.so.debug

.gitlab/Dockerfile

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# Build image for httpd-datadog GitLab CI.
2+
#
3+
# It contains:
4+
# - LLVM 17 toolchain with musl sysroot for cross-compilation
5+
# - httpd 2.4 source code
6+
# - Tools necessary to build httpd and mod_datadog
7+
# - Rust toolchain for RUM (inject-browser-sdk requires Rust 1.73+)
8+
#
9+
# Toolchain files are sourced from deps/nginx-datadog/build_env/
10+
#
11+
FROM alpine:3.20.3 AS sysroot
12+
13+
ARG LLVM_VERSION=17.0.6
14+
ARG ARCH
15+
16+
COPY deps/nginx-datadog/build_env/CHECKSUMS /CHECKSUMS
17+
18+
RUN echo "Building LLVM ${LLVM_VERSION} on ${ARCH}"
19+
20+
RUN apk --no-cache add alpine-sdk coreutils sudo bash samurai python3 linux-headers \
21+
compiler-rt clang llvm lld wget cmake make binutils musl-dev git patchelf xz lit
22+
RUN wget https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz && \
23+
grep -F llvm-project-${LLVM_VERSION}.src.tar.xz /CHECKSUMS | sha512sum --check && \
24+
tar -xvf llvm-project-${LLVM_VERSION}.src.tar.xz
25+
26+
COPY deps/nginx-datadog/build_env/locale.h.diff /locale.h.diff
27+
RUN cd /usr/include && patch -p0 < /locale.h.diff
28+
29+
COPY deps/nginx-datadog/build_env/alltypes.h.diff /alltypes.h.diff
30+
RUN cd /usr/include && patch -p0 < /alltypes.h.diff
31+
32+
RUN cd llvm-project-${LLVM_VERSION}.src && mkdir -p build && cd build && \
33+
cmake -G Ninja \
34+
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
35+
-DCMAKE_INSTALL_PREFIX=/usr \
36+
-DCMAKE_C_COMPILER=clang \
37+
-DCMAKE_C_FLAGS="-fno-omit-frame-pointer -D_LIBCPP_HAS_NO_C11_ALIGNED_ALLOC=1" \
38+
-DCMAKE_CXX_COMPILER=clang++ \
39+
-DCMAKE_CXX_FLAGS="-fno-omit-frame-pointer -D_LIBCPP_HAS_NO_C11_ALIGNED_ALLOC=1" \
40+
-DCMAKE_POSITION_INDEPENDENT_CODE=ON \
41+
-DLIBUNWIND_ENABLE_SHARED=OFF \
42+
-DLIBUNWIND_ENABLE_STATIC=ON \
43+
-DLIBUNWIND_USE_COMPILER_RT=ON \
44+
-DLIBCXXABI_ENABLE_SHARED=OFF \
45+
-DLIBCXXABI_USE_LLVM_UNWINDER=ON \
46+
-DLIBCXXABI_ENABLE_STATIC_UNWINDER=ON \
47+
-DLIBCXXABI_USE_COMPILER_RT=ON \
48+
-DLIBCXX_ENABLE_SHARED=OFF \
49+
-DLIBCXX_HAS_MUSL_LIBC=ON \
50+
-DLIBCXX_USE_COMPILER_RT=ON \
51+
-DLIBCXX_ENABLE_STATIC_ABI_LIBRARY=ON \
52+
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
53+
-DLLVM_EXTERNAL_LIT=/usr/bin/lit ../runtimes && \
54+
ninja -v install-unwind install-cxxabi install-cxx
55+
56+
RUN cd /usr/lib && ln -s gcc/*/*/ resource_dir
57+
RUN cd /usr/lib && ln -s clang/${LLVM_VERSION%%.*}/lib/linux/libclang_rt.builtins-*.a libclang_rt.builtins.a
58+
59+
RUN rm -rf /llvm-project-${LLVM_VERSION}.src
60+
RUN rm -f llvm-project-${LLVM_VERSION}.src.tar.xz
61+
62+
RUN mkdir -p /sysroot/${ARCH}-none-linux-musl/usr
63+
RUN ln -s /usr/lib /sysroot/${ARCH}-none-linux-musl/usr/
64+
RUN ln -s /usr/include /sysroot/${ARCH}-none-linux-musl/usr/
65+
RUN ln -s /lib /sysroot/${ARCH}-none-linux-musl/
66+
RUN ln -s /usr/lib/llvm${LLVM_VERSION%%.*}/lib/clang/${LLVM_VERSION%%.*}/lib /sysroot/${ARCH}-none-linux-musl/usr/lib/resource_dir/lib
67+
68+
COPY deps/nginx-datadog/build_env/Toolchain.cmake.${ARCH} /sysroot/${ARCH}-none-linux-musl/Toolchain.cmake
69+
70+
# see https://github.com/llvm/llvm-project/issues/60572
71+
RUN mv /usr/lib/gcc/${ARCH}-alpine-linux-musl/13.2.1/include/stdatomic.h /usr/lib/gcc/${ARCH}-alpine-linux-musl/13.2.1/include/stdatomic.h_
72+
RUN cp /usr/lib/llvm${LLVM_VERSION%%.*}/lib/clang/${LLVM_VERSION%%.*}/include/stdatomic.h /usr/lib/gcc/${ARCH}-alpine-linux-musl/13.2.1/include/stdatomic.h
73+
74+
COPY deps/nginx-datadog/build_env/glibc_compat.c /sysroot/
75+
RUN clang --sysroot /sysroot/${ARCH}-none-linux-musl/ -fpie -O2 -fno-omit-frame-pointer \
76+
-ggdb3 -c /sysroot/glibc_compat.c -o /tmp/glibc_compat.o && \
77+
ar rcs /sysroot/${ARCH}-none-linux-musl/usr/lib/libglibc_compat.a /tmp/glibc_compat.o && \
78+
rm /tmp/glibc_compat.o
79+
80+
81+
# Install dependencies for httpd
82+
RUN apk add --no-cache expat expat-dev autoconf libtool py-pip gpg gpg-agent pcre-dev pcre2-dev
83+
84+
# Install Rust toolchain
85+
RUN apk add --no-cache curl
86+
RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -yq --default-toolchain 1.73.0 \
87+
&& ln -s ~/.cargo/bin/cargo /usr/bin/cargo
88+
89+
RUN cargo install --locked cbindgen --version 0.26.0 \
90+
&& ln -s ~/.cargo/bin/cbindgen /usr/local/bin/cbindgen
91+
92+
# Setup httpd 2.4 source
93+
COPY scripts/setup-httpd.py setup-httpd.py
94+
RUN python3 ./setup-httpd.py -o httpd 2.4.58 \
95+
&& cd httpd \
96+
&& ./configure --with-included-apr --prefix=$(pwd)/httpd-build --enable-mpms-shared="all" \
97+
&& make -j \
98+
&& make -j install

.gitmodules

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
[submodule "deps/dd-trace-cpp"]
22
path = deps/dd-trace-cpp
33
url = ../dd-trace-cpp.git
4+
[submodule "deps/inject-browser-sdk"]
5+
path = deps/inject-browser-sdk
6+
url = ../httpd-datadog.git
7+
branch = mirror-inject-browser-sdk
8+
[submodule "deps/nginx-datadog"]
9+
path = deps/nginx-datadog
10+
url = ../httpd-datadog.git
11+
branch = mirror-nginx-datadog

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
# TODO
2-
# - versioning
2+
# - versioning
33
# - toolchain (msvc, llvm, gcc)
44
cmake_minimum_required(VERSION 3.12)
55

6-
project(httpd-datadog VERSION 1.3.0)
6+
project(httpd-datadog VERSION 1.0.4)
77

88
set(CMAKE_CXX_STANDARD 17)
99
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

deps/CMakeLists.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
add_subdirectory(dd-trace-cpp)
22

33
if (HTTPD_DATADOG_ENABLE_RUM)
4-
corrosion_import_crate(MANIFEST_PATH inject-browser-sdk/Cargo.toml)
4+
corrosion_import_crate(
5+
MANIFEST_PATH inject-browser-sdk/Cargo.toml
6+
CRATES inject-browser-sdk-ffi
7+
CRATE_TYPES staticlib
8+
)
59

610
corrosion_experimental_cbindgen(
711
TARGET inject_browser_sdk_ffi

deps/inject-browser-sdk

Submodule inject-browser-sdk added at d6f9596

deps/nginx-datadog

Submodule nginx-datadog added at b5bbb8a

0 commit comments

Comments
 (0)