Ещё штуки
All checks were successful
Build and Push Docker Images / build (src/LiquidCode.Tester.Gateway/Dockerfile, git.nullptr.top/liquidcode/liquidcode-tester-gateway-roman, gateway) (push) Successful in 51s
Build and Push Docker Images / build (src/LiquidCode.Tester.Worker/Dockerfile, git.nullptr.top/liquidcode/liquidcode-tester-worker-roman, worker) (push) Successful in 1m4s

This commit is contained in:
2025-11-05 22:39:32 +03:00
parent 7f8eb875f9
commit 0b29ce168e

View File

@@ -5,6 +5,7 @@ using System.Linq;
using LiquidCode.Tester.Worker.Services.Isolate;
using LiquidCode.Tester.Worker.Models;
/// <summary>
namespace LiquidCode.Tester.Worker.Services;
/// <summary>
@@ -113,12 +114,7 @@ public class CppCompilationServiceIsolate : ICompilationService
// Build compiler arguments
var arguments = new List<string>(compilerFlags);
var directoryBindings = new List<DirectoryBinding>
{
new DirectoryBinding { HostPath = "/usr/include", SandboxPath = "/usr/include", ReadOnly = true },
new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true },
new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }
};
var includeCounter = 0;
// Add include directories
if (includeDirectories != null)
@@ -135,13 +131,10 @@ public class CppCompilationServiceIsolate : ICompilationService
if (Directory.Exists(resolvedIncludeDir))
{
arguments.Add($"-I{resolvedIncludeDir}");
directoryBindings.Add(new DirectoryBinding
{
HostPath = resolvedIncludeDir,
SandboxPath = resolvedIncludeDir,
ReadOnly = true
});
includeCounter++;
var targetIncludeDir = Path.Combine(boxDir, $"include_{includeCounter}");
CopyDirectory(resolvedIncludeDir, targetIncludeDir);
arguments.Add($"-I/box/include_{includeCounter}");
}
else
{
@@ -182,7 +175,12 @@ public class CppCompilationServiceIsolate : ICompilationService
EnableNetwork = false,
StderrFile = stderrFilePath,
WorkingDirectory = "/box",
DirectoryBindings = directoryBindings
DirectoryBindings = new List<DirectoryBinding>
{
new DirectoryBinding { HostPath = "/usr/include", SandboxPath = "/usr/include", ReadOnly = true },
new DirectoryBinding { HostPath = "/usr/lib", SandboxPath = "/usr/lib", ReadOnly = true },
new DirectoryBinding { HostPath = "/lib", SandboxPath = "/lib", ReadOnly = true }
}
});
// Read compiler output
@@ -275,6 +273,29 @@ public class CppCompilationServiceIsolate : ICompilationService
}
}
private static void CopyDirectory(string sourceDirectory, string destinationDirectory)
{
var sourceRoot = Path.GetFullPath(sourceDirectory);
var destinationRoot = Path.GetFullPath(destinationDirectory);
Directory.CreateDirectory(destinationRoot);
foreach (var directory in Directory.EnumerateDirectories(sourceRoot, "*", SearchOption.AllDirectories))
{
var relativePath = Path.GetRelativePath(sourceRoot, directory);
var targetDir = Path.Combine(destinationRoot, relativePath);
Directory.CreateDirectory(targetDir);
}
foreach (var file in Directory.EnumerateFiles(sourceRoot, "*", SearchOption.AllDirectories))
{
var relativePath = Path.GetRelativePath(sourceRoot, file);
var targetFile = Path.Combine(destinationRoot, relativePath);
Directory.CreateDirectory(Path.GetDirectoryName(targetFile)!);
File.Copy(file, targetFile, overwrite: true);
}
}
private (string compiler, List<string> compilerFlags) ResolveVersion(string? version)
{
var defaultCompiler = _configuration["Cpp:Compiler"] ?? "g++";