Skip to content

Commit 11fda2a

Browse files
authoredApr 4, 2025··
Update packaging pipeline for Nodejs binding (#24301)
### Description Update packaging pipeline for Nodejs binding. This change updates the pipeline to perform all Node.js binding builds, including: - Windows x64 ( CPU, DML, WebGPU ) - Windows arm64 ( CPU, DML, WebGPU ) - Linux x64 ( CPU, CUDA, TensorRT, WebGPU ) - Linux arm64 ( CPU ) - MacOS x64 ( CPU, CoreML, WebGPU ) - MacOS arm64 ( CPU, CoreML, WebGPU ) #### Dependencies The Node.js binding depends on the Nuget package from the same build. Because NPM has a size limit so we cannot fit libonnxruntime_provider_cuda.so into it. The Node.js binding works in a way that an installation script will try to download the Nuget package of the corresponding version.
1 parent e944379 commit 11fda2a

8 files changed

+362
-111
lines changed
 

Diff for: ‎tools/ci_build/github/azure-pipelines/c-api-noopenmp-packaging-pipelines.yml

+23
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,29 @@ extends:
147147
SpecificArtifact: ${{ parameters.SpecificArtifact }}
148148
BuildId: ${{ parameters.BuildId }}
149149

150+
- template: stages/nodejs-win-packaging-stage.yml
151+
parameters:
152+
IsReleaseBuild: ${{ parameters.IsReleaseBuild }}
153+
ArtifactName: 'drop-onnxruntime-nodejs-win-x64'
154+
StageName: 'Windows_Nodejs_Packaging_x64'
155+
BuildCommand: --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos --use_telemetry --use_dml --use_webgpu --build_nodejs --cmake_generator "Visual Studio 17 2022"
156+
BuildArch: 'x64'
157+
EnvSetupScript: 'setup_env.bat'
158+
sln_platform: 'x64'
159+
DoEsrp: ${{ parameters.DoEsrp }}
160+
PublishWebGpuBuildTools: true
161+
162+
- template: stages/nodejs-win-packaging-stage.yml
163+
parameters:
164+
IsReleaseBuild: ${{ parameters.IsReleaseBuild }}
165+
ArtifactName: 'drop-onnxruntime-nodejs-win-arm64'
166+
StageName: 'Windows_Nodejs_Packaging_arm64'
167+
BuildCommand: --arm64 --skip_submodule_sync --build_shared_lib --enable_onnx_tests --enable_wcos --use_telemetry --use_dml --use_webgpu --build_nodejs --cmake_generator "Visual Studio 17 2022"
168+
BuildArch: 'x64'
169+
EnvSetupScript: 'setup_env.bat'
170+
sln_platform: 'arm64'
171+
DoEsrp: ${{ parameters.DoEsrp }}
172+
DependsOnStageName: Windows_Nodejs_Packaging_x64
150173

151174
- template: nuget/templates/dml-vs-2022.yml
152175
parameters:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
parameters:
2+
- name: CudaVersion
3+
type: string
4+
default: '12.2'
5+
6+
stages:
7+
- stage: Linux_Nodejs_Packaging_x64
8+
dependsOn: []
9+
jobs:
10+
- job: Linux_Nodejs_Packaging_x64
11+
dependsOn: []
12+
workspace:
13+
clean: all
14+
timeoutInMinutes: 180
15+
pool:
16+
name: 'onnxruntime-Ubuntu2204-AMD-CPU'
17+
os: linux
18+
variables:
19+
- template: ../templates/common-variables.yml
20+
- name: CUDA_VERSION_MAJOR
21+
${{ if eq(parameters.CudaVersion, '11.8') }}:
22+
value: '11'
23+
${{ if eq(parameters.CudaVersion, '12.2') }}:
24+
value: '12'
25+
- name: CUDA_VERSION
26+
value: ${{ parameters.CudaVersion }}
27+
- name: linux_trt_version
28+
${{ if eq(parameters.CudaVersion, '11.8') }}:
29+
value: ${{ variables.linux_trt_version_cuda11 }}
30+
${{ if eq(parameters.CudaVersion, '12.2') }}:
31+
value: ${{ variables.linux_trt_version_cuda12 }}
32+
steps:
33+
- checkout: self
34+
clean: true
35+
submodules: recursive
36+
- template: ../templates/get-docker-image-steps.yml
37+
parameters:
38+
Dockerfile: tools/ci_build/github/linux/docker/inference/x86_64/default/cuda${{ variables.CUDA_VERSION_MAJOR }}/Dockerfile
39+
Context: tools/ci_build/github/linux/docker/inference/x86_64/default/cuda${{ variables.CUDA_VERSION_MAJOR }}
40+
DockerBuildArgs: "
41+
--build-arg TRT_VERSION=${{ variables.linux_trt_version }}
42+
--build-arg BUILD_UID=$( id -u )
43+
"
44+
Repository: onnxruntimecuda${{ variables.CUDA_VERSION_MAJOR }}xtrt86build
45+
- template: ../templates/set-version-number-variables-step.yml
46+
47+
- script: $(Build.SourcesDirectory)/tools/ci_build/github/linux/build_nodejs_package.sh
48+
workingDirectory: $(Build.SourcesDirectory)
49+
displayName: 'Build Node.js binding Package'
50+
51+
- template: ../templates/nodejs-artifacts-package-and-publish-steps-posix.yml
52+
parameters:
53+
arch: 'x64'
54+
os: 'linux'
55+
artifactName: 'drop-onnxruntime-nodejs-linux-x64'
56+
57+
- template: ../templates/clean-agent-build-directory-step.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
parameters:
2+
BuildCommand: ''
3+
StageName: 'Windows_Nodejs_Packaging'
4+
ArtifactName: 'drop-onnxruntime-nodejs-win'
5+
DoEsrp: 'false'
6+
BuildArch: 'x64' # Optional. Options: x86, x64
7+
sln_platform: 'x64' # Options: Win32, x64, arm, arm64
8+
AgentDemands: []
9+
BuildConfigurations: ['RelWithDebInfo'] # Options: Debug, RelWithDebInfo
10+
EnableLto: true
11+
# Controls whether unreleased onnx opsets are allowed. Default is set to 1
12+
AllowReleasedOpsetOnly: '0'
13+
IsReleaseBuild: false
14+
PublishWebGpuBuildTools: false
15+
WebGpuBuildToolsArtifactName: 'Windows_WebGPU_BuildTools_x64'
16+
DependsOnStageName: ''
17+
18+
stages:
19+
- stage: ${{ parameters.StageName }}
20+
dependsOn:
21+
- Setup
22+
- ${{ if ne(parameters.DependsOnStageName, '') }}:
23+
- ${{ parameters.DependsOnStageName }}
24+
25+
jobs:
26+
- job: ${{ parameters.StageName }}
27+
timeoutInMinutes: 200
28+
strategy:
29+
maxParallel: 2
30+
matrix:
31+
${{ each BuildConfiguration in parameters.BuildConfigurations }}:
32+
${{ BuildConfiguration }}:
33+
BuildConfig: ${{ BuildConfiguration }}
34+
workspace:
35+
clean: all
36+
pool:
37+
name: onnxruntime-Win-CPU-2022
38+
demands: ${{ parameters.AgentDemands }}
39+
variables:
40+
buildDirectory: '$(Build.BinariesDirectory)'
41+
OnnxRuntimeBuildDirectory: '$(Build.BinariesDirectory)'
42+
runCodesignValidationInjection: ${{ parameters. DoEsrp}} #For the others, code sign is in a separated job
43+
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
44+
ALLOW_RELEASED_ONNX_OPSET_ONLY: ${{ parameters.AllowReleasedOpsetOnly }}
45+
BuildDate : $[stageDependencies.Setup.Set_Variables.outputs['Set_Build_Date.BuildDate']]
46+
BuildTime : $[stageDependencies.Setup.Set_Variables.outputs['Set_Build_Time.BuildTime']]
47+
BuildCommandExtra: ''
48+
${{ if eq(parameters.EnableLto, true) }}:
49+
build_py_lto_flag: --enable_lto
50+
51+
steps:
52+
- checkout: self
53+
clean: true
54+
submodules: none
55+
56+
- powershell: |
57+
if($env:TELEMETRYGUID)
58+
{
59+
$length = $env:TELEMETRYGUID.length
60+
$fileContent = "#define TraceLoggingOptionMicrosoftTelemetry() \
61+
TraceLoggingOptionGroup("+$env:TELEMETRYGUID.substring(1, $length-2)+")"
62+
New-Item -Path "$(Build.SourcesDirectory)\include\onnxruntime\core\platform\windows\TraceLoggingConfigPrivate.h" -ItemType "file" -Value "$fileContent" -Force
63+
Write-Output "Enabling TELEMETRY"
64+
}
65+
displayName: 'Create TraceLoggingConfigPrivate.h For WinML Telemetry'
66+
env:
67+
TELEMETRYGUID: $(TELEMETRYGUID)
68+
69+
- task: NodeTool@0
70+
inputs:
71+
versionSpec: '20.x'
72+
73+
- task: UsePythonVersion@0
74+
inputs:
75+
versionSpec: '3.12'
76+
addToPath: true
77+
architecture: ${{ parameters.BuildArch }}
78+
79+
# need to set PROCESSOR_ARCHITECTURE so the x86 SDK is installed correctly
80+
- task: UseDotNet@2
81+
inputs:
82+
version: 8.x
83+
env:
84+
PROCESSOR_ARCHITECTURE: ${{ parameters.BuildArch }}
85+
86+
- task: BatchScript@1
87+
displayName: 'Setup VS2022 env vars'
88+
inputs:
89+
filename: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat'
90+
arguments: ${{ parameters.BuildArch }}
91+
modifyEnvironment: true
92+
93+
- ${{ if and(ne(parameters.WebGpuBuildToolsArtifactName, ''), eq(parameters.sln_platform, 'arm64')) }}:
94+
- task: DownloadPipelineArtifact@2
95+
displayName: 'Download WebGPU build tools from x64 build'
96+
inputs:
97+
artifactName: '${{ parameters.WebGpuBuildToolsArtifactName }}'
98+
targetPath: '$(Build.BinariesDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}'
99+
- script: |
100+
@echo ##vso[task.setvariable variable=LLVM_TABLEGEN_PATH]$(Build.BinariesDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}\llvm-tblgen.exe
101+
@echo ##vso[task.setvariable variable=CLANG_TABLEGEN_PATH]$(Build.BinariesDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}\clang-tblgen.exe
102+
displayName: 'Set tablegen paths'
103+
- powershell: |
104+
Write-Host "Using LLVM_TABLEGEN_PATH: $(LLVM_TABLEGEN_PATH)"
105+
Write-Host "Using CLANG_TABLEGEN_PATH: $(CLANG_TABLEGEN_PATH)"
106+
Write-Host "##vso[task.setvariable variable=BuildCommandExtra]--cmake_extra_defines LLVM_TABLEGEN=$(LLVM_TABLEGEN_PATH) CLANG_TABLEGEN=$(CLANG_TABLEGEN_PATH)"
107+
displayName: 'Set build flags for WebGPU cross-compilation'
108+
109+
- powershell: |
110+
python tools\ci_build\build.py --build_dir $(Build.BinariesDirectory) ${{ parameters.BuildCommand }} $(BuildCommandExtra) --use_binskim_compliant_compile_flags --parallel --build --update --config $(BuildConfig) --msbuild_extra_options IncludeMobileTargets=false ${{ variables.build_py_lto_flag }}
111+
112+
- ${{ if notIn(parameters['sln_platform'], 'Win32', 'x64') }}:
113+
# Use cross-compiled protoc
114+
- script: |
115+
@echo ##vso[task.setvariable variable=ProtocDirectory]$(Build.BinariesDirectory)\installed\bin
116+
117+
# The Configuration variable is required to build C#
118+
- script: |
119+
@echo ##vso[task.setvariable variable=Configuration]$(BuildConfig)
120+
displayName: 'Set Configuration variable'
121+
122+
# Node.js Publish
123+
- task: BatchScript@1
124+
displayName: 'Setup VS env vars'
125+
inputs:
126+
filename: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Auxiliary\Build\vcvarsall.bat'
127+
arguments: ${{ parameters.BuildArch }}
128+
modifyEnvironment: true
129+
- task: CopyFiles@2
130+
displayName: 'Copy DirectML binaries to: $(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\${{ parameters.sln_platform }}'
131+
inputs:
132+
SourceFolder: '$(Build.BinariesDirectory)\$(BuildConfig)\$(BuildConfig)'
133+
Contents: 'DirectML.dll'
134+
TargetFolder: '$(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\${{ parameters.sln_platform }}'
135+
- powershell: |
136+
$dxcZipUrl = "https://github.com/microsoft/DirectXShaderCompiler/releases/download/v1.8.2502/dxc_2025_02_20.zip"
137+
$dxcZipPath = "$(Build.BinariesDirectory)\dxc.zip"
138+
$dxcExtractPath = "$(Build.BinariesDirectory)\dxc_extracted"
139+
$targetArch = "${{ parameters.sln_platform }}"
140+
141+
# Download the DXC package
142+
Write-Host "Downloading DXC release from $dxcZipUrl"
143+
Invoke-WebRequest -Uri $dxcZipUrl -OutFile $dxcZipPath
144+
145+
# Create extraction directory
146+
if (-not (Test-Path $dxcExtractPath)) {
147+
New-Item -Path $dxcExtractPath -ItemType Directory -Force
148+
}
149+
150+
# Extract the zip file
151+
Write-Host "Extracting DXC package to $dxcExtractPath"
152+
Expand-Archive -Path $dxcZipPath -DestinationPath $dxcExtractPath -Force
153+
154+
# Copy the necessary DLLs to the target directory
155+
$sourcePath = Join-Path $dxcExtractPath "bin\$targetArch"
156+
$targetPath = "$(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\$targetArch"
157+
158+
Write-Host "Copying dxil.dll and dxcompiler.dll from $sourcePath to $targetPath"
159+
Copy-Item -Path "$sourcePath\dxil.dll" -Destination $targetPath -Force
160+
Copy-Item -Path "$sourcePath\dxcompiler.dll" -Destination $targetPath -Force
161+
162+
Write-Host "DXC DLLs successfully copied to the target directory"
163+
displayName: 'Download and Copy DXC Binaries'
164+
- template: ../templates/win-esrp-dll.yml
165+
parameters:
166+
FolderPath: '$(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\${{ parameters.sln_platform }}'
167+
DisplayName: 'ESRP - Sign Node.js binding binaries'
168+
DoEsrp: ${{ parameters.DoEsrp }}
169+
Pattern: '*.dll,*.node'
170+
171+
- script: |
172+
del /Q $(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\${{ parameters.sln_platform }}\CodeSignSummary-*.*
173+
call npm pack
174+
copy $(Build.SourcesDirectory)\js\node\onnxruntime-*.tgz $(Build.ArtifactStagingDirectory)
175+
workingDirectory: '$(Build.SourcesDirectory)\js\node'
176+
displayName: 'Create NPM Package'
177+
178+
- task: 1ES.PublishPipelineArtifact@1
179+
inputs:
180+
targetPath: '$(Build.SourcesDirectory)\js\node\bin\napi-v3\win32\${{ parameters.sln_platform }}'
181+
artifactName: ${{ parameters.ArtifactName }}
182+
183+
- ${{ if and(eq(parameters.PublishWebGpuBuildTools, true), eq(parameters.sln_platform, 'x64')) }}:
184+
- script: |
185+
mkdir $(Build.ArtifactStagingDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}
186+
copy $(Build.BinariesDirectory)\$(BuildConfig)\_deps\dawn-build\third_party\dxc\RelWithDebInfo\bin\llvm-tblgen.exe $(Build.ArtifactStagingDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}
187+
copy $(Build.BinariesDirectory)\$(BuildConfig)\_deps\dawn-build\third_party\dxc\RelWithDebInfo\bin\clang-tblgen.exe $(Build.ArtifactStagingDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}
188+
displayName: 'Copy WebGPU build tools'
189+
- task: 1ES.PublishPipelineArtifact@1
190+
inputs:
191+
targetPath: '$(Build.ArtifactStagingDirectory)\${{ parameters.WebGpuBuildToolsArtifactName }}'
192+
artifactName: ${{ parameters.WebGpuBuildToolsArtifactName }}

Diff for: ‎tools/ci_build/github/azure-pipelines/stages/nuget-combine-cuda-stage.yml

+5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ stages:
3939
buildJava: ${{ parameters.buildJava }}
4040
buildNodejs: ${{ parameters.buildNodejs }}
4141

42+
- ${{ if eq(parameters.buildNodejs, 'true') }}:
43+
- template: nodejs-linux-packaging-stage.yml
44+
parameters:
45+
CudaVersion: ${{ parameters.CudaVersion }}
46+
4247
- template: nuget-win-cuda-packaging-stage.yml
4348
parameters:
4449
RunOnnxRuntimeTests: ${{ parameters.RunOnnxRuntimeTests }}

Diff for: ‎tools/ci_build/github/azure-pipelines/stages/nuget-linux-cuda-packaging-stage.yml

+1-10
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,7 @@ stages:
3232
parameters:
3333
Dockerfile: tools/ci_build/github/linux/docker/inference/x86_64/default/cuda${{ variables.CUDA_VERSION_MAJOR }}/Dockerfile
3434
Context: tools/ci_build/github/linux/docker/inference/x86_64/default/cuda${{ variables.CUDA_VERSION_MAJOR }}
35-
DockerBuildArgs: "
36-
--build-arg BUILD_UID=$( id -u )
37-
"
35+
DockerBuildArgs: " --build-arg BUILD_UID=$( id -u )"
3836
Repository: onnxruntimecuda${{ variables.CUDA_VERSION_MAJOR }}build
3937

4038
- script: $(Build.SourcesDirectory)/tools/ci_build/github/linux/build_cuda_c_api_package.sh
@@ -113,13 +111,6 @@ stages:
113111
nativeLibraryName: 'libonnxruntime4j_jni.so'
114112
is1ES: true
115113

116-
- ${{ if eq(parameters.buildNodejs, 'true') }}:
117-
- template: ../templates/nodejs-artifacts-package-and-publish-steps-posix.yml
118-
parameters:
119-
arch: 'x64'
120-
os: 'linux'
121-
artifactName: 'drop-onnxruntime-nodejs-linux-x64-tensorrt'
122-
123114
- template: ../templates/c-api-artifacts-package-and-publish-steps-posix.yml
124115
parameters:
125116
buildConfig: 'Release'

0 commit comments

Comments
 (0)
Please sign in to comment.