From e566edc0442330c11906da384d589c47f836de37 Mon Sep 17 00:00:00 2001 From: Melodi <62381002+Melodi17@users.noreply.github.com> Date: Wed, 28 Oct 2026 00:04:17 +1000 Subject: fix: file name; move into loop and uow --- src/marlin.agents.shell/SlaveLoop.cs | 69 ++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 src/marlin.agents.shell/SlaveLoop.cs (limited to 'src/marlin.agents.shell/SlaveLoop.cs') diff --git a/src/marlin.agents.shell/SlaveLoop.cs b/src/marlin.agents.shell/SlaveLoop.cs new file mode 100644 index 0000000..82f6ff5 --- /dev/null +++ b/src/marlin.agents.shell/SlaveLoop.cs @@ -0,0 +1,69 @@ +namespace marlin.agents.shell; + +using System.Runtime.InteropServices; +using core.contracts; +using core.functional; +using core.models; +using core.util; +using ProtoBuf.Grpc.Client; + +public class SlaveLoop +{ + private static readonly string _jobInstanceDir = Path.Combine(CommonPaths.AgentRoot, "instance"); + private readonly MarlinApiClient _client; + + public SlaveLoop() + { + this._client = MarlinApiClient.FromEnvironment(); + } + + public async Task Start() + { + AgentConfiguration config = await Handshake(); + Console.WriteLine($"IAM: {config.Name}"); + Console.WriteLine($"MCJ: {config.MaxConcurrentJobs}"); + + while (true) + { + var job = await this._client.QueueNextJob(); + if (job == null) + { + await Task.Delay(TimeSpan.FromSeconds(5)); + continue; + } + + Console.WriteLine($"Claimed job {job.Id}: {job.Recipe}"); + await FireJob(job); + } + } + + private async Task Handshake() + { + var capabilities = new CapabilitySet(); + capabilities.Items.Add(KnownCapabilities.Architecture, RuntimeInformation.OSArchitecture.ToString()); + capabilities.Items.Add(KnownCapabilities.CoreCount, Environment.ProcessorCount.ToString()); + capabilities.Items.Add(KnownCapabilities.Memory, (GC.GetGCMemoryInfo().TotalAvailableMemoryBytes / (1024 * 1024)).ToString()); + var status = new AgentStatus(capabilities); + + AgentConfiguration config = await _client.Handshake(status); + return config; + } + + private async Task FireJob(DispatchJob job) + { + GitBinaryClient gitClient = new(); + var channel = this._client.CreateJobScopedRpc(job); + var instanceService = channel.CreateGrpcService(); + + string workingDir = Path.Combine(_jobInstanceDir, job.Id.ToString("N")); + + Directory.CreateDirectory(_jobInstanceDir); + if (Path.Exists(workingDir)) + Directory.Delete(workingDir, true); + + await gitClient.Checkout(workingDir, job.Vcs, job.Ref, job.Commit); + + var uow = new JobUnitOfWork(instanceService, workingDir, job.Recipe); + await uow.Run(); + } +} \ No newline at end of file -- cgit v1.3.1