@@ -20,6 +20,14 @@ const {
2020 UBUNTU_22_OS
2121} = require ( './ci_matrix_constants' ) ;
2222
23+ // TODO(NODE-7499): unpin npm version once Node 22 ships a bundled npm that can upgrade itself
24+ const NODE22_NPM_VERSION = '11.11.1' ;
25+
26+ /** Returns the major version number from a Node.js version string (e.g. 'v22.11.0', '20.19.0', 22). */
27+ function nodeMajorVersion ( version ) {
28+ return semver . coerce ( String ( version ) ) ?. major ;
29+ }
30+
2331const OPERATING_SYSTEMS = [
2432 {
2533 name : DEFAULT_OS ,
@@ -397,6 +405,12 @@ for (const {
397405 const expansions = { NODE_LTS_VERSION } ;
398406 const taskNames = tasks . map ( ( { name } ) => name ) ;
399407
408+ // bundled npm version in node v22.22.2 (v10.9.7) can't upgrade itself to @latest,
409+ // so we need to pin npm version for these variants to latest "upgradable" version
410+ if ( nodeMajorVersion ( NODE_LTS_VERSION ) === 22 ) {
411+ expansions . NPM_VERSION = NODE22_NPM_VERSION ;
412+ }
413+
400414 expansions . CLIENT_ENCRYPTION = String ( ! ! clientEncryption ) ;
401415 expansions . TEST_CSFLE = expansions . CLIENT_ENCRYPTION ;
402416
@@ -478,7 +492,9 @@ const unitTestTasks = Array.from(
478492 updateExpansions ( {
479493 NODE_LTS_VERSION
480494 } ) ,
481- { func : 'install dependencies' } ,
495+ nodeMajorVersion ( NODE_LTS_VERSION ) === 22
496+ ? { func : 'install dependencies' , vars : { NPM_VERSION : NODE22_NPM_VERSION } }
497+ : { func : 'install dependencies' } ,
482498 { func : 'run unit tests' }
483499 ]
484500 } ;
@@ -812,6 +828,53 @@ BUILD_VARIANTS.push({
812828 tasks : [ '.ssl' ]
813829} ) ;
814830
831+ // small subset of tests to run on nodeless environments
832+ const commonNodelessTasks = [
833+ 'test-latest-server' ,
834+ 'test-latest-replica_set' ,
835+ 'test-latest-sharded_cluster' ,
836+ 'test-rapid-server' ,
837+ 'test-rapid-replica_set' ,
838+ 'test-rapid-sharded_cluster' ,
839+ 'test-latest-server-v1-api' ,
840+ 'test-x509-authentication' ,
841+ 'test-atlas-connectivity' ,
842+ 'test-auth-ldap' ,
843+ 'test-socks5-csfle' ,
844+ 'test-socks5-tls' ,
845+ 'test-snappy-compression' ,
846+ 'test-zstd-compression' ,
847+ 'test-tls-support-latest'
848+ ] ;
849+ // small subset of linux-specific tests to run on nodeless environments
850+ const linuxOnlyTests = [
851+ 'test-rapid-load-balanced' ,
852+ 'test-latest-load-balanced' ,
853+ 'test-auth-kerberos'
854+ ] ;
855+
856+ const linuxNodelessTasks = commonNodelessTasks . concat ( linuxOnlyTests ) ;
857+
858+ const nodelessExpansions = {
859+ NODE_LTS_VERSION : LATEST_LTS ,
860+ CLIENT_ENCRYPTION : true ,
861+ MONGODB_BUNDLED : true
862+ } ;
863+ BUILD_VARIANTS . push ( {
864+ name : 'rhel8-nodeless' ,
865+ display_name : 'Nodeless' ,
866+ run_on : DEFAULT_OS ,
867+ tasks : linuxNodelessTasks ,
868+ expansions : nodelessExpansions
869+ } ) ;
870+ BUILD_VARIANTS . push ( {
871+ name : 'windows-nodeless' ,
872+ display_name : 'Windows Nodeless' ,
873+ run_on : WINDOWS_OS ,
874+ tasks : commonNodelessTasks ,
875+ expansions : nodelessExpansions
876+ } ) ;
877+
815878// TODO(NODE-4897): Debug socks5 tests on node latest
816879for ( const variant of BUILD_VARIANTS . filter (
817880 variant => variant . expansions && [ 'latest' ] . includes ( variant . expansions . NODE_LTS_VERSION )
0 commit comments