Skip to content

Commit 1e024ac

Browse files
committed
ci: setup building nuget packages in CI
1 parent d04fad9 commit 1e024ac

File tree

7 files changed

+485
-72
lines changed

7 files changed

+485
-72
lines changed

.github/workflows/dotnet.yml

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
on:
2+
push:
3+
branches:
4+
- main
5+
pull_request:
6+
7+
name: .NET
8+
9+
jobs:
10+
windows-build:
11+
runs-on: windows-latest
12+
steps:
13+
- name: checkout
14+
uses: actions/checkout@v4
15+
16+
- name: Install rustup using win.rustup.rs
17+
run: |
18+
# disable download progress bar
19+
$ProgressPreference = "SilentlyContinue"
20+
Invoke-WebRequest https://win.rustup.rs/ -OutFile rustup-init.exe
21+
.\rustup-init.exe -y --default-host=x86_64-pc-windows-msvc --default-toolchain=none
22+
del rustup-init.exe
23+
rustup target add x86_64-pc-windows-msvc
24+
rustup target add i686-pc-windows-msvc
25+
shell: powershell
26+
27+
- name: build
28+
run: |
29+
.\windows\build\build.ps1 -output_dir .\bin
30+
31+
- name: Upload artifacts
32+
uses: actions/upload-artifact@v4
33+
with:
34+
name: windows-bin
35+
path: |
36+
bin/x86_64-pc-windows-msvc/*/datadog_profiling_ffi.dll
37+
bin/x86_64-pc-windows-msvc/*/datadog_profiling_ffi.lib
38+
bin/x86_64-pc-windows-msvc/*/datadog_profiling_ffi.pdb
39+
bin/i686-pc-windows-msvc/*/datadog_profiling_ffi.dll
40+
bin/i686-pc-windows-msvc/*/datadog_profiling_ffi.lib
41+
bin/i686-pc-windows-msvc/*/datadog_profiling_ffi.pdb
42+
if-no-files-found: error
43+
44+
macos-build:
45+
runs-on: macos-latest
46+
steps:
47+
- name: checkout
48+
uses: actions/checkout@v4
49+
50+
- name: Install rustup using rustup.rs
51+
run: |
52+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
53+
source $HOME/.cargo/env
54+
rustup target add x86_64-apple-darwin
55+
rustup target add aarch64-apple-darwin
56+
shell: bash
57+
58+
- name: build
59+
run: |
60+
chmod +x ./windows/build/build.sh
61+
./windows/build/build.sh -o ./bin
62+
63+
- name: Upload artifacts
64+
uses: actions/upload-artifact@v4
65+
with:
66+
name: macos-bin
67+
path: |
68+
bin/x86_64-apple-darwin/*/libdatadog_profiling_ffi.dylib
69+
bin/x86_64-apple-darwin/*/libdatadog_profiling_ffi.a
70+
bin/aarch64-apple-darwin/*/libdatadog_profiling_ffi.dylib
71+
bin/aarch64-apple-darwin/*/libdatadog_profiling_ffi.a
72+
if-no-files-found: error
73+
74+
pack:
75+
runs-on: windows-latest
76+
needs: [windows-build, macos-build]
77+
steps:
78+
- name: checkout
79+
uses: actions/checkout@v4
80+
81+
- name: Download Windows artifacts
82+
uses: actions/download-artifact@v4
83+
with:
84+
name: windows-bin
85+
path: bin
86+
87+
- name: Download mac artifacts
88+
uses: actions/download-artifact@v4
89+
with:
90+
name: macos-bin
91+
path: bin
92+
93+
- name: pack
94+
run: |
95+
dotnet pack .\windows\libdatadog.csproj -p:LibDatadogBinariesOutputDir=..\bin -p:LibDatadogVersion="42.0.0" -o .nuget\packages\
96+
97+
- name: store artifacts
98+
uses: actions/upload-artifact@v4
99+
with:
100+
name: packages
101+
path: .nuget/packages/*
102+
if-no-files-found: error

windows/build-artifacts.ps1

100644100755
Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,12 @@ Write-Host "Building project into $($output_dir)" -ForegroundColor Magenta
2222

2323
# build inside the crate to use the config.toml file
2424
pushd profiling-ffi
25-
Invoke-Call -ScriptBlock { cargo build --features datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target i686-pc-windows-msvc --release --target-dir $output_dir }
26-
Invoke-Call -ScriptBlock { cargo build --features datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target i686-pc-windows-msvc --target-dir $output_dir }
27-
Invoke-Call -ScriptBlock { cargo build --features datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target x86_64-pc-windows-msvc --release --target-dir $output_dir }
28-
Invoke-Call -ScriptBlock { cargo build --features datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target x86_64-pc-windows-msvc --target-dir $output_dir }
25+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target aarch64-apple-darwin --release --target-dir $output_dir }
26+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target aarch64-apple-darwin --target-dir $output_dir }
27+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target i686-pc-windows-msvc --release --target-dir $output_dir }
28+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target i686-pc-windows-msvc --target-dir $output_dir }
29+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target x86_64-pc-windows-msvc --release --target-dir $output_dir }
30+
Invoke-Call -ScriptBlock { cargo build --features data-pipeline-ffi,datadog-profiling-ffi/ddtelemetry-ffi,datadog-profiling-ffi/crashtracker-receiver,datadog-profiling-ffi/crashtracker-collector,datadog-profiling-ffi/demangler --target x86_64-pc-windows-msvc --target-dir $output_dir }
2931
popd
3032

3133
Write-Host "Building tools" -ForegroundColor Magenta

windows/build/build.ps1

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
param (
2+
[string]$output_dir,
3+
[string[]]$targets = @(
4+
# "aarch64-apple-darwin"
5+
# "x86_64-apple-darwin"
6+
# "aarch64-unknown-linux-gnu",
7+
# "x86_64-unknown-linux-gnu"
8+
"i686-pc-windows-msvc",
9+
"x86_64-pc-windows-msvc"
10+
)
11+
)
12+
13+
# Check if output directory is set
14+
if (-not $output_dir) {
15+
Write-Host "You must specify an output directory with -output. Example: .\build_script.ps1 -output bin"
16+
exit 1
17+
}
18+
19+
# Make output_dir an absolute path if it's not already
20+
if (-not [System.IO.Path]::IsPathRooted($output_dir)) {
21+
$output_dir = Join-Path -Path (Get-Location) -ChildPath $output_dir
22+
}
23+
24+
Write-Host "Building project into $output_dir" -ForegroundColor Magenta
25+
26+
# Function to invoke a command and exit if it fails
27+
function Invoke-Call {
28+
param (
29+
[scriptblock]$ScriptBlock
30+
)
31+
& $ScriptBlock
32+
if ($LASTEXITCODE -ne 0) {
33+
exit $LASTEXITCODE
34+
}
35+
}
36+
37+
# Function to build project with given target, features, and release flag
38+
function Build-Project {
39+
param (
40+
[string]$target,
41+
[bool]$release = $false
42+
)
43+
44+
Invoke-Call -ScriptBlock {
45+
$featues = @(
46+
"data-pipeline-ffi",
47+
"datadog-profiling-ffi/ddtelemetry-ffi",
48+
"datadog-profiling-ffi/crashtracker-receiver",
49+
"datadog-profiling-ffi/crashtracker-collector",
50+
"datadog-profiling-ffi/demangler"
51+
)
52+
53+
# cargo has a bug when passing "" as configuration, so branch for debug and release
54+
if ($release) {
55+
cargo build --features $($featues -join ",") --target $target --release --target-dir $output_dir
56+
} else {
57+
cargo build --features $($featues -join ",") --target $target --target-dir $output_dir
58+
}
59+
}
60+
}
61+
62+
# Function to generate header files using cbindgen
63+
function Generate-Header {
64+
param (
65+
[string]$crateName,
66+
[string]$configPath,
67+
[string]$outputPath
68+
)
69+
70+
Invoke-Call -ScriptBlock {
71+
cbindgen --crate $crateName --config $configPath --output $outputPath
72+
}
73+
}
74+
75+
# Build project for multiple targets
76+
77+
try {
78+
Push-Location "profiling-ffi"
79+
foreach ($target in $targets) {
80+
Build-Project -target $target -release $true
81+
Build-Project -target $target
82+
}
83+
}
84+
finally {
85+
Pop-Location
86+
}
87+
88+
Write-Host "Building tools" -ForegroundColor Magenta
89+
try {
90+
Push-Location "tools"
91+
Invoke-Call -ScriptBlock { cargo build --release }
92+
}
93+
finally {
94+
Pop-Location
95+
}
96+
97+
Write-Host "Generating headers" -ForegroundColor Magenta
98+
99+
# Generate headers for each FFI crate
100+
Generate-Header -crateName "ddcommon-ffi" -configPath "ddcommon-ffi/cbindgen.toml" -outputPath "$output_dir\common.h"
101+
Generate-Header -crateName "datadog-profiling-ffi" -configPath "profiling-ffi/cbindgen.toml" -outputPath "$output_dir\profiling.h"
102+
Generate-Header -crateName "ddtelemetry-ffi" -configPath "ddtelemetry-ffi/cbindgen.toml" -outputPath "$output_dir\telemetry.h"
103+
Generate-Header -crateName "data-pipeline-ffi" -configPath "data-pipeline-ffi/cbindgen.toml" -outputPath "$output_dir\data-pipeline.h"
104+
Generate-Header -crateName "datadog-crashtracker-ffi" -configPath "crashtracker-ffi/cbindgen.toml" -outputPath "$output_dir\crashtracker.h"
105+
106+
# Deduplicate headers
107+
Invoke-Call -ScriptBlock { .\target\release\dedup_headers "$output_dir\common.h" "$output_dir\profiling.h" "$output_dir\telemetry.h" "$output_dir\data-pipeline.h" "$output_dir\crashtracker.h" }
108+
109+
Write-Host "Build finished" -ForegroundColor Magenta

windows/build/build.sh

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
#!/bin/bash
2+
3+
# Copyright 2021-Present Datadog, Inc. https://www.datadoghq.com/
4+
# SPDX-License-Identifier: Apache-2.0
5+
6+
# Default values
7+
output_dir=""
8+
targets=(
9+
# Uncomment or add targets as needed
10+
"aarch64-apple-darwin"
11+
"x86_64-apple-darwin"
12+
# "aarch64-unknown-linux-gnu"
13+
# "x86_64-unknown-linux-gnu"
14+
# "i686-pc-windows-msvc"
15+
# "x86_64-pc-windows-msvc"
16+
)
17+
18+
# Parse named parameters
19+
while [[ "$#" -gt 0 ]]; do
20+
case "$1" in
21+
-o|--output)
22+
output_dir="$2"
23+
shift 2
24+
;;
25+
-t|--target)
26+
targets=()
27+
shift
28+
while [[ "$1" && ! "$1" =~ ^- ]]; do
29+
targets+=("$1")
30+
shift
31+
done
32+
;;
33+
*)
34+
echo "Unknown parameter: $1"
35+
exit 1
36+
;;
37+
esac
38+
done
39+
40+
# Check if output directory is set
41+
if [ -z "$output_dir" ]; then
42+
echo "You must specify an output directory with -o or --output. Example: ./build_script.sh -o bin"
43+
exit 1
44+
fi
45+
46+
# Make output_dir an absolute path if it's not already
47+
if [[ "$output_dir" != /* ]]; then
48+
output_dir="$(pwd)/$output_dir"
49+
fi
50+
51+
echo -e "Building project into $output_dir"
52+
53+
# Function to invoke a command and exit if it fails
54+
invoke_call() {
55+
"$@"
56+
if [ $? -ne 0 ]; then
57+
exit $?
58+
fi
59+
}
60+
61+
# Function to build project with given target, features, and release flag
62+
build_project() {
63+
local target="$1"
64+
local release_flag="$2"
65+
66+
features=(
67+
"data-pipeline-ffi"
68+
"datadog-profiling-ffi/ddtelemetry-ffi"
69+
"datadog-profiling-ffi/crashtracker-receiver"
70+
"datadog-profiling-ffi/crashtracker-collector"
71+
"datadog-profiling-ffi/demangler"
72+
)
73+
74+
if [ "$release_flag" = "--release" ]; then
75+
invoke_call cargo build --features "$(IFS=,; echo "${features[*]}")" --target "$target" --release --target-dir "$output_dir"
76+
else
77+
invoke_call cargo build --features "$(IFS=,; echo "${features[*]}")" --target "$target" --target-dir "$output_dir"
78+
fi
79+
}
80+
81+
# Function to generate header files using cbindgen
82+
generate_header() {
83+
local crate_name="$1"
84+
local config_path="$2"
85+
local output_path="$3"
86+
87+
invoke_call cbindgen --crate "$crate_name" --config "$config_path" --output "$output_path"
88+
}
89+
90+
# Build project for multiple targets
91+
pushd profiling-ffi || exit
92+
for target in "${targets[@]}"; do
93+
build_project "$target" "--release"
94+
build_project "$target" ""
95+
done
96+
popd || exit
97+
98+
echo -e "Building tools"
99+
pushd tools || exit
100+
invoke_call cargo build --release
101+
popd || exit
102+
103+
echo -e "Generating headers"
104+
105+
# Generate headers for each FFI crate
106+
generate_header "ddcommon-ffi" "ddcommon-ffi/cbindgen.toml" "$output_dir/common.h"
107+
generate_header "datadog-profiling-ffi" "profiling-ffi/cbindgen.toml" "$output_dir/profiling.h"
108+
generate_header "ddtelemetry-ffi" "ddtelemetry-ffi/cbindgen.toml" "$output_dir/telemetry.h"
109+
generate_header "data-pipeline-ffi" "data-pipeline-ffi/cbindgen.toml" "$output_dir/data-pipeline.h"
110+
generate_header "datadog-crashtracker-ffi" "crashtracker-ffi/cbindgen.toml" "$output_dir/crashtracker.h"
111+
112+
# Deduplicate headers
113+
invoke_call ./target/release/dedup_headers "$output_dir/common.h" "$output_dir/profiling.h" "$output_dir/telemetry.h" "$output_dir/data-pipeline.h" "$output_dir/crashtracker.h"
114+
115+
echo -e "Build finished"

0 commit comments

Comments
 (0)