-
Notifications
You must be signed in to change notification settings - Fork 19
484 lines (468 loc) · 20.3 KB
/
test.yml
File metadata and controls
484 lines (468 loc) · 20.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
name: Test
on: [push]
env:
CARGO_TERM_COLOR: always
RUST_VERSION: 1.84.1
jobs:
test:
name: "cargo test --workspace #${{ matrix.platform }} ${{ matrix.rust_version }}"
runs-on: ${{ matrix.platform }}
permissions:
checks: write
contents: read
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: 0
strategy:
matrix:
platform: [windows-latest, ubuntu-latest, macos-15]
rust_version: [""]
include:
- platform: "ubuntu-latest"
rust_version: "${RUST_VERSION}"
fail-fast: false
steps:
- name: Free Disk Space (Ubuntu only)
if: runner.os == 'Linux' && matrix.platform == 'ubuntu-latest'
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # 1.3.1
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: false
swap-storage: true
# Building (and testing) libdd-otel-thread-ctx-ffi requires a custom
# linker step, which requires lld (v19+) to be available.
- name: Install LLD
if: runner.os == 'Linux'
shell: bash
run: |
set -euxo pipefail
sudo apt-get install -y lld-20
sudo ln -s /usr/bin/ld.lld-20 /usr/bin/ld.lld
sudo chmod 777 /usr/bin/ld.lld
- name: Checkout sources
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Install Rust ${{ matrix.rust_version }}
if: matrix.rust_version != ''
run: rustup set profile minimal && rustup install ${{ matrix.rust_version }} && rustup default ${{ matrix.rust_version }}
- id: rust-version
# On Windows run happens in a PowerShell, so start bash explicitly
run: bash -c 'echo "version=$(rustc --version)" >> $GITHUB_OUTPUT'
- name: Install cargo nextest
uses: taiki-e/install-action@2c41309d51ede152b6f2ee6bf3b71e6dc9a8b7df # 2.49.27
with:
tool: nextest@0.9.96
- name: Cache [rust]
uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # 2.8.1
with:
cache-targets: true # cache build artifacts
cache-bin: true # cache the ~/.cargo/bin directory
- name: "Remove nextest CI report"
shell: bash
run: rm -rf target/nextest/ci/junit.xml
- name: "[${{ steps.rust-version.outputs.version}}] cargo build --workspace --exclude builder --verbose"
shell: bash
run: cargo build --workspace --exclude builder --verbose
- name: "[${{ steps.rust-version.outputs.version}}] cargo nextest run --workspace --features libdd-crashtracker/generate-unit-test-files --exclude builder --profile ci --verbose -E '!test(tracing_integration_tests::)'"
shell: bash
# Run doc tests with cargo test and run tests with nextest and generate junit.xml
run: cargo test --workspace --features libdd-crashtracker/generate-unit-test-files --exclude builder --doc --verbose && cargo nextest run --workspace --features libdd-crashtracker/generate-unit-test-files --exclude builder --profile ci --verbose -E '!test(tracing_integration_tests::)'
env:
RUST_BACKTRACE: full
- name: "[${{ steps.rust-version.outputs.version}}] Tracing integration tests: cargo nextest run --workspace --features libdd-crashtracker/generate-unit-test-files --exclude builder --profile ci --test-threads=1 --verbose -E 'test(tracing_integration_tests::)'"
if: runner.os == 'Linux'
shell: bash
run: cargo nextest run --workspace --features libdd-crashtracker/generate-unit-test-files --exclude builder --profile ci --test-threads=1 --verbose -E 'test(tracing_integration_tests::)'
env:
RUST_BACKTRACE: full
- name: "[${{ steps.rust-version.outputs.version}}] cargo nextest run -p libdd-http-client (hyper-backend)"
shell: bash
run: cargo nextest run -p libdd-http-client --no-default-features --features hyper-backend,https --profile ci --verbose
env:
RUST_BACKTRACE: full
- name: "[${{ steps.rust-version.outputs.version}}] RUSTFLAGS=\"-C prefer-dynamic\" cargo nextest run --package test_spawn_from_lib --features prefer-dynamic -E '!test(tracing_integration_tests::)'"
shell: bash
run: cargo nextest run --package test_spawn_from_lib --features prefer-dynamic -E '!test(tracing_integration_tests::)'
env:
RUSTFLAGS: "-C prefer-dynamic"
RUST_BACKTRACE: full
- name: Add file attributes to JUnit XML
if: success() || failure()
shell: bash
run: cargo run --bin add_junit_file_attributes -- target/nextest/ci/junit.xml
- name: Report Test Results
if: success() || failure()
uses: mikepenz/action-junit-report@db71d41eb79864e25ab0337e395c352e84523afe # 4.3.1
with:
report_paths: "target/nextest/ci/junit.xml"
check_name: "[${{ matrix.platform }}:${{ matrix.rust_version }}] test report"
include_passed: true
- name: Upload test results to Datadog
if: success() || failure()
shell: bash
run: |
# Download datadog-ci binary
if [ "${{ runner.os }}" == "Linux" ]; then
URL="https://github.com/DataDog/datadog-ci/releases/download/v4.2.2/datadog-ci_linux-x64"
OUTPUT="datadog-ci"
CHECKSUM_CMD="sha256sum"
EXPECTED_CHECKSUM="3e1e9649d15d3feacced89ec90de66151046a58c7844217e4112362ad8dbf8d1"
elif [ "${{ runner.os }}" == "Windows" ]; then
URL="https://github.com/DataDog/datadog-ci/releases/download/v4.2.2/datadog-ci_win-x64"
OUTPUT="datadog-ci.exe"
CHECKSUM_CMD="sha256sum"
EXPECTED_CHECKSUM="13313279cb884fe098e2f80ca21d23e67b78a090a12e891e8e35be653ee2bbd0"
elif [ "${{ runner.os }}" == "macOS" ]; then
URL="https://github.com/DataDog/datadog-ci/releases/download/v4.2.2/datadog-ci_darwin-x64"
OUTPUT="datadog-ci"
CHECKSUM_CMD="shasum -a 256"
EXPECTED_CHECKSUM="071a6140b17438b3f9dd6c65da48b48ea03fc310034fa624ce874fdb6c325da4"
fi
echo "Downloading datadog-ci from $URL"
curl -L --fail --retry 3 -o "$OUTPUT" "$URL"
chmod +x "$OUTPUT"
# Verify checksum
ACTUAL_CHECKSUM=$($CHECKSUM_CMD "$OUTPUT" | cut -d' ' -f1)
echo "Expected checksum: $EXPECTED_CHECKSUM"
echo "Actual checksum: $ACTUAL_CHECKSUM"
if [ "$ACTUAL_CHECKSUM" != "$EXPECTED_CHECKSUM" ]; then
echo "Checksum verification failed!"
exit 1
fi
echo "Checksum verification passed"
# Upload test results
./"$OUTPUT" junit upload \
--service libdatadog \
--env ci \
--logs \
--tags rustc:${{ matrix.rust_version }},arch:${{ runner.arch }},os:${{ runner.os }},platform:${{ matrix.platform }} \
target/nextest/ci/junit.xml
env:
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
ffi:
name: "FFI #${{ matrix.platform }} ${{ matrix.rust_version }}"
runs-on: ${{ matrix.platform }}
env:
CARGO_TERM_COLOR: always
CARGO_INCREMENTAL: 0
strategy:
matrix:
platform: [windows-latest, ubuntu-latest, macos-15]
rust_version: [""]
include:
- platform: "ubuntu-latest"
rust_version: "${RUST_VERSION}"
- platform: "ubuntu-latest"
flags: "-C relocation-model=pic"
- platform: "macos-15"
flags: "-C relocation-model=pic"
- platform: "windows-latest"
flags: "-C target-feature=+crt-static"
steps:
- name: Checkout sources
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Setup output dir
shell: bash
run: |
WORKSPACE_PATH=${{ github.workspace }}
if [[ "${{ matrix.platform }}" == "windows-latest" ]]; then
WORKSPACE_PATH=$(cygpath -ua '${{ github.workspace }}')
fi
echo "LIBDD_OUTPUT_FOLDER=$WORKSPACE_PATH/artifacts" >> $GITHUB_ENV
- name: Free Disk Space (Ubuntu only)
if: runner.os == 'Linux' && matrix.platform == 'ubuntu-latest'
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # 1.3.1
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: false
docker-images: false
swap-storage: true
- name: Install Rust ${{ matrix.rust_version }}
if: matrix.rust_version != ''
run: rustup set profile minimal && rustup install ${{ matrix.rust_version }} && rustup default ${{ matrix.rust_version }}
- id: rust-version
# On Windows run happens in a PowerShell, so start bash explicitly
run: bash -c 'echo "version=$(rustc --version)" >> $GITHUB_OUTPUT'
- name: Cache [rust]
uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # 2.8.1
env:
RUSTFLAGS: "${{ matrix.flags }}"
with:
cache-targets: true # cache build artifacts
cache-bin: true # cache the ~/.cargo/bin directory
- name: "Generate profiling FFI"
shell: bash
env:
RUSTFLAGS: "${{ matrix.flags }}"
run: |
cargo run --bin release --release -- --out $LIBDD_OUTPUT_FOLDER
- name: 'Publish libdatadog'
uses: actions/upload-artifact@4cec3d8aa04e39d1a68397de0c4cd6fb9dce8ec1 # 4.6.1
# Only upload the artifacts built with the default Rust version
if: (success() || failure()) && matrix.rust_version == ''
with:
if-no-files-found: error
name: libdatadog.${{ matrix.platform }}
path: ${{ github.workspace }}/artifacts
retention-days: 1
- name: "(Windows) Test building Profiling C bindings - dynamic link vc runtime"
if: matrix.platform == 'windows-latest'
shell: bash
run: |
set -e
rm -rf examples/ffi/build_dll
mkdir examples/ffi/build_dll
cd examples/ffi/build_dll
cmake -S .. -DDatadog_ROOT=$LIBDD_OUTPUT_FOLDER -DVCRUNTIME_LINK_TYPE=DLL
cmake --build .
- name: "(Windows) Test building Profiling C bindings - static link vc runtime"
if: matrix.platform == 'windows-latest'
shell: bash
run: |
set -e
rm -rf examples/ffi/build_static
mkdir examples/ffi/build_static
cd examples/ffi/build_static
cmake -S .. -DDatadog_ROOT=$LIBDD_OUTPUT_FOLDER -DVCRUNTIME_LINK_TYPE=STATIC
cmake --build .
- name: "Test building Profiling C bindings"
shell: bash
if: matrix.platform != 'windows-latest'
run: |
set -e
mkdir examples/ffi/build
cd examples/ffi/build
# Add BUILD_SYMBOLIZER variable only for Linux platforms
if [[ "${{ matrix.platform }}" == "ubuntu-latest" ]]; then
cmake -S .. -DDatadog_ROOT=$LIBDD_OUTPUT_FOLDER -DBUILD_SYMBOLIZER=true
else
cmake -S .. -DDatadog_ROOT=$LIBDD_OUTPUT_FOLDER
fi
cmake --build .
- name: "Run FFI examples"
shell: bash
if: matrix.platform != 'windows-latest'
run: |
cargo ffi-test --skip-build
- name: "(Windows) Run FFI examples"
shell: bash
if: matrix.platform == 'windows-latest'
run: |
cargo ffi-test
- name: "Test building CXX bindings - Crashinfo (Unix)"
shell: bash
if: matrix.platform != 'windows-latest'
run: |
set -e
cd examples/cxx
./build-and-run-crashinfo.sh
- name: "Test building CXX bindings - Profiling (Unix)"
shell: bash
if: matrix.platform != 'windows-latest'
run: |
set -e
cd examples/cxx
./build-profiling.sh
- name: "Setup MSVC (Windows)"
if: matrix.platform == 'windows-latest'
uses: ilammy/msvc-dev-cmd@v1
- name: "Test building CXX bindings - Crashinfo (Windows)"
shell: pwsh
if: matrix.platform == 'windows-latest'
run: |
cd examples/cxx
.\build-and-run-crashinfo.ps1
- name: "Test building CXX bindings - Profiling (Windows)"
shell: pwsh
if: matrix.platform == 'windows-latest'
run: |
cd examples/cxx
.\build-profiling.ps1
cross-centos7:
name: Test x86_64-unknown-linux-gnu on centOS7 docker image
runs-on: ubuntu-latest
concurrency:
group: ci-${{ github.ref }}-cross-centos7
cancel-in-progress: true
steps:
- name: Free Disk Space
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be # 1.3.1
with:
tool-cache: true
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Cache [rust]
uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # 2.8.1
with:
cache-targets: true # cache build artifacts
cache-bin: true # cache the ~/.cargo/bin directory
- name: Build CentOS 7 Docker image
run: docker build -t libdatadog-centos7 -f tools/docker/Dockerfile.centos .
- name: "cargo nextest run (centos7)"
# Run docker as a user, not the default root
# Mount and use the runner's toolchain as it's the same arch
# exclude tracing integration tests since they require docker in docker to run a test-agent
run: >-
docker run --rm
--user "$(id -u):$(id -g)"
-v "${{ github.workspace }}:/workspace"
-v "${CARGO_HOME:-$HOME/.cargo}:/usr/local/cargo"
-v "${RUSTUP_HOME:-$HOME/.rustup}:/usr/local/rustup"
-e CARGO_HOME=/usr/local/cargo
-e RUSTUP_HOME=/usr/local/rustup
-e PATH=/usr/local/cargo/bin:/usr/local/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:/opt/rh/devtoolset-11/root/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-w /workspace
libdatadog-centos7
cargo nextest run --workspace --features libdd-crashtracker/generate-unit-test-files
--exclude builder --profile ci
-E '!test(tracing_integration_tests::)'
- name: Add file attributes to JUnit XML
if: success() || failure()
run: cargo run --bin add_junit_file_attributes -- target/nextest/ci/junit.xml
- name: Report Test Results
if: success() || failure()
uses: mikepenz/action-junit-report@db71d41eb79864e25ab0337e395c352e84523afe # 4.3.1
with:
report_paths: "target/nextest/ci/junit.xml"
check_name: "[centos7] test report"
include_passed: true
- name: Upload test results to Datadog
if: success() || failure()
run: |
URL="https://github.com/DataDog/datadog-ci/releases/download/v4.2.2/datadog-ci_linux-x64"
OUTPUT="datadog-ci"
EXPECTED_CHECKSUM="3e1e9649d15d3feacced89ec90de66151046a58c7844217e4112362ad8dbf8d1"
echo "Downloading datadog-ci from $URL"
curl -L --fail --retry 3 -o "$OUTPUT" "$URL"
chmod +x "$OUTPUT"
ACTUAL_CHECKSUM=$(sha256sum "$OUTPUT" | cut -d' ' -f1)
echo "Expected checksum: $EXPECTED_CHECKSUM"
echo "Actual checksum: $ACTUAL_CHECKSUM"
if [ "$ACTUAL_CHECKSUM" != "$EXPECTED_CHECKSUM" ]; then
echo "Checksum verification failed!"
exit 1
fi
echo "Checksum verification passed"
./"$OUTPUT" junit upload \
--service libdatadog \
--env ci \
--logs \
--tags arch:${{ runner.arch }},os:Linux,platform:centos7 \
target/nextest/ci/junit.xml
env:
DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }}
no-certs-exporter:
name: "exporter_e2e tests (no CA certificates)"
runs-on: ubuntu-latest
concurrency:
group: ci-${{ github.ref }}-no-certs-exporter
cancel-in-progress: true
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Cache [rust]
uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # 2.8.1
with:
cache-targets: true
cache-bin: true
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # 3.10.0
- name: Pre-fetch dependencies (requires network/certs on the runner)
run: cargo fetch
- name: Build no-certs Docker image
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: .
file: tools/docker/Dockerfile.no-certs
tags: libdatadog-no-certs
load: true
cache-from: type=gha,scope=no-certs-docker
cache-to: type=gha,scope=no-certs-docker,mode=max
- name: "cargo test exporter_e2e (no CA certificates)"
# Mount the runner's Rust toolchain and cargo cache — no network needed inside.
# The container has no CA certificates, reproducing minimal environments like
# bare ubuntu:20.04. Regression test for 9a61cae82 which unconditionally loaded
# the system cert store even for plain HTTP/unix endpoints.
run: >-
docker run --rm
--user "$(id -u):$(id -g)"
-v "${{ github.workspace }}:/workspace"
-v "${CARGO_HOME:-$HOME/.cargo}:/usr/local/cargo"
-v "${RUSTUP_HOME:-$HOME/.rustup}:/usr/local/rustup"
-e CARGO_HOME=/usr/local/cargo
-e RUSTUP_HOME=/usr/local/rustup
-e PATH=/usr/local/cargo/bin:/usr/local/rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
-w /workspace
libdatadog-no-certs
cargo test -p libdd-profiling --test exporter_e2e
wasm:
name: "cargo check --target wasm32-unknown-unknown"
runs-on: ubuntu-latest
concurrency:
group: ci-${{ github.ref }}-wasm
cancel-in-progress: true
steps:
- name: Checkout sources
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Install wasm32 target
run: rustup target add wasm32-unknown-unknown
- name: Cache [rust]
uses: Swatinem/rust-cache@f13886b937689c021905a6b90929199931d60db1 # 2.8.1
with:
cache-targets: true
cache-bin: true
- name: "cargo check -p libdd-data-pipeline --target wasm32-unknown-unknown --no-default-features"
run: cargo check -p libdd-data-pipeline --target wasm32-unknown-unknown --no-default-features
env:
RUSTFLAGS: "-D warnings -A unused-imports -A dead-code -A unused-variables"
ffi_bake:
strategy:
matrix:
target: [alpine-build] # debian-build-aarch64 is oom killed at the moment
name: "FFI ${{ matrix.target }} via docker bake"
concurrency:
group: ci-${{ github.ref }}-${{ matrix.target }}
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
runs-on:
labels: ubuntu-latest-16-cores
group: APM Larger Runners
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # 4.2.2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # 3.10.0
with:
buildkitd-config: .github/buildkitd-16-cores.toml
- name: Build and Generate FFI
uses: docker/bake-action@4ba453fbc2db7735392b93edf935aaf9b1e8f747 # 6.5.0
with:
targets: ${{ matrix.target }}
# Caching is useful, when it works. We are routinely hanging, maybe this:
# https://github.com/docker/buildx/issues/537
#set: |
# *.cache-from=type=gha,scope=${{ matrix.target }}
# *.cache-to=type=gha,mode=max,scope=${{ matrix.target }}