mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
C#: Gracefully handle non-zero exitcodes for dotnet --info.
This commit is contained in:
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.Collections.ObjectModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using Newtonsoft.Json.Linq;
|
||||
|
||||
using Semmle.Util;
|
||||
@@ -36,12 +37,29 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
||||
|
||||
public static IDotNet Make(ILogger logger, string? dotNetPath, TemporaryDirectory tempWorkingDirectory, DependabotProxy? dependabotProxy) => new DotNet(logger, dotNetPath, tempWorkingDirectory, dependabotProxy);
|
||||
|
||||
private static void HandleRetryExitCode143(string dotnet, int attempt, ILogger logger)
|
||||
{
|
||||
logger.LogWarning($"Running '{dotnet} --info' failed with exit code 143. Retrying...");
|
||||
var sleep = Math.Pow(2, attempt) * 1000;
|
||||
Thread.Sleep((int)sleep);
|
||||
}
|
||||
|
||||
private void Info()
|
||||
{
|
||||
var res = dotnetCliInvoker.RunCommand("--info", silent: false);
|
||||
if (!res)
|
||||
// Allow up to three retry attempts to run `dotnet --info`, to mitigate transient issues
|
||||
for (int attempt = 0; attempt < 4; attempt++)
|
||||
{
|
||||
throw new Exception($"{dotnetCliInvoker.Exec} --info failed.");
|
||||
var exitCode = dotnetCliInvoker.RunCommandExitCode("--info", silent: false);
|
||||
switch (exitCode)
|
||||
{
|
||||
case 0:
|
||||
return;
|
||||
case 143 when attempt < 3:
|
||||
HandleRetryExitCode143(dotnetCliInvoker.Exec, attempt, logger);
|
||||
break;
|
||||
default:
|
||||
throw new Exception($"{dotnetCliInvoker.Exec} --info failed with exit code {exitCode}.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,6 +211,34 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
||||
return BuildScript.Failure;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a script for running `dotnet --info`, with retries on exit code 143.
|
||||
/// </summary>
|
||||
public static BuildScript InfoScript(IBuildActions actions, string dotnet, IDictionary<string, string>? environment, ILogger logger)
|
||||
{
|
||||
var info = new CommandBuilder(actions, null, environment).
|
||||
RunCommand(dotnet).
|
||||
Argument("--info");
|
||||
var script = info.Script;
|
||||
for (int attempt = 0; attempt < 4; attempt++)
|
||||
{
|
||||
script = BuildScript.Bind(script, ret =>
|
||||
{
|
||||
switch (ret)
|
||||
{
|
||||
case 0:
|
||||
return BuildScript.Success;
|
||||
case 143 when attempt < 3:
|
||||
HandleRetryExitCode143(dotnet, attempt, logger);
|
||||
return info.Script;
|
||||
default:
|
||||
return BuildScript.Failure;
|
||||
}
|
||||
});
|
||||
}
|
||||
return script;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a script for downloading specific .NET SDK versions, if the
|
||||
/// versions are not already installed.
|
||||
@@ -292,9 +338,7 @@ namespace Semmle.Extraction.CSharp.DependencyFetching
|
||||
};
|
||||
}
|
||||
|
||||
var dotnetInfo = new CommandBuilder(actions, environment: MinimalEnvironment).
|
||||
RunCommand(actions.PathCombine(path, "dotnet")).
|
||||
Argument("--info").Script;
|
||||
var dotnetInfo = InfoScript(actions, actions.PathCombine(path, "dotnet"), MinimalEnvironment.ToDictionary(), logger);
|
||||
|
||||
Func<string, BuildScript> getInstallAndVerify = version =>
|
||||
// run `dotnet --info` after install, to check that it executes successfully
|
||||
|
||||
Reference in New Issue
Block a user