Skip to content

Commit aed054a

Browse files
[mq] [skip ddci] working branch - merge 793b569 on top of main at 57916f4
{"baseBranch":"main","baseCommit":"57916f4cdf644682eb573c8d06372f401d963539","createdAt":"2026-06-10T15:18:42.588164Z","headSha":"793b56921a1fcb1690e0fe39ba5b1a9d73bbe8b3","id":"51361c71-4591-4ffb-9859-afbe7eae9f0b","priority":"200","pullRequestNumber":"587","queuedAt":"2026-06-10T15:18:42.585802Z","status":"STATUS_QUEUED"}
2 parents 6b194b5 + 793b569 commit aed054a

5 files changed

Lines changed: 136 additions & 0 deletions

File tree

.gitlab-ci.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ stages:
2828
- integration-test
2929
- reliability
3030
- benchmarks
31+
- fuzz
3132
- notify
3233

3334
# Detects newer images in registry and creates GitHub PR with updates
@@ -162,3 +163,4 @@ include:
162163
- local: .gitlab/reliability/.gitlab-ci.yml
163164
- local: .gitlab/dd-trace-integration/.gitlab-ci.yml
164165
- local: .gitlab/sanitizer-tests/.gitlab-ci.yml
166+
- local: .gitlab/fuzzing/.gitlab-ci.yml

.gitlab/fuzzing/.gitlab-ci.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
variables:
2+
FUZZ_IMAGE: registry.ddbuild.io/java-profiler-fuzz
3+
FUZZYDOG_VERSION: "0.28.0"
4+
5+
fuzz_infra:
6+
needs: []
7+
extends: .retry-config
8+
image: registry.ddbuild.io/images/docker:27.3.1
9+
tags: ["arch:amd64"]
10+
stage: fuzz
11+
timeout: 30m
12+
allow_failure: true
13+
id_tokens:
14+
DDSIGN_ID_TOKEN:
15+
aud: image-integrity
16+
rules:
17+
- if: $NIGHTLY_BUILD == "true"
18+
- when: manual
19+
before_script:
20+
- apt-get update -qq && apt-get install -y -qq curl unzip jq
21+
- >-
22+
curl -fsSL "https://binaries.ddbuild.io/fuzzing/fuzzydog/${FUZZYDOG_VERSION}/fuzzydog-tar.tar.gz"
23+
| tar -xz -C /usr/local/bin fuzzydog-linux-amd64 &&
24+
mv /usr/local/bin/fuzzydog-linux-amd64 /usr/local/bin/fuzzydog
25+
- >-
26+
curl -fsSL "https://releases.hashicorp.com/vault/1.21.1/vault_1.21.1_linux_amd64.zip"
27+
-o /tmp/vault.zip &&
28+
unzip -o /tmp/vault.zip -d /usr/local/bin vault &&
29+
rm /tmp/vault.zip
30+
script:
31+
- .gitlab/scripts/fuzz_infra.sh

.gitlab/scripts/fuzz_infra.sh

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
FUZZ_IMAGE="${FUZZ_IMAGE:-registry.ddbuild.io/java-profiler-fuzz}"
5+
GIT_SHA="${CI_COMMIT_SHORT_SHA:-$(git rev-parse --short HEAD)}"
6+
7+
export FUZZYDOG_AUTH_TOKEN
8+
FUZZYDOG_AUTH_TOKEN=$(vault read -field=token identity/oidc/token/security-fuzzing-platform)
9+
10+
# Build and push the compiled image (all fuzz binaries + fuzzydog)
11+
docker buildx build \
12+
--target build \
13+
-f docker/Dockerfile.fuzz \
14+
--build-arg "FUZZYDOG_VERSION=${FUZZYDOG_VERSION}" \
15+
-t "${FUZZ_IMAGE}:${GIT_SHA}" \
16+
--push \
17+
--metadata-file compiled-metadata.json \
18+
.
19+
20+
COMPILED_DIGEST=$(jq -r '."containerimage.digest"' compiled-metadata.json)
21+
22+
# Extract binary list via the manifest target
23+
docker buildx build \
24+
--target manifest \
25+
-f docker/Dockerfile.fuzz \
26+
--build-arg "FUZZYDOG_VERSION=${FUZZYDOG_VERSION}" \
27+
--output "type=local,dest=manifest-out" \
28+
.
29+
30+
# For each binary: build thin per-binary image, sign, replicate, register
31+
while IFS= read -r binary; do
32+
[ -z "${binary}" ] && continue
33+
# Normalize to k8s-safe label: camelCase -> lowercase-hyphenated, prefixed with repo name
34+
normalized=$(printf '%s' "${binary}" | sed 's/[A-Z]/-&/g' | tr '[:upper:]' '[:lower:]' | sed 's/^-//')
35+
fuzz_app="java-profiler-${normalized}"
36+
IMAGE_REF="${FUZZ_IMAGE}:${GIT_SHA}-${normalized}"
37+
38+
printf 'FROM %s@%s\nENV FUZZ_APP=%s\nENV FUZZ_BUILD_ID=%s\nRUN ln -sf /fuzzer/builds/%s /fuzzer/builds/%s\n' \
39+
"${FUZZ_IMAGE}" "${COMPILED_DIGEST}" "${fuzz_app}" "${GIT_SHA}" "${binary}" "${GIT_SHA}" \
40+
| docker buildx build - \
41+
-t "${IMAGE_REF}" \
42+
--push \
43+
--metadata-file "meta-${binary}.json"
44+
45+
ddsign sign "${IMAGE_REF}" --docker-metadata-file "meta-${binary}.json"
46+
ddsign replicate --to us1.ddbuild.io \
47+
"${FUZZ_IMAGE}@$(jq -r '."containerimage.digest"' "meta-${binary}.json")"
48+
49+
fuzzydog fuzzer create "${fuzz_app}" \
50+
--image "${IMAGE_REF}" \
51+
--version "${GIT_SHA}" \
52+
--type libfuzzer \
53+
--team profiling \
54+
--slack-channel profiling-java \
55+
--repository-url https://github.com/DataDog/java-profiler
56+
done < manifest-out/fuzz_binaries.txt

build-logic/conventions/src/main/kotlin/com/datadoghq/native/fuzz/FuzzTargetsPlugin.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,13 @@ class FuzzTargetsPlugin : Plugin<Project> {
7373
}
7474
}
7575

76+
// Build-only aggregate: compiles and links all targets without running them
77+
val buildFuzz = project.tasks.register("buildFuzz") {
78+
onlyIf { hasFuzzer && !project.hasProperty("skip-tests") && !project.hasProperty("skip-native") && !project.hasProperty("skip-fuzz") }
79+
group = "build"
80+
description = "Build all fuzz targets without running them"
81+
}
82+
7683
if (!hasFuzzer) {
7784
val msg = if (PlatformUtils.currentPlatform == Platform.MACOS) {
7885
"WARNING: libFuzzer not available on macOS — skipping fuzz targets. " +
@@ -168,6 +175,7 @@ class FuzzTargetsPlugin : Plugin<Project> {
168175
}
169176

170177
fuzzAll.configure { dependsOn(executeTask) }
178+
buildFuzz.configure { dependsOn(linkTask) }
171179
}
172180
}
173181

docker/Dockerfile.fuzz

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
ARG FUZZYDOG_VERSION=0.28.0
2+
3+
FROM registry.ddbuild.io/images/base/gbi-ubuntu_2404:release AS build
4+
5+
USER root
6+
7+
ARG FUZZYDOG_VERSION
8+
9+
ENV DEBIAN_FRONTEND=noninteractive
10+
RUN apt-get update -qq && apt-get install -y -qq \
11+
clang llvm curl git openjdk-21-jdk \
12+
&& rm -rf /var/lib/apt/lists/*
13+
14+
ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64
15+
ENV PATH=$JAVA_HOME/bin:$PATH
16+
17+
WORKDIR /src
18+
COPY . .
19+
20+
RUN ./gradlew :ddprof-lib:fuzz:buildFuzz --no-daemon
21+
22+
RUN mkdir -p /fuzzer/builds && \
23+
find ddprof-lib/fuzz/build/bin/fuzz -maxdepth 2 -type f -executable \
24+
-exec cp {} /fuzzer/builds/ \; && \
25+
ls /fuzzer/builds/ > /fuzz_binaries.txt
26+
27+
RUN curl -fsSL "https://binaries.ddbuild.io/fuzzing/fuzzydog/${FUZZYDOG_VERSION}/fuzzydog-tar.tar.gz" \
28+
| tar -xz -C /usr/local/bin fuzzydog-linux-amd64 && \
29+
mv /usr/local/bin/fuzzydog-linux-amd64 /usr/local/bin/fuzzydog
30+
31+
CMD fuzzydog fuzzer run "$FUZZ_APP" "$FUZZ_BUILD_ID" \
32+
--type libfuzzer \
33+
--team profiling \
34+
--build-path /fuzzer/builds/ \
35+
--skip-dl-build \
36+
--repository-url https://github.com/DataDog/java-profiler
37+
38+
FROM scratch AS manifest
39+
COPY --from=build /fuzz_binaries.txt /fuzz_binaries.txt

0 commit comments

Comments
 (0)