Skip to content

Commit 68da44e

Browse files
committed
Do not try running mono when it's not available on the runner
1 parent 159d31d commit 68da44e

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

Diff for: csharp/autobuilder/Semmle.Autobuild.CSharp.Tests/BuildScripts.cs

+30-5
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ bool IBuildActions.FileExists(string file)
4646

4747
public IList<string> RunProcessIn { get; } = new List<string>();
4848
public IDictionary<string, int> RunProcess { get; } = new Dictionary<string, int>();
49+
50+
/// <summary>
51+
/// Process-exit code pairs for commands that are executed during the assembly of the autobuild script.
52+
/// </summary>
53+
public IDictionary<string, int> RunProcessExecuteDuring { get; } = new Dictionary<string, int>();
4954
public IDictionary<string, string> RunProcessOut { get; } = new Dictionary<string, string>();
5055
public IDictionary<string, string> RunProcessWorkingDirectory { get; } = new Dictionary<string, string>();
5156
public HashSet<string> CreateDirectories { get; } = new HashSet<string>();
@@ -66,7 +71,7 @@ int IBuildActions.RunProcess(string cmd, string args, string? workingDirectory,
6671
if (wd != workingDirectory)
6772
throw new ArgumentException($"Unexpected RunProcessWorkingDirectory, got {wd ?? "null"} expected {workingDirectory ?? "null"} in {pattern}");
6873

69-
if (!RunProcess.TryGetValue(pattern, out var ret))
74+
if (!RunProcess.TryGetValue(pattern, out var ret) && !RunProcessExecuteDuring.TryGetValue(pattern, out ret))
7075
throw new ArgumentException("Missing RunProcess " + pattern);
7176

7277
return ret;
@@ -81,7 +86,7 @@ int IBuildActions.RunProcess(string cmd, string args, string? workingDirectory,
8186
if (wd != workingDirectory)
8287
throw new ArgumentException($"Unexpected RunProcessWorkingDirectory, got {wd ?? "null"} expected {workingDirectory ?? "null"} in {pattern}");
8388

84-
if (!RunProcess.TryGetValue(pattern, out var ret))
89+
if (!RunProcess.TryGetValue(pattern, out var ret) && !RunProcessExecuteDuring.TryGetValue(pattern, out ret))
8590
throw new ArgumentException("Missing RunProcess " + pattern);
8691

8792
return ret;
@@ -797,11 +802,32 @@ public void TestDirsProjWindows()
797802
}
798803

799804
[Fact]
800-
public void TestDirsProjLinux()
805+
public void TestDirsProjLinux_WithMono()
801806
{
807+
actions.RunProcessExecuteDuring[@"mono --version"] = 0;
808+
802809
actions.RunProcess[@"nuget restore C:\Project/dirs.proj -DisableParallelProcessing"] = 1;
803810
actions.RunProcess[@"mono scratch/.nuget/nuget.exe restore C:\Project/dirs.proj -DisableParallelProcessing"] = 0;
804811
actions.RunProcess[@"msbuild C:\Project/dirs.proj /t:rebuild"] = 0;
812+
813+
var autobuilder = TestDirsProjLinux();
814+
TestAutobuilderScript(autobuilder, 0, 3);
815+
}
816+
817+
[Fact]
818+
public void TestDirsProjLinux_WithoutMono()
819+
{
820+
actions.RunProcessExecuteDuring[@"mono --version"] = 1;
821+
822+
actions.RunProcess[@"dotnet msbuild /t:restore C:\Project/dirs.proj"] = 0;
823+
actions.RunProcess[@"dotnet msbuild C:\Project/dirs.proj /t:rebuild"] = 0;
824+
825+
var autobuilder = TestDirsProjLinux();
826+
TestAutobuilderScript(autobuilder, 0, 2);
827+
}
828+
829+
private CSharpAutobuilder TestDirsProjLinux()
830+
{
805831
actions.FileExists["csharp.log"] = true;
806832
actions.FileExists[@"C:\Project/a/test.csproj"] = true;
807833
actions.FileExists[@"C:\Project/dirs.proj"] = true;
@@ -830,8 +856,7 @@ public void TestDirsProjLinux()
830856
</Project>");
831857
actions.LoadXml[@"C:\Project/dirs.proj"] = dirsproj;
832858

833-
var autobuilder = CreateAutoBuilder(false);
834-
TestAutobuilderScript(autobuilder, 0, 3);
859+
return CreateAutoBuilder(false);
835860
}
836861

837862
[Fact]

Diff for: csharp/autobuilder/Semmle.Autobuild.Shared/MsBuildRule.cs

+13-7
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,13 @@ internal static class MsBuildCommandExtensions
1010
/// <summary>
1111
/// Appends a call to msbuild.
1212
/// </summary>
13-
/// <param name="cmdBuilder"></param>
14-
/// <param name="builder"></param>
1513
/// <returns></returns>
16-
public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAutobuilder<AutobuildOptionsShared> builder)
14+
public static CommandBuilder MsBuildCommand(this CommandBuilder cmdBuilder, IAutobuilder<AutobuildOptionsShared> builder, bool preferDotnet)
1715
{
1816
// mono doesn't ship with `msbuild` on Arm-based Macs, but we can fall back to
1917
// msbuild that ships with `dotnet` which can be invoked with `dotnet msbuild`
2018
// perhaps we should do this on all platforms?
21-
return builder.Actions.IsRunningOnAppleSilicon()
19+
return builder.Actions.IsRunningOnAppleSilicon() || preferDotnet
2220
? cmdBuilder.RunCommand("dotnet").Argument("msbuild")
2321
: cmdBuilder.RunCommand("msbuild");
2422
}
@@ -75,13 +73,21 @@ BuildScript GetNugetRestoreScript() =>
7573
QuoteArgument(projectOrSolution.FullPath).
7674
Argument("-DisableParallelProcessing").
7775
Script;
76+
77+
BuildScript GetMonoVersionScript() => new CommandBuilder(builder.Actions).
78+
RunCommand("mono").
79+
Argument("--version").
80+
Script;
81+
82+
var preferDotnet = !builder.Actions.IsWindows() && GetMonoVersionScript().Run(builder.Actions, (_, _) => { }, (_, _, _) => { }) != 0;
83+
7884
var nugetRestore = GetNugetRestoreScript();
7985
var msbuildRestoreCommand = new CommandBuilder(builder.Actions).
80-
MsBuildCommand(builder).
86+
MsBuildCommand(builder, preferDotnet).
8187
Argument("/t:restore").
8288
QuoteArgument(projectOrSolution.FullPath);
8389

84-
if (builder.Actions.IsRunningOnAppleSilicon())
90+
if (builder.Actions.IsRunningOnAppleSilicon() || preferDotnet)
8591
{
8692
// On Apple Silicon, only try package restore with `dotnet msbuild /t:restore`
8793
ret &= BuildScript.Try(msbuildRestoreCommand.Script);
@@ -119,7 +125,7 @@ BuildScript GetNugetRestoreScript() =>
119125
command.RunCommand("set Platform=&& type NUL", quoteExe: false);
120126
}
121127

122-
command.MsBuildCommand(builder);
128+
command.MsBuildCommand(builder, preferDotnet);
123129
command.QuoteArgument(projectOrSolution.FullPath);
124130

125131
var target = "rebuild";

0 commit comments

Comments
 (0)