Skip to content

Commit 479d4a5

Browse files
committed
ci: setup building nuget packages in CI
1 parent 22c2da5 commit 479d4a5

File tree

7 files changed

+470
-69
lines changed

7 files changed

+470
-69
lines changed

.github/workflows/dotnet.yml

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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: bin/*
36+
37+
macos-build:
38+
runs-on: macos-latest
39+
steps:
40+
- name: checkout
41+
uses: actions/checkout@v4
42+
43+
- name: Install rustup using rustup.rs
44+
run: |
45+
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
46+
source $HOME/.cargo/env
47+
rustup target add x86_64-apple-darwin
48+
rustup target add aarch64-apple-darwin
49+
shell: bash
50+
51+
- name: build
52+
run: |
53+
chmod +x ./windows/build/build.sh
54+
./windows/build/build.sh -o ./bin
55+
56+
- name: Upload artifacts
57+
uses: actions/upload-artifact@v4
58+
with:
59+
name: macos-bin
60+
path: bin/*
61+
62+
pack:
63+
runs-on: windows-latest
64+
needs: [windows-build, macos-build]
65+
steps:
66+
- name: checkout
67+
uses: actions/checkout@v4
68+
69+
- name: Download Windows artifacts
70+
uses: actions/download-artifact@v4
71+
with:
72+
name: windows-bin
73+
path: bin
74+
75+
- name: Download mac artifacts
76+
uses: actions/download-artifact@v4
77+
with:
78+
name: macos-bin
79+
path: bin
80+
81+
- name: pack
82+
run: |
83+
dotnet pack .\windows\libdatadog.csproj -p:LibDatadogBinariesOutputDir=..\bin -p:LibDatadogVersion="42.0.0" -o .nuget\packages\
84+
85+
- name: store artifacts
86+
uses: actions/upload-artifact@v4
87+
with:
88+
name: packages
89+
path: .nuget/packages/*
90+
if-no-files-found: error

windows/build-artifacts.ps1

100644100755
+6-4
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

+109
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

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

0 commit comments

Comments
 (0)