[Harness] Move logic to create the device tests our of Jenkins.cs (#8699)
Making Jenkins just orchestrate. Later this class will be testable.
This commit is contained in:
Родитель
d241d8dae1
Коммит
da6e6f2800
|
@ -17,7 +17,7 @@ using Xharness.Jenkins.Reports;
|
|||
namespace Xharness.Jenkins {
|
||||
class Jenkins {
|
||||
public readonly ISimulatorLoader Simulators;
|
||||
readonly IHardwareDeviceLoader devices;
|
||||
public readonly IHardwareDeviceLoader Devices;
|
||||
readonly IProcessManager processManager;
|
||||
public ITunnelBore TunnelBore { get; private set; }
|
||||
readonly TestSelector testSelector;
|
||||
|
@ -97,10 +97,10 @@ namespace Xharness.Jenkins {
|
|||
this.TunnelBore = tunnelBore ?? throw new ArgumentNullException (nameof (tunnelBore));
|
||||
Harness = harness ?? throw new ArgumentNullException (nameof (harness));
|
||||
Simulators = new SimulatorLoader (processManager);
|
||||
devices = new HardwareDeviceLoader (processManager);
|
||||
Devices = new HardwareDeviceLoader (processManager);
|
||||
testSelector = new TestSelector (this, processManager, new GitHub (harness, processManager));
|
||||
testVariationsFactory = new TestVariationsFactory (this, processManager);
|
||||
DeviceLoader = new JenkinsDeviceLoader (Simulators, devices, Logs);
|
||||
DeviceLoader = new JenkinsDeviceLoader (Simulators, Devices, Logs);
|
||||
resourceManager = new ResourceManager ();
|
||||
htmlReportWriter = new HtmlReportWriter (jenkins: this, resourceManager: resourceManager, resultParser: resultParser);
|
||||
markdownReportWriter = new MarkdownReportWriter ();
|
||||
|
@ -131,154 +131,6 @@ namespace Xharness.Jenkins {
|
|||
return true;
|
||||
}
|
||||
|
||||
Task<IEnumerable<AppleTestTask>> CreateRunDeviceTasksAsync ()
|
||||
{
|
||||
var rv = new List<RunDeviceTask> ();
|
||||
var projectTasks = new List<RunDeviceTask> ();
|
||||
|
||||
foreach (var project in Harness.IOSTestProjects) {
|
||||
if (!project.IsExecutableProject)
|
||||
continue;
|
||||
|
||||
bool ignored = !IncludeDevice;
|
||||
if (!IsIncluded (project))
|
||||
ignored = true;
|
||||
|
||||
projectTasks.Clear ();
|
||||
if (!project.SkipiOSVariation) {
|
||||
var build64 = new MSBuildTask (jenkins: this, testProject: project, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug64",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_Unified64,
|
||||
TestName = project.Name,
|
||||
};
|
||||
build64.CloneTestProject (MainLog, processManager, project);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: build64,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !IncludeiOS64 });
|
||||
|
||||
var build32 = new MSBuildTask (jenkins: this, testProject: project, processManager: processManager) {
|
||||
ProjectConfiguration = project.Name != "dont link" ? "Debug32" : "Release32",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_Unified32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
build32.CloneTestProject (MainLog, processManager, project);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: build32,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.Connected32BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !IncludeiOS32 });
|
||||
|
||||
var todayProject = project.AsTodayExtensionProject ();
|
||||
var buildToday = new MSBuildTask (jenkins: this, testProject: todayProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug64",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_TodayExtension64,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildToday.CloneTestProject (MainLog, processManager, todayProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: buildToday,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !IncludeiOSExtensions, BuildOnly = ForceExtensionBuildOnly });
|
||||
}
|
||||
|
||||
if (!project.SkiptvOSVariation) {
|
||||
var tvOSProject = project.AsTvOSProject ();
|
||||
var buildTV = new MSBuildTask (jenkins: this, testProject: tvOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.tvOS,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildTV.CloneTestProject (MainLog, processManager, tvOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: buildTV,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.ConnectedTV.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !IncludetvOS });
|
||||
}
|
||||
|
||||
if (!project.SkipwatchOSVariation) {
|
||||
var watchOSProject = project.AsWatchOSProject ();
|
||||
if (!project.SkipwatchOS32Variation) {
|
||||
var buildWatch32 = new MSBuildTask (jenkins: this, testProject: watchOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug32",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.watchOS_32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildWatch32.CloneTestProject (MainLog, processManager, watchOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: buildWatch32,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.ConnectedWatch) { Ignored = !IncludewatchOS });
|
||||
}
|
||||
|
||||
if (!project.SkipwatchOSARM64_32Variation) {
|
||||
var buildWatch64_32 = new MSBuildTask (jenkins: this, testProject: watchOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Release64_32", // We don't support Debug for ARM64_32 yet.
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.watchOS_64_32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildWatch64_32.CloneTestProject (MainLog, processManager, watchOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: buildWatch64_32,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: devices.ConnectedWatch32_64.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !IncludewatchOS });
|
||||
}
|
||||
}
|
||||
foreach (var task in projectTasks) {
|
||||
task.TimeoutMultiplier = project.TimeoutMultiplier;
|
||||
task.BuildOnly |= project.BuildOnly;
|
||||
task.Ignored |= ignored;
|
||||
}
|
||||
rv.AddRange (projectTasks);
|
||||
}
|
||||
|
||||
return Task.FromResult<IEnumerable<AppleTestTask>> (testVariationsFactory.CreateTestVariations (rv, (buildTask, test, candidates)
|
||||
=> new RunDeviceTask (
|
||||
jenkins: this,
|
||||
devices: devices,
|
||||
buildTask: buildTask,
|
||||
processManager: processManager,
|
||||
tunnelBore: TunnelBore,
|
||||
errorKnowledgeBase: ErrorKnowledgeBase,
|
||||
useTcpTunnel: Harness.UseTcpTunnel,
|
||||
candidates: candidates?.Cast<IHardwareDevice> () ?? test.Candidates)));
|
||||
}
|
||||
|
||||
public bool IsBetaXcode => Harness.XcodeRoot.IndexOf ("beta", StringComparison.OrdinalIgnoreCase) >= 0;
|
||||
|
||||
Task PopulateTasksAsync ()
|
||||
|
@ -344,7 +196,8 @@ namespace Xharness.Jenkins {
|
|||
};
|
||||
Tasks.Add (runDotNetGenerator);
|
||||
|
||||
var loaddev = CreateRunDeviceTasksAsync ().ContinueWith ((v) => {
|
||||
var deviceTestFactory = new RunDeviceTasksFactory ();
|
||||
var loaddev = deviceTestFactory.CreateAsync (this, processManager, testVariationsFactory).ContinueWith ((v) => {
|
||||
Console.WriteLine ("Got device tasks completed");
|
||||
Tasks.AddRange (v.Result);
|
||||
});
|
||||
|
|
|
@ -0,0 +1,161 @@
|
|||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.DotNet.XHarness.iOS.Shared;
|
||||
using Microsoft.DotNet.XHarness.iOS.Shared.Execution;
|
||||
using Microsoft.DotNet.XHarness.iOS.Shared.Hardware;
|
||||
using Microsoft.DotNet.XHarness.iOS.Shared.Tasks;
|
||||
using Xharness.Jenkins.TestTasks;
|
||||
|
||||
namespace Xharness.Jenkins {
|
||||
class RunDeviceTasksFactory {
|
||||
|
||||
public Task<IEnumerable<ITestTask>> CreateAsync (Jenkins jenkins, IProcessManager processManager, TestVariationsFactory testVariationsFactory)
|
||||
{
|
||||
var rv = new List<RunDeviceTask> ();
|
||||
var projectTasks = new List<RunDeviceTask> ();
|
||||
|
||||
foreach (var project in jenkins.Harness.IOSTestProjects) {
|
||||
if (!project.IsExecutableProject)
|
||||
continue;
|
||||
|
||||
bool ignored = !jenkins.IncludeDevice;
|
||||
if (!jenkins.IsIncluded (project))
|
||||
ignored = true;
|
||||
|
||||
projectTasks.Clear ();
|
||||
if (!project.SkipiOSVariation) {
|
||||
var build64 = new MSBuildTask (jenkins: jenkins, testProject: project, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug64",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_Unified64,
|
||||
TestName = project.Name,
|
||||
};
|
||||
build64.CloneTestProject (jenkins.MainLog, processManager, project);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: build64,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.IncludeiOS64 });
|
||||
|
||||
var build32 = new MSBuildTask (jenkins: jenkins, testProject: project, processManager: processManager) {
|
||||
ProjectConfiguration = project.Name != "dont link" ? "Debug32" : "Release32",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_Unified32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
build32.CloneTestProject (jenkins.MainLog, processManager, project);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: build32,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.Connected32BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.IncludeiOS32 });
|
||||
|
||||
var todayProject = project.AsTodayExtensionProject ();
|
||||
var buildToday = new MSBuildTask (jenkins: jenkins, testProject: todayProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug64",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.iOS_TodayExtension64,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildToday.CloneTestProject (jenkins.MainLog, processManager, todayProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: buildToday,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.Connected64BitIOS.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.IncludeiOSExtensions, BuildOnly = jenkins.ForceExtensionBuildOnly });
|
||||
}
|
||||
|
||||
if (!project.SkiptvOSVariation) {
|
||||
var tvOSProject = project.AsTvOSProject ();
|
||||
var buildTV = new MSBuildTask (jenkins: jenkins, testProject: tvOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.tvOS,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildTV.CloneTestProject (jenkins.MainLog, processManager, tvOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: buildTV,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.ConnectedTV.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.IncludetvOS });
|
||||
}
|
||||
|
||||
if (!project.SkipwatchOSVariation) {
|
||||
var watchOSProject = project.AsWatchOSProject ();
|
||||
if (!project.SkipwatchOS32Variation) {
|
||||
var buildWatch32 = new MSBuildTask (jenkins: jenkins, testProject: watchOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Debug32",
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.watchOS_32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildWatch32.CloneTestProject (jenkins.MainLog, processManager, watchOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: buildWatch32,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.ConnectedWatch) { Ignored = !jenkins.IncludewatchOS });
|
||||
}
|
||||
|
||||
if (!project.SkipwatchOSARM64_32Variation) {
|
||||
var buildWatch64_32 = new MSBuildTask (jenkins: jenkins, testProject: watchOSProject, processManager: processManager) {
|
||||
ProjectConfiguration = "Release64_32", // We don't support Debug for ARM64_32 yet.
|
||||
ProjectPlatform = "iPhone",
|
||||
Platform = TestPlatform.watchOS_64_32,
|
||||
TestName = project.Name,
|
||||
};
|
||||
buildWatch64_32.CloneTestProject (jenkins.MainLog, processManager, watchOSProject);
|
||||
projectTasks.Add (new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: buildWatch64_32,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: jenkins.Devices.ConnectedWatch32_64.Where (d => project.IsSupported (d.DevicePlatform, d.ProductVersion))) { Ignored = !jenkins.IncludewatchOS });
|
||||
}
|
||||
}
|
||||
foreach (var task in projectTasks) {
|
||||
task.TimeoutMultiplier = project.TimeoutMultiplier;
|
||||
task.BuildOnly |= project.BuildOnly;
|
||||
task.Ignored |= ignored;
|
||||
}
|
||||
rv.AddRange (projectTasks);
|
||||
}
|
||||
|
||||
return Task.FromResult<IEnumerable<ITestTask>> (testVariationsFactory.CreateTestVariations (rv, (buildTask, test, candidates)
|
||||
=> new RunDeviceTask (
|
||||
jenkins: jenkins,
|
||||
devices: jenkins.Devices,
|
||||
buildTask: buildTask,
|
||||
processManager: processManager,
|
||||
tunnelBore: jenkins.TunnelBore,
|
||||
errorKnowledgeBase: jenkins.ErrorKnowledgeBase,
|
||||
useTcpTunnel: jenkins.Harness.UseTcpTunnel,
|
||||
candidates: candidates?.Cast<IHardwareDevice> () ?? test.Candidates)));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -140,6 +140,7 @@
|
|||
<Compile Include="Jenkins\Reports\IReportWriter.cs" />
|
||||
<Compile Include="Jenkins\Reports\MarkdownReportWriter.cs" />
|
||||
<Compile Include="Jenkins\Reports\HtmlReportWriter.cs" />
|
||||
<Compile Include="Jenkins\RunDeviceTasksFactory.cs" />
|
||||
<Compile Include="Jenkins\RunSimulatorTasksFactory.cs" />
|
||||
<Compile Include="Jenkins\TestServer.cs" />
|
||||
</ItemGroup>
|
||||
|
|
Загрузка…
Ссылка в новой задаче