diff --git a/BUILD.md b/BUILD.md index fd075c7833..182339df84 100644 --- a/BUILD.md +++ b/BUILD.md @@ -124,7 +124,7 @@ GCC 4.x and below are not supported. |**C# and C packages**|--build_csharp|| |**WindowsML**|--use_winml
--use_dml
--build_shared_lib|WindowsML depends on DirectML and the OnnxRuntime shared library| |**Java**|--build_java|Creates an onnxruntime4j.jar in the build directory, implies `--build_shared_lib`
Compiling the Java API requires [gradle](https://gradle.org) v6.1+ to be installed in addition to the usual requirements.| -|**Node.js**|--build_nodejs|Implies `--build_shared_lib`
`npm install` to pull dev dependencies
`npm run build` to build binding
`npm test` to run tests| +|**Node.js**|--build_nodejs|Build Node.js binding. Implies `--build_shared_lib`| --- diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt index a57463df78..761b1661a3 100644 --- a/cmake/CMakeLists.txt +++ b/cmake/CMakeLists.txt @@ -1001,6 +1001,11 @@ if (onnxruntime_BUILD_JAVA) include(onnxruntime_java.cmake) endif() +if (onnxruntime_BUILD_NODEJS) + message(STATUS "Node.js Build is enabled") + include(onnxruntime_nodejs.cmake) +endif() + # some of the tests rely on the shared libs to be # built; hence the ordering if (onnxruntime_BUILD_UNIT_TESTS) diff --git a/cmake/onnxruntime_nodejs.cmake b/cmake/onnxruntime_nodejs.cmake new file mode 100644 index 0000000000..1fcb4127b5 --- /dev/null +++ b/cmake/onnxruntime_nodejs.cmake @@ -0,0 +1,36 @@ +# Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. +# Licensed under the MIT License. + +set(NODEJS_BINDING_ROOT ${REPO_ROOT}/nodejs) +if (WIN32) + set(NPM_CLI cmd /c npm) +else() + set(NPM_CLI npm) +endif() + +# verify Node.js and NPM +execute_process(COMMAND node --version + WORKING_DIRECTORY ${NODEJS_BINDING_ROOT} + OUTPUT_VARIABLE node_version + RESULT_VARIABLE had_error + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(had_error) + message(FATAL_ERROR "Failed to find Node.js: " ${had_error}) +endif() +execute_process(COMMAND ${NPM_CLI} --version + WORKING_DIRECTORY ${NODEJS_BINDING_ROOT} + OUTPUT_VARIABLE npm_version + RESULT_VARIABLE had_error + OUTPUT_STRIP_TRAILING_WHITESPACE) +if(had_error) + message(FATAL_ERROR "Failed to find NPM: " ${had_error}) +endif() + +# add custom target +add_custom_target(nodejs_binding_wrapper ALL + COMMAND ${NPM_CLI} ci --ort-skip-build + COMMAND ${NPM_CLI} run build -- --onnxruntime-build-dir=${CMAKE_CURRENT_BINARY_DIR} --config=${CMAKE_BUILD_TYPE} + COMMAND ${NPM_CLI} test -- --timeout=10000 + WORKING_DIRECTORY ${NODEJS_BINDING_ROOT} + COMMENT "Using cmake-js to build OnnxRuntime Node.js binding") +add_dependencies(nodejs_binding_wrapper onnxruntime) diff --git a/nodejs/CMakeLists.txt b/nodejs/CMakeLists.txt index d8a3eb72e2..ed367ec7ce 100644 --- a/nodejs/CMakeLists.txt +++ b/nodejs/CMakeLists.txt @@ -16,10 +16,21 @@ file(READ ${CMAKE_SOURCE_DIR}/../VERSION_NUMBER ort_version) string(STRIP "${ort_version}" ort_version) set(dist_folder "${CMAKE_SOURCE_DIR}/bin/napi-v3/${node_platform}/${node_arch}/") +# onnxruntime.dll dir +if(NOT ONNXRUNTIME_BUILD_DIR) + if (WIN32) + set(ONNXRUNTIME_BUILD_DIR ${CMAKE_SOURCE_DIR}/../build/Windows/${CMAKE_BUILD_TYPE}) + else() + set(ONNXRUNTIME_BUILD_DIR ${CMAKE_SOURCE_DIR}/../build/Linux) + endif() +endif() + +# include dirs include_directories(${CMAKE_JS_INC}) include_directories(${CMAKE_SOURCE_DIR}/../include/onnxruntime) include_directories(${CMAKE_SOURCE_DIR}/node_modules/node-addon-api) +# source files file(GLOB SOURCE_FILES ${CMAKE_SOURCE_DIR}/src/*.cc) add_library(onnxruntime_binding SHARED ${SOURCE_FILES} ${CMAKE_JS_SRC}) @@ -29,16 +40,20 @@ set_target_properties(onnxruntime_binding PROPERTIES INSTALL_RPATH_USE_LINK_PATH FALSE) target_link_libraries(onnxruntime_binding PRIVATE ${CMAKE_JS_LIB}) +# add libraries if (WIN32) - target_link_libraries(onnxruntime_binding PRIVATE - ${CMAKE_SOURCE_DIR}/../build/Windows/${CMAKE_BUILD_TYPE}/${CMAKE_BUILD_TYPE}/onnxruntime.lib) + target_link_directories(onnxruntime_binding PRIVATE ${ONNXRUNTIME_BUILD_DIR}/${CMAKE_BUILD_TYPE}) +else() + target_link_directories(onnxruntime_binding PRIVATE ${ONNXRUNTIME_BUILD_DIR}) +endif() + +if (WIN32) + target_link_libraries(onnxruntime_binding PRIVATE onnxruntime.lib) elseif (APPLE) - target_link_libraries(onnxruntime_binding PRIVATE - ${CMAKE_SOURCE_DIR}/../build/Linux/${CMAKE_BUILD_TYPE}/libonnxruntime.${ort_version}.dylib) + target_link_libraries(onnxruntime_binding PRIVATE libonnxruntime.${ort_version}.dylib) set_target_properties(onnxruntime_binding PROPERTIES INSTALL_RPATH "@loader_path") else() - target_link_libraries(onnxruntime_binding PRIVATE - ${CMAKE_SOURCE_DIR}/../build/Linux/${CMAKE_BUILD_TYPE}/libonnxruntime.so.${ort_version}) + target_link_libraries(onnxruntime_binding PRIVATE libonnxruntime.so.${ort_version}) set_target_properties(onnxruntime_binding PROPERTIES INSTALL_RPATH "$ORIGIN/") endif() @@ -54,14 +69,14 @@ if (WIN32) add_custom_command( TARGET onnxruntime_binding POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/../build/Windows/${CMAKE_BUILD_TYPE}/${CMAKE_BUILD_TYPE}/onnxruntime.dll + ${ONNXRUNTIME_BUILD_DIR}/${CMAKE_BUILD_TYPE}/onnxruntime.dll ${dist_folder} ) if (CMAKE_BUILD_TYPE STREQUAL "Debug") add_custom_command( TARGET onnxruntime_binding POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/../build/Windows/${CMAKE_BUILD_TYPE}/${CMAKE_BUILD_TYPE}/onnxruntime.pdb + ${ONNXRUNTIME_BUILD_DIR}/${CMAKE_BUILD_TYPE}/onnxruntime.pdb ${dist_folder} COMMAND ${CMAKE_COMMAND} -E copy $/onnxruntime_binding.pdb ${dist_folder} ) @@ -70,14 +85,14 @@ elseif (APPLE) add_custom_command( TARGET onnxruntime_binding POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/../build/Linux/${CMAKE_BUILD_TYPE}/libonnxruntime.${ort_version}.dylib + ${ONNXRUNTIME_BUILD_DIR}/libonnxruntime.${ort_version}.dylib ${dist_folder} ) elseif (UNIX) add_custom_command( TARGET onnxruntime_binding POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_SOURCE_DIR}/../build/Linux/${CMAKE_BUILD_TYPE}/libonnxruntime.so.${ort_version} + ${ONNXRUNTIME_BUILD_DIR}/libonnxruntime.so.${ort_version} ${dist_folder} ) else() diff --git a/nodejs/README.md b/nodejs/README.md index 9684320cd4..b5f08e6bdc 100644 --- a/nodejs/README.md +++ b/nodejs/README.md @@ -1,24 +1,35 @@ # ONNX Runtime Node.js API +ONNX Runtime Node.js binding enables Node.js applications to run ONNX model inference. + +## Usage + +Install the latest stable version: + +``` +npm install onnxruntime +``` + +Install the latest dev version: + +``` +npm install onnxruntime@dev +``` + +Refer to [Node.js samples](../samples/README.md#Nodejs) for samples and tutorials. + ## Requirements -Node.js version 12.x is required. +ONNXRuntime works on Node.js v12.x+ or Electron v5.x+. -### Supported Platforms +Following platforms are supported with pre-built binaries: - Windows x64 CPU NAPI_v3 - Linux x64 CPU NAPI_v3 - MacOS x64 CPU NAPI_v3 -## Usage -Samples can be found [here](../samples/nodejs). - -Install the latest stable version: `npm install onnxruntime` - -Install the latest dev version: `npm install onnxruntime@dev` - -## Build -See [BUILD.MD](../BUILD.md#apis-and-language-bindings) +To use on platforms without pre-built binaries, you can build Node.js binding from source and consume it by `npm install /nodejs/`. See also [BUILD.MD](../BUILD.md#apis-and-language-bindings) for building ONNX Runtime Node.js binding locally. ## License -License information can be found [here](../README.md#license). \ No newline at end of file + +License information can be found [here](../README.md#license). diff --git a/nodejs/package-lock.json b/nodejs/package-lock.json index 234fd75454..d482e33758 100644 --- a/nodejs/package-lock.json +++ b/nodejs/package-lock.json @@ -190,6 +190,12 @@ "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==", "dev": true }, + "@types/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=", + "dev": true + }, "@types/mocha": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz", diff --git a/nodejs/package.json b/nodejs/package.json index f234e42a99..ffbbd7e28b 100644 --- a/nodejs/package.json +++ b/nodejs/package.json @@ -7,9 +7,11 @@ "scripts": { "install": "prebuild-install -r napi || (tsc && node ./script/build)", "build": "tsc && node ./script/build", - "buildd": "tsc && node ./script/build --debug", + "buildd": "tsc && node ./script/build --config=Debug", + "buildr": "tsc && node ./script/build --config=RelWithDebInfo", "rebuild": "tsc && node ./script/build --rebuild", - "rebuildd": "tsc && node ./script/build --debug --rebuild", + "rebuildd": "tsc && node ./script/build --rebuild --config=Debug", + "rebuildr": "tsc && node ./script/build --rebuild --config=RelWithDebInfo", "test": "mocha ./test/test-main", "lint": "eslint . --ext .ts", "prepack": "node ./script/pack-prebuild", @@ -40,6 +42,7 @@ "devDependencies": { "@types/fs-extra": "^8.1.0", "@types/klaw-sync": "^6.0.0", + "@types/minimist": "1.2.0", "@types/mocha": "^7.0.2", "@types/tar-stream": "^2.1.0", "@typescript-eslint/eslint-plugin": "^2.29.0", @@ -54,6 +57,7 @@ "globby": "^11.0.0", "jsonc": "^2.0.0", "klaw-sync": "^6.0.0", + "minimist": "^1.2.5", "mocha": "^7.1.1", "node-addon-api": "^2.0.0", "node-pre-gyp-github": "^1.4.3", diff --git a/nodejs/script/build.ts b/nodejs/script/build.ts index f716bbd2da..f18136ed3b 100644 --- a/nodejs/script/build.ts +++ b/nodejs/script/build.ts @@ -1,14 +1,31 @@ import {execSync, spawnSync} from 'child_process'; import * as fs from 'fs-extra'; +import minimist from 'minimist'; import * as path from 'path'; +// NPM configs (parsed via 'npm install --xxx') + +// skip build on install. usually used in CI where build will be another step. +const SKIP = !!process.env.npm_config_ort_skip_build; +if (SKIP) { + process.exit(0); +} + // command line flags -const DEBUG = process.argv.slice(2).indexOf('--debug') !== -1; -const REBUILD = process.argv.slice(2).indexOf('--rebuild') !== -1; +const buildArgs = minimist(process.argv.slice(2)); + +// currently only support Debug, Release and RelWithDebInfo +const CONFIG: 'Debug'|'Release'|'RelWithDebInfo' = buildArgs.config || 'RelWithDebInfo'; +if (CONFIG !== 'Debug' && CONFIG !== 'Release' && CONFIG !== 'RelWithDebInfo') { + throw new Error(`unrecognized config: ${CONFIG}`); +} +const ONNXRUNTIME_BUILD_DIR = buildArgs['onnxruntime-build-dir']; +const REBUILD = !!buildArgs.rebuild; // build path const ROOT_FOLDER = path.join(__dirname, '..'); const BIN_FOLDER = path.join(ROOT_FOLDER, 'bin'); +const BUILD_FOLDER = path.join(ROOT_FOLDER, 'build'); const NPM_BIN_FOLDER = execSync('npm bin', {encoding: 'utf8'}).trim(); const CMAKE_JS_FULL_PATH = path.join(NPM_BIN_FOLDER, 'cmake-js'); @@ -16,19 +33,35 @@ const CMAKE_JS_FULL_PATH = path.join(NPM_BIN_FOLDER, 'cmake-js'); // if rebuild, clean up the dist folders if (REBUILD) { fs.removeSync(BIN_FOLDER); + fs.removeSync(BUILD_FOLDER); } const command = CMAKE_JS_FULL_PATH; -const args = [(REBUILD ? 'rebuild' : 'compile'), '--arch=x64', '--CDnapi_build_version=3']; -if (DEBUG) { - args.push('-D'); +const args = [ + (REBUILD ? 'reconfigure' : 'configure'), + '--arch=x64', + '--CDnapi_build_version=3', + `--CDCMAKE_BUILD_TYPE=${CONFIG}`, +]; +if (ONNXRUNTIME_BUILD_DIR && typeof ONNXRUNTIME_BUILD_DIR === 'string') { + args.push(`--CDONNXRUNTIME_BUILD_DIR=${ONNXRUNTIME_BUILD_DIR}`); } -// launch cmake-js -const proc = spawnSync(command, args, {shell: true, stdio: 'inherit', cwd: ROOT_FOLDER}); -if (proc.status !== 0) { - if (proc.error) { - console.error(proc.error); +// launch cmake-js configure +const procCmakejs = spawnSync(command, args, {shell: true, stdio: 'inherit', cwd: ROOT_FOLDER}); +if (procCmakejs.status !== 0) { + if (procCmakejs.error) { + console.error(procCmakejs.error); } - process.exit(proc.status === null ? undefined : proc.status); + process.exit(procCmakejs.status === null ? undefined : procCmakejs.status); +} + +// launch cmake to build +const procCmake = + spawnSync('cmake', ['--build', '.', '--config', CONFIG], {shell: true, stdio: 'inherit', cwd: BUILD_FOLDER}); +if (procCmake.status !== 0) { + if (procCmake.error) { + console.error(procCmake.error); + } + process.exit(procCmake.status === null ? undefined : procCmake.status); } diff --git a/nodejs/script/pack-prebuild.ts b/nodejs/script/pack-prebuild.ts index c5546e590e..5b0a0bf7af 100644 --- a/nodejs/script/pack-prebuild.ts +++ b/nodejs/script/pack-prebuild.ts @@ -23,7 +23,7 @@ tarStream.pipe(zlib.createGzip({level: 9})).pipe(ws); // enumerate all files under BIN folder const entries = klawSync(BIN_FOLDER, {nodir: true}).map(i => ({ path: i.path, - name: path.relative(ROOT_FOLDER, i.path), + name: path.relative(ROOT_FOLDER, i.path).replace(/\\/g, '/'), size: i.stats.size, mode: i.stats.mode | parseInt('444', 8) | parseInt('222', 8), gid: i.stats.gid, diff --git a/nodejs/test/e2e/inference-session-run.ts b/nodejs/test/e2e/inference-session-run.ts index 2ce08e4112..39264a3af9 100644 --- a/nodejs/test/e2e/inference-session-run.ts +++ b/nodejs/test/e2e/inference-session-run.ts @@ -22,5 +22,5 @@ describe('E2E Tests - InferenceSession.run()', async () => { const result = await session!.run({'data_0': input0}, ['softmaxout_1']); assertTensorEqual(result.softmaxout_1, expectedOutput0); } - }).timeout('60s'); + }).timeout('120s'); }); diff --git a/samples/README.md b/samples/README.md index 2b5c04bf9f..9850b15be7 100644 --- a/samples/README.md +++ b/samples/README.md @@ -59,17 +59,25 @@ For a list of available dockerfiles and published images to help with getting st * [MNIST inference](../java/src/test/java/sample/ScoreMNIST.java) ## Node.js -* [Basic Usage](./nodejs/01_basic-usage) -* [Create Tensor](./nodejs/01_basic-usage) -* [Create InferenceSession](./nodejs/01_basic-usage) - -In each example's implementation subdirectory, run +* [Create InferenceSession](./nodejs/04_create-inference-session/) - shows how to create `InferenceSession` in different ways. + +### Usage + +In each sample's implementation subdirectory, run + ``` npm install node ./ -``` \ No newline at end of file +``` diff --git a/tools/ci_build/build.py b/tools/ci_build/build.py index c0544aa826..8179977332 100755 --- a/tools/ci_build/build.py +++ b/tools/ci_build/build.py @@ -166,6 +166,11 @@ def parse_arguments(): parser.add_argument( "--build_java", action='store_true', help="Build Java bindings.") + # Node.js binding + parser.add_argument( + "--build_nodejs", action='store_true', + help="Build Node.js binding and NPM package.") + # Build a shared lib parser.add_argument( "--build_shared_lib", action='store_true', @@ -547,6 +552,7 @@ def generate_build_tree(cmake_path, source_dir, build_dir, cuda_home, "ON" if args.enable_pybind else "OFF"), "-Donnxruntime_BUILD_CSHARP=" + ("ON" if args.build_csharp else "OFF"), "-Donnxruntime_BUILD_JAVA=" + ("ON" if args.build_java else "OFF"), + "-Donnxruntime_BUILD_NODEJS=" + ("ON" if args.build_nodejs else "OFF"), "-Donnxruntime_BUILD_SHARED_LIB=" + ( "ON" if args.build_shared_lib else "OFF"), "-Donnxruntime_USE_EIGEN_FOR_BLAS=" + ( @@ -1561,7 +1567,7 @@ def main(): if args.build_wheel or args.gen_doc: args.enable_pybind = True - if args.build_csharp or args.build_java: + if args.build_csharp or args.build_java or args.build_nodejs: args.build_shared_lib = True # Disabling unit tests for VAD-F as FPGA only supports diff --git a/tools/ci_build/github/azure-pipelines/linux-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/linux-ci-pipeline.yml index b4ac1a51d2..e551143ef5 100644 --- a/tools/ci_build/github/azure-pipelines/linux-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/linux-ci-pipeline.yml @@ -3,7 +3,7 @@ jobs: parameters: AgentPool : 'Linux-CPU' JobName: 'Linux_CI_Dev' - BuildCommand: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -x "--use_mklml --use_llvm --use_nuphar --use_dnnl --use_tvm --build_wheel --build_java --enable_language_interop_ops --use_featurizers --wheel_name_suffix featurizers"' + BuildCommand: 'tools/ci_build/github/linux/run_dockerbuild.sh -o ubuntu16.04 -d cpu -r $(Build.BinariesDirectory) -x "--use_mklml --use_llvm --use_nuphar --use_dnnl --use_tvm --build_wheel --build_java --build_nodejs --enable_language_interop_ops --use_featurizers --wheel_name_suffix featurizers"' DoNugetPack: 'false' ArtifactName: 'drop-linux' TimeoutInMinutes: 120 diff --git a/tools/ci_build/github/azure-pipelines/mac-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/mac-ci-pipeline.yml index 4096e8c171..bce6b0e4f4 100644 --- a/tools/ci_build/github/azure-pipelines/mac-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/mac-ci-pipeline.yml @@ -2,4 +2,4 @@ jobs: - template: templates/mac-ci.yml parameters: DoNugetPack: 'false' - BuildCommand: 'python3 $(Build.SourcesDirectory)/tools/ci_build/build.py --use_openmp --build_dir $(Build.BinariesDirectory) --build_wheel --skip_submodule_sync --use_featurizers --parallel --build_shared_lib --build_java --enable_language_interop_ops --config Debug' + BuildCommand: 'python3 $(Build.SourcesDirectory)/tools/ci_build/build.py --use_openmp --build_dir $(Build.BinariesDirectory) --build_wheel --skip_submodule_sync --use_featurizers --parallel --build_shared_lib --build_java --build_nodejs --enable_language_interop_ops --config Debug' diff --git a/tools/ci_build/github/azure-pipelines/templates/mac-ci.yml b/tools/ci_build/github/azure-pipelines/templates/mac-ci.yml index 6b0c2525b3..df8eb6ee74 100644 --- a/tools/ci_build/github/azure-pipelines/templates/mac-ci.yml +++ b/tools/ci_build/github/azure-pipelines/templates/mac-ci.yml @@ -18,6 +18,9 @@ jobs: - checkout: self ${{ if ne(parameters.SubmoduleCheckoutMode, '') }}: submodules: ${{ parameters.SubmoduleCheckoutMode }} + - task: NodeTool@0 + inputs: + versionSpec: '12.x' - script: | export JAVA_HOME=/Library/Java/JavaVirtualMachines/zulu-11.jdk/Contents/Home java --version diff --git a/tools/ci_build/github/azure-pipelines/win-ci-pipeline.yml b/tools/ci_build/github/azure-pipelines/win-ci-pipeline.yml index b6143a5623..0f206ed32f 100644 --- a/tools/ci_build/github/azure-pipelines/win-ci-pipeline.yml +++ b/tools/ci_build/github/azure-pipelines/win-ci-pipeline.yml @@ -26,6 +26,10 @@ jobs: addToPath: true architecture: $(buildArch) + - task: NodeTool@0 + inputs: + versionSpec: '12.x' + - task: BatchScript@1 displayName: 'setup env' inputs: @@ -65,7 +69,7 @@ jobs: displayName: 'Generate cmake config' inputs: scriptPath: '$(Build.SourcesDirectory)\tools\ci_build\build.py' - arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_wheel --use_featurizers --use_dnnl --use_winml --use_openmp --build_shared_lib --enable_onnx_tests --enable_wcos --build_java' + arguments: '--config $(BuildConfig) --build_dir $(Build.BinariesDirectory) --skip_submodule_sync --build_shared_lib --update --cmake_generator "Visual Studio 16 2019" --build_wheel --use_featurizers --use_dnnl --use_winml --use_openmp --build_shared_lib --enable_onnx_tests --enable_wcos --build_java --build_nodejs' workingDirectory: '$(Build.BinariesDirectory)' - task: VSBuild@1 diff --git a/tools/ci_build/github/linux/docker/scripts/install_deps.sh b/tools/ci_build/github/linux/docker/scripts/install_deps.sh index c25d9f1db9..cb60444755 100755 --- a/tools/ci_build/github/linux/docker/scripts/install_deps.sh +++ b/tools/ci_build/github/linux/docker/scripts/install_deps.sh @@ -82,6 +82,9 @@ if [[ $SYS_LONG_BIT = "64" && "$GLIBC_VERSION" -gt "9" ]]; then echo "Installing cmake" GetFile https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5-Linux-x86_64.tar.gz /tmp/src/cmake-3.13.5-Linux-x86_64.tar.gz tar -zxf /tmp/src/cmake-3.13.5-Linux-x86_64.tar.gz --strip=1 -C /usr + echo "Installing Node.js" + GetFile https://nodejs.org/dist/v12.16.3/node-v12.16.3-linux-x64.tar.xz /tmp/src/node-v12.16.3-linux-x64.tar.xz + tar -xf /tmp/src/node-v12.16.3-linux-x64.tar.xz --strip=1 -C /usr else echo "Installing cmake" GetFile https://github.com/Kitware/CMake/releases/download/v3.13.5/cmake-3.13.5.tar.gz /tmp/src/cmake-3.13.5.tar.gz