@@ -125,7 +125,7 @@ public async Task RunAsync()
125125 ExecutionContext . PublishTaskRunnerTelemetry ( telemetryData ) ;
126126
127127 await VsoTaskLibManager . DownloadVsoTaskLibAsync ( ExecutionContext ) ;
128-
128+
129129 // Ensure compat vso-task-lib exist at the root of _work folder
130130 // This will make vsts-agent work against 2015 RTM/QU1 TFS, since tasks in those version doesn't package with task lib
131131 // Put the 0.5.5 version vso-task-lib into the root of _work/node_modules folder, so tasks are able to find those lib.
@@ -205,7 +205,7 @@ public async Task RunAsync()
205205 }
206206 else
207207 {
208- node20ResultsInGlibCErrorHost = await CheckIfNode20ResultsInGlibCError ( ) ;
208+ node20ResultsInGlibCErrorHost = await CheckIfNodeResultsInGlibCError ( NodeHandler . Node20_1Folder ) ;
209209 ExecutionContext . EmitHostNode20FallbackTelemetry ( node20ResultsInGlibCErrorHost ) ;
210210 supportsNode20 = ! node20ResultsInGlibCErrorHost ;
211211 }
@@ -218,8 +218,8 @@ public async Task RunAsync()
218218 }
219219 else
220220 {
221- node24ResultsInGlibCErrorHost = await CheckIfNode24ResultsInGlibCError ( ) ;
222- ExecutionContext . EmitHostNode24FallbackTelemetry ( node24ResultsInGlibCErrorHost ) ; // Add this method
221+ node24ResultsInGlibCErrorHost = await CheckIfNodeResultsInGlibCError ( NodeHandler . Node24Folder ) ;
222+ ExecutionContext . EmitHostNode24FallbackTelemetry ( node24ResultsInGlibCErrorHost ) ;
223223 supportsNode24 = ! node24ResultsInGlibCErrorHost ;
224224 }
225225 }
@@ -317,21 +317,47 @@ public async Task RunAsync()
317317 }
318318 }
319319
320- private async Task < bool > CheckIfNode20ResultsInGlibCError ( )
320+ private async Task < bool > CheckIfNodeResultsInGlibCError ( string nodeFolder )
321321 {
322- var node20 = Path . Combine ( HostContext . GetDirectory ( WellKnownDirectory . Externals ) , NodeHandler . Node20_1Folder , "bin" , $ "node{ IOUtil . ExeExtension } ") ;
323- List < string > nodeVersionOutput = await ExecuteCommandAsync ( ExecutionContext , node20 , "-v" , requireZeroExitCode : false , showOutputOnFailureOnly : true ) ;
324- var node20ResultsInGlibCError = WorkerUtilities . IsCommandResultGlibcError ( ExecutionContext , nodeVersionOutput , out string nodeInfoLine ) ;
322+ var nodePath = Path . Combine ( HostContext . GetDirectory ( WellKnownDirectory . Externals ) , nodeFolder , "bin" , $ "node{ IOUtil . ExeExtension } ") ;
323+ List < string > nodeVersionOutput = await ExecuteCommandAsync ( ExecutionContext , nodePath , "-v" , requireZeroExitCode : false , showOutputOnFailureOnly : true ) ;
324+ var nodeResultsInGlibCError = WorkerUtilities . IsCommandResultGlibcError ( ExecutionContext , nodeVersionOutput , out string nodeInfoLine ) ;
325325
326- return node20ResultsInGlibCError ;
326+ return nodeResultsInGlibCError ;
327327 }
328- private async Task < bool > CheckIfNode24ResultsInGlibCError ( )
328+
329+ private string GetNodeFolderWithFallback ( string preferredNodeFolder , bool node20ResultsInGlibCError , bool node24ResultsInGlibCError , bool inContainer )
329330 {
330- var node24 = Path . Combine ( HostContext . GetDirectory ( WellKnownDirectory . Externals ) , NodeHandler . Node24Folder , "bin" , $ "node{ IOUtil . ExeExtension } ") ;
331- List < string > nodeVersionOutput = await ExecuteCommandAsync ( ExecutionContext , node24 , "-v" , requireZeroExitCode : false , showOutputOnFailureOnly : true ) ;
332- var node24ResultsInGlibCError = WorkerUtilities . IsCommandResultGlibcError ( ExecutionContext , nodeVersionOutput , out string nodeInfoLine ) ;
331+ switch ( preferredNodeFolder )
332+ {
333+ case var folder when folder == NodeHandler . Node24Folder :
334+ if ( node24ResultsInGlibCError )
335+ {
336+ // Fallback to Node20, then Node16 if Node20 also fails
337+ if ( node20ResultsInGlibCError )
338+ {
339+ NodeFallbackWarning ( "20" , "16" , inContainer ) ;
340+ return NodeHandler . Node16Folder ;
341+ }
342+ else
343+ {
344+ NodeFallbackWarning ( "24" , "20" , inContainer ) ;
345+ return NodeHandler . Node20_1Folder ;
346+ }
347+ }
348+ return NodeHandler . Node24Folder ;
349+
350+ case var folder when folder == NodeHandler . Node20_1Folder :
351+ if ( node20ResultsInGlibCError )
352+ {
353+ NodeFallbackWarning ( "20" , "16" , inContainer ) ;
354+ return NodeHandler . Node16Folder ;
355+ }
356+ return NodeHandler . Node20_1Folder ;
333357
334- return node24ResultsInGlibCError ;
358+ default :
359+ return preferredNodeFolder ;
360+ }
335361 }
336362
337363 public string GetNodeLocation ( bool node20ResultsInGlibCError , bool node24ResultsInGlibCError , bool inContainer )
@@ -350,39 +376,12 @@ public string GetNodeLocation(bool node20ResultsInGlibCError, bool node24Results
350376 if ( taskHasNode24Data )
351377 {
352378 Trace . Info ( $ "Task.json has node24 handler data: { taskHasNode24Data } ") ;
353-
354- if ( node24ResultsInGlibCError )
355- {
356- // Fallback to Node20, then Node16 if Node20 also fails
357- if ( node20ResultsInGlibCError )
358- {
359- nodeFolder = NodeHandler . Node16Folder ;
360- Node16FallbackWarning ( inContainer ) ;
361- }
362- else
363- {
364- nodeFolder = NodeHandler . Node20_1Folder ;
365- Node20FallbackWarning ( inContainer ) ;
366- }
367- }
368- else
369- {
370- nodeFolder = NodeHandler . Node24Folder ;
371- }
379+ nodeFolder = GetNodeFolderWithFallback ( NodeHandler . Node24Folder , node20ResultsInGlibCError , node24ResultsInGlibCError , inContainer ) ;
372380 }
373381 else if ( taskHasNode20_1Data )
374382 {
375383 Trace . Info ( $ "Task.json has node20_1 handler data: { taskHasNode20_1Data } node20ResultsInGlibCError = { node20ResultsInGlibCError } ") ;
376-
377- if ( node20ResultsInGlibCError )
378- {
379- nodeFolder = NodeHandler . Node16Folder ;
380- Node16FallbackWarning ( inContainer ) ;
381- }
382- else
383- {
384- nodeFolder = NodeHandler . Node20_1Folder ;
385- }
384+ nodeFolder = GetNodeFolderWithFallback ( NodeHandler . Node20_1Folder , node20ResultsInGlibCError , node24ResultsInGlibCError , inContainer ) ;
386385 }
387386 else if ( taskHasNode16Data )
388387 {
@@ -403,42 +402,15 @@ public string GetNodeLocation(bool node20ResultsInGlibCError, bool node24Results
403402 if ( useNode24 )
404403 {
405404 Trace . Info ( $ "Found UseNode24 knob, using node24 for node tasks: { useNode24 } ") ;
406-
407- if ( node24ResultsInGlibCError )
408- {
409- // Fallback to Node20, then Node16 if Node20 also fails
410- if ( node20ResultsInGlibCError )
411- {
412- nodeFolder = NodeHandler . Node16Folder ;
413- Node16FallbackWarning ( inContainer ) ;
414- }
415- else
416- {
417- nodeFolder = NodeHandler . Node20_1Folder ;
418- Node20FallbackWarning ( inContainer ) ;
419- }
420- }
421- else
422- {
423- nodeFolder = NodeHandler . Node24Folder ;
424- }
405+ nodeFolder = GetNodeFolderWithFallback ( NodeHandler . Node24Folder , node20ResultsInGlibCError , node24ResultsInGlibCError , inContainer ) ;
425406 }
426- if ( useNode20_1 )
407+ else if ( useNode20_1 )
427408 {
428409 Trace . Info ( $ "Found UseNode20_1 knob, using node20_1 for node tasks { useNode20_1 } node20ResultsInGlibCError = { node20ResultsInGlibCError } ") ;
429-
430- if ( node20ResultsInGlibCError )
431- {
432- nodeFolder = NodeHandler . Node16Folder ;
433- Node16FallbackWarning ( inContainer ) ;
434- }
435- else
436- {
437- nodeFolder = NodeHandler . Node20_1Folder ;
438- }
410+ nodeFolder = GetNodeFolderWithFallback ( NodeHandler . Node20_1Folder , node20ResultsInGlibCError , node24ResultsInGlibCError , inContainer ) ;
439411 }
440412
441- if ( useNode10 )
413+ else if ( useNode10 )
442414 {
443415 Trace . Info ( $ "Found UseNode10 knob, use node10 for node tasks: { useNode10 } ") ;
444416 nodeFolder = NodeHandler . node10Folder ;
@@ -501,37 +473,14 @@ public string GetNodeLocation(bool node20ResultsInGlibCError, bool node24Results
501473 return nodeHandlerHelper . GetNodeFolderPath ( nodeFolder , HostContext ) ;
502474 }
503475
504- private void Node16FallbackWarning ( bool inContainer )
476+ private void NodeFallbackWarning ( string fromVersion , string toVersion , bool inContainer )
505477 {
506- if ( inContainer )
507- {
508- ExecutionContext . Warning ( $ "The container operating system doesn't support Node20. Using Node16 instead. " +
509- "Please upgrade the operating system of the container to remain compatible with future updates of tasks: " +
510- "https://github.com/nodesource/distributions" ) ;
511- }
512- else
513- {
514- ExecutionContext . Warning ( $ "The agent operating system doesn't support Node20. Using Node16 instead. " +
515- "Please upgrade the operating system of the agent to remain compatible with future updates of tasks: " +
478+ string systemType = inContainer ? "container" : "agent" ;
479+ ExecutionContext . Warning ( $ "The { systemType } operating system doesn't support Node{ fromVersion } . Using Node{ toVersion } instead. " +
480+ $ "Please upgrade the operating system of the { systemType } to remain compatible with future updates of tasks: " +
516481 "https://github.com/nodesource/distributions" ) ;
517- }
518482 }
519483
520- private void Node20FallbackWarning ( bool inContainer )
521- {
522- if ( inContainer )
523- {
524- ExecutionContext . Warning ( $ "The container operating system doesn't support Node24. Using Node20 instead. " +
525- "Please upgrade the operating system of the container to remain compatible with future updates of tasks." ) ;
526- }
527- else
528- {
529- ExecutionContext . Warning ( $ "The agent operating system doesn't support Node24. Using Node20 instead. " +
530- "Please upgrade the operating system of the agent to remain compatible with future updates of tasks." ) ;
531- }
532- }
533-
534-
535484 private void OnDataReceived ( object sender , ProcessDataReceivedEventArgs e )
536485 {
537486 // drop any outputs after the task get force completed.
0 commit comments