diff --git a/.evergreen/config.in.yml b/.evergreen/config.in.yml index 6dcf78a74f6..452bbc2fba8 100644 --- a/.evergreen/config.in.yml +++ b/.evergreen/config.in.yml @@ -191,7 +191,7 @@ functions: MONGODB_URI="${MONGODB_URI}" \ AUTH=${AUTH} SSL=${SSL} TEST_CSFLE=true \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} SKIP_DEPS=${SKIP_DEPS|1} \ + SKIP_DEPS=${SKIP_DEPS|1} \ bash ${PROJECT_DIRECTORY}/.evergreen/run-tests.sh "run serverless tests": @@ -291,7 +291,6 @@ functions: AUTH=${AUTH} \ SSL=${SSL} \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} \ SINGLE_MONGOS_LB_URI="${SINGLE_MONGOS_LB_URI}" \ MULTI_MONGOS_LB_URI="${MULTI_MONGOS_LB_URI}" \ TOPOLOGY="${TOPOLOGY}" \ @@ -312,7 +311,6 @@ functions: AUTH=${AUTH} \ SSL=${SSL} \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} \ TOPOLOGY="${TOPOLOGY}" \ COMPRESSOR="${COMPRESSOR}" \ SKIP_DEPS=${SKIP_DEPS|1} \ @@ -457,9 +455,6 @@ functions: ${PREPARE_SHELL} NODE_LTS_NAME=${NODE_LTS_NAME} NPM_OPTIONS=${NPM_OPTIONS}\ bash ${PROJECT_DIRECTORY}/.evergreen/install-dependencies.sh - - command: expansions.update - params: - file: src/deps-expansion.yml "install aws-credential-providers": - command: shell.exec diff --git a/.evergreen/config.yml b/.evergreen/config.yml index 7c22c8ec070..0507ff27f9c 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -161,7 +161,7 @@ functions: MONGODB_URI="${MONGODB_URI}" \ AUTH=${AUTH} SSL=${SSL} TEST_CSFLE=true \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} SKIP_DEPS=${SKIP_DEPS|1} \ + SKIP_DEPS=${SKIP_DEPS|1} \ bash ${PROJECT_DIRECTORY}/.evergreen/run-tests.sh run serverless tests: - command: timeout.update @@ -257,7 +257,6 @@ functions: AUTH=${AUTH} \ SSL=${SSL} \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} \ SINGLE_MONGOS_LB_URI="${SINGLE_MONGOS_LB_URI}" \ MULTI_MONGOS_LB_URI="${MULTI_MONGOS_LB_URI}" \ TOPOLOGY="${TOPOLOGY}" \ @@ -277,7 +276,6 @@ functions: AUTH=${AUTH} \ SSL=${SSL} \ MONGODB_API_VERSION="${MONGODB_API_VERSION}" \ - NODE_VERSION=${NODE_VERSION} \ TOPOLOGY="${TOPOLOGY}" \ COMPRESSOR="${COMPRESSOR}" \ SKIP_DEPS=${SKIP_DEPS|1} \ @@ -407,9 +405,6 @@ functions: ${PREPARE_SHELL} NODE_LTS_NAME=${NODE_LTS_NAME} NPM_OPTIONS=${NPM_OPTIONS}\ bash ${PROJECT_DIRECTORY}/.evergreen/install-dependencies.sh - - command: expansions.update - params: - file: src/deps-expansion.yml install aws-credential-providers: - command: shell.exec type: setup diff --git a/.evergreen/init-nvm.sh b/.evergreen/init-nvm.sh index 46a2f247524..28d14f16d83 100644 --- a/.evergreen/init-nvm.sh +++ b/.evergreen/init-nvm.sh @@ -1,21 +1,13 @@ #! /usr/bin/env bash export PATH="/opt/mongodbtoolchain/v2/bin:$PATH" -NODE_ARTIFACTS_PATH="${PROJECT_DIRECTORY}/node-artifacts" -export NVM_DIR="${NODE_ARTIFACTS_PATH}/nvm" +NODE_ARTIFACTS_PATH="${PROJECT_DIRECTORY}/node-artifacts" if [[ "$OS" == "Windows_NT" ]]; then - NVM_HOME=$(cygpath -w "$NVM_DIR") - export NVM_HOME - NVM_SYMLINK=$(cygpath -w "$NODE_ARTIFACTS_PATH/bin") - export NVM_SYMLINK - NVM_ARTIFACTS_PATH=$(cygpath -w "$NODE_ARTIFACTS_PATH/bin") - export NVM_ARTIFACTS_PATH - PATH=$(cygpath $NVM_SYMLINK):$(cygpath $NVM_HOME):$PATH - export PATH - echo "updated path on windows PATH=$PATH" -else - [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh" + NODE_ARTIFACTS_PATH=$(cygpath --unix "$NODE_ARTIFACTS_PATH") fi +export PATH="$NODE_ARTIFACTS_PATH/npm_global/bin:$NODE_ARTIFACTS_PATH/nodejs/bin:$PATH" +hash -r + export NODE_OPTIONS="--trace-deprecation --trace-warnings" diff --git a/.evergreen/install-dependencies.sh b/.evergreen/install-dependencies.sh index 3e2634be2f2..7a4575578fe 100644 --- a/.evergreen/install-dependencies.sh +++ b/.evergreen/install-dependencies.sh @@ -1,105 +1,95 @@ -#!/bin/bash +#!/usr/bin/env bash set -o errexit # Exit the script with error if any of the commands fail -NVM_WINDOWS_URL="https://github.com/coreybutler/nvm-windows/releases/download/1.1.9/nvm-noinstall.zip" -NVM_URL="https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh" - NODE_LTS_NAME=${NODE_LTS_NAME:-fermium} -NODE_ARTIFACTS_PATH="${PROJECT_DIRECTORY}/node-artifacts" - -# this needs to be explicitly exported for the nvm install below -export NVM_DIR="${NODE_ARTIFACTS_PATH}/nvm" -export XDG_CONFIG_HOME=${NODE_ARTIFACTS_PATH} - -# create node artifacts path if needed -mkdir -p "${NODE_ARTIFACTS_PATH}" - -function node_lts_to_version() { - case $1 in - "fermium") - echo 14 - ;; - "gallium") - echo 16 - ;; - "hydrogen") - echo 18 - ;; - "iron") - echo 20 - ;; - "latest") - echo 'latest' - ;; - *) - echo "Unsupported Node LTS version $1" - ;; - esac -} - -function latest_version_for_node_major() { - local __NODE_MAJOR_VERSION=$1 - local NODE_DOWNLOAD_URI="https://nodejs.org/download/release/latest-v${__NODE_MAJOR_VERSION}.x/SHASUMS256.txt" - - if [ $__NODE_MAJOR_VERSION == 'latest' ] - then - NODE_DOWNLOAD_URI="https://nodejs.org/download/release/latest/SHASUMS256.txt" - fi - - # check that the requested version does exist - curl --silent --fail $NODE_DOWNLOAD_URI &> /dev/null - - echo $(curl --retry 8 --retry-delay 5 --max-time 50 --silent -o- $NODE_DOWNLOAD_URI | head -n 1 | awk '{print $2};' | cut -d- -f2) -} - -NODE_MAJOR_VERSION=$(node_lts_to_version $NODE_LTS_NAME) -NODE_VERSION=$(latest_version_for_node_major $NODE_MAJOR_VERSION) -NODE_VERSION=${NODE_VERSION:1} # :1 gets rid of the leading 'v' - -echo "set version to $NODE_VERSION" - -# output node version to expansions file for use in subsequent scripts -cat < deps-expansion.yml - NODE_VERSION: "$NODE_VERSION" -EOT +NODE_ARTIFACTS_PATH="${PROJECT_DIRECTORY:-$(pwd)}/node-artifacts" +if [[ "$OS" = "Windows_NT" ]]; then NODE_ARTIFACTS_PATH=$(cygpath --unix "$NODE_ARTIFACTS_PATH"); fi + +mkdir -p "$NODE_ARTIFACTS_PATH/npm_global" + +# Comparisons are all case insensitive +shopt -s nocasematch + +# index.tab is a sorted tab separated values file with the following headers +# 0 1 2 3 4 5 6 7 8 9 10 +# version date files npm v8 uv zlib openssl modules lts security +curl --retry 8 -sS "https://nodejs.org/dist/index.tab" --max-time 300 --output node_index.tab + +while IFS=$'\t' read -r -a row; do + node_index_version="${row[0]}" + node_index_date="${row[1]}" + node_index_lts="${row[9]}" + [[ "$node_index_version" = "version" ]] && continue # skip tsv header + [[ "$NODE_LTS_NAME" = "latest" ]] && break # first line is latest + [[ "$NODE_LTS_NAME" = "$node_index_lts" ]] && break # case insensitive compare +done < node_index.tab + +if [[ "$OS" = "Windows_NT" ]]; then + operating_system="win" +elif [[ $(uname) = "darwin" ]]; then + operating_system="darwin" +elif [[ $(uname) = "linux" ]]; then + operating_system="linux" +else + echo "Unable to determine operating system: $operating_system" + exit 1 +fi -# install Node.js on Windows -if [[ "$OS" == "Windows_NT" ]]; then - # Delete pre-existing node to avoid version conflicts - rm -rf "/cygdrive/c/Program Files/nodejs" +architecture=$(uname -m) +if [[ $architecture = "x86_64" ]]; then + architecture="x64" +elif [[ $architecture = "arm64" ]]; then + architecture="arm64" +elif [[ $architecture == s390* ]]; then + architecture="s390x" +elif [[ $architecture == ppc* ]]; then + architecture="ppc64le" +else + echo "Unable to determine operating system: $architecture" + exit 1 +fi +file_extension="tar.gz" +if [[ "$OS" = "Windows_NT" ]]; then file_extension="zip"; fi - NVM_HOME=$(cygpath -w "$NVM_DIR") - export NVM_HOME - NVM_SYMLINK=$(cygpath -w "$NODE_ARTIFACTS_PATH/bin") - export NVM_SYMLINK - NVM_ARTIFACTS_PATH=$(cygpath -w "$NODE_ARTIFACTS_PATH/bin") - export NVM_ARTIFACTS_PATH - PATH=$(cygpath $NVM_SYMLINK):$(cygpath $NVM_HOME):$PATH - export PATH +node_directory="node-${node_index_version}-${operating_system}-${architecture}" +node_archive="${node_directory}.${file_extension}" +node_archive_path="$NODE_ARTIFACTS_PATH/${node_archive}" +node_download_url="https://nodejs.org/dist/${node_index_version}/${node_archive}" - curl -L $NVM_WINDOWS_URL -o nvm.zip - unzip -d "$NVM_DIR" nvm.zip - rm nvm.zip +echo "Node.js ${node_index_version} for ${operating_system}-${architecture} released on ${node_index_date}" - chmod 777 "$NVM_DIR" - chmod -R a+rx "$NVM_DIR" +set -o xtrace - cat < "$NVM_DIR/settings.txt" -root: $NVM_HOME -path: $NVM_SYMLINK -EOT - nvm install "$NODE_VERSION" - nvm use "$NODE_VERSION" - which node || echo "node not found, PATH=$PATH" - which npm || echo "npm not found, PATH=$PATH" - npm cache clear --force # Fixes: Cannot read properties of null (reading 'pickAlgorithm') error on windows +curl --fail --retry 8 -sS "${node_download_url}" --max-time 300 --output "$node_archive_path" -# install Node.js on Linux/MacOS +if [[ "$file_extension" = "zip" ]]; then + unzip -q "$node_archive_path" -d "${NODE_ARTIFACTS_PATH}" + mkdir -p "${NODE_ARTIFACTS_PATH}/nodejs" + # Windows "bins" are at the top level + mv "${NODE_ARTIFACTS_PATH}/${node_directory}" "${NODE_ARTIFACTS_PATH}/nodejs/bin" + # Need to add executable flag ourselves + chmod +x "${NODE_ARTIFACTS_PATH}/nodejs/bin/node.exe" + chmod +x "${NODE_ARTIFACTS_PATH}/nodejs/bin/npm" else - curl -o- $NVM_URL | bash - [ -s "${NVM_DIR}/nvm.sh" ] && source "${NVM_DIR}/nvm.sh" - nvm install --no-progress "$NODE_VERSION" + tar -xf "$node_archive_path" -C "${NODE_ARTIFACTS_PATH}" + mv "${NODE_ARTIFACTS_PATH}/${node_directory}" "${NODE_ARTIFACTS_PATH}/nodejs" fi -npm install ${NPM_OPTIONS} +export PATH="$NODE_ARTIFACTS_PATH/npm_global/bin:$NODE_ARTIFACTS_PATH/nodejs/bin:$PATH" +hash -r + +# Set npm -g prefix to our local artifacts directory +cat < .npmrc +prefix=$NODE_ARTIFACTS_PATH/npm_global +EOT + +if [[ $operating_system != "win" ]]; then + # Update npm to latest when we can + npm install --global npm@latest + hash -r +fi + +echo "npm version: $(npm -v)" + +npm install "${NPM_OPTIONS}" diff --git a/.evergreen/run-benchmarks.sh b/.evergreen/run-benchmarks.sh index c4fc7fd4aa5..d8347077a86 100644 --- a/.evergreen/run-benchmarks.sh +++ b/.evergreen/run-benchmarks.sh @@ -1,6 +1,6 @@ #! /bin/bash -[ -s "$PROJECT_DIRECTORY/node-artifacts/nvm/nvm.sh" ] && source "$PROJECT_DIRECTORY"/node-artifacts/nvm/nvm.sh +source "${PROJECT_DIRECTORY}/.evergreen/init-nvm.sh" export MONGODB_URI=$MONGODB_URI diff --git a/.evergreen/run-custom-csfle-tests.sh b/.evergreen/run-custom-csfle-tests.sh index 5511f37140d..957f5386fbd 100644 --- a/.evergreen/run-custom-csfle-tests.sh +++ b/.evergreen/run-custom-csfle-tests.sh @@ -12,7 +12,7 @@ export CSFLE_KMS_PROVIDERS=${CSFLE_KMS_PROVIDERS} export CRYPT_SHARED_LIB_PATH=${CRYPT_SHARED_LIB_PATH} echo "csfle CRYPT_SHARED_LIB_PATH: $CRYPT_SHARED_LIB_PATH" -[ -s "$PROJECT_DIRECTORY/node-artifacts/nvm/nvm.sh" ] && source "$PROJECT_DIRECTORY"/node-artifacts/nvm/nvm.sh +source "${PROJECT_DIRECTORY}/.evergreen/init-nvm.sh" set -o xtrace # Write all commands first to stderr set -o errexit # Exit the script with error if any of the commands fail diff --git a/.gitignore b/.gitignore index 6bcaaae526c..1f0eb75d328 100644 --- a/.gitignore +++ b/.gitignore @@ -88,3 +88,7 @@ etc/docs/build !docs/**/*.css !docs/**/*.js .nvmrc + +node_index.tab +node-artifacts +.npmrc