From cac948ca6cdc99bde3bf6303beea45864fea0bc8 Mon Sep 17 00:00:00 2001 From: ChristopherHX Date: Tue, 5 Sep 2023 09:48:57 +0200 Subject: [PATCH] improve reliability of downloading tools (#208) Sometimes extracting failed due to volume mounts and moving the extracted folder between those volumes --- src/Runner.Common/HostContext.cs | 4 +++ src/Runner.Sdk/Util/IOUtil.cs | 36 +++++++++++++++++++++++-- src/Runner.Worker/ExternalToolHelper.cs | 2 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/src/Runner.Common/HostContext.cs b/src/Runner.Common/HostContext.cs index f563a8537e0..a8562d3b569 100644 --- a/src/Runner.Common/HostContext.cs +++ b/src/Runner.Common/HostContext.cs @@ -253,6 +253,10 @@ public string GetDirectory(WellKnownDirectory directory) path = Path.Combine( GetDirectory(WellKnownDirectory.Root), Constants.Path.ExternalsDirectory); + // No longer create the local externals folder if it doesn't exist + if(!new DirectoryInfo(path).Exists) { + path = Path.Combine(GitHub.Runner.Sdk.GharunUtil.GetLocalStorage()); + } #endif break; diff --git a/src/Runner.Sdk/Util/IOUtil.cs b/src/Runner.Sdk/Util/IOUtil.cs index 33adce7113d..8a9713626c6 100644 --- a/src/Runner.Sdk/Util/IOUtil.cs +++ b/src/Runner.Sdk/Util/IOUtil.cs @@ -204,6 +204,38 @@ public static void DeleteFile(string path) } } + private static bool IsChildPath(string relativeTo, string sourceDir) { + var relativePath = Path.GetRelativePath(relativeTo, sourceDir); + return relativePath != sourceDir && !relativePath.StartsWith(".."); + } + + private static DriveInfo GetDrive(DriveInfo[] allDrives, string sourceDir) + { + DriveInfo ret = null; + foreach (DriveInfo drive in allDrives) + { + if (IsChildPath(drive.RootDirectory.FullName, sourceDir) && (ret == null || IsChildPath(ret.RootDirectory.FullName, drive.RootDirectory.FullName))) + { + ret = drive; + } + } + return ret; + } + + private static void MoveOrCopy(string sourceDir, string targetDir, CancellationToken token) + { + DriveInfo[] allDrives = DriveInfo.GetDrives(); + if (GetDrive(allDrives, sourceDir) != GetDrive(allDrives, targetDir)) + { + CopyDirectory(sourceDir, targetDir, token); + DeleteDirectory(sourceDir, token); + } + else + { + Directory.Move(sourceDir, targetDir); + } + } + public static void MoveDirectory(string sourceDir, string targetDir, string stagingDir, CancellationToken token) { ArgUtil.Directory(sourceDir, nameof(sourceDir)); @@ -217,7 +249,7 @@ public static void MoveDirectory(string sourceDir, string targetDir, string stag Directory.CreateDirectory(Path.GetDirectoryName(stagingDir)); // move source to staging - Directory.Move(sourceDir, stagingDir); + MoveOrCopy(sourceDir, stagingDir, token); // delete existing targetDir DeleteDirectory(targetDir, token); @@ -226,7 +258,7 @@ public static void MoveDirectory(string sourceDir, string targetDir, string stag Directory.CreateDirectory(Path.GetDirectoryName(targetDir)); // move staging to target - Directory.Move(stagingDir, targetDir); + MoveOrCopy(stagingDir, targetDir, token); } /// diff --git a/src/Runner.Worker/ExternalToolHelper.cs b/src/Runner.Worker/ExternalToolHelper.cs index 7ec23395c4e..04d6c8be699 100644 --- a/src/Runner.Worker/ExternalToolHelper.cs +++ b/src/Runner.Worker/ExternalToolHelper.cs @@ -225,7 +225,7 @@ public static async Task GetNodeTool(IExecutionContext executionContext, _tools = new Dictionary> { { "windows/386", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "win", "x86", "zip"), Path.Combine(dest, "bin"), unwrap: true)}, { "windows/amd64", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "win", "x64", "zip"), Path.Combine(dest, "bin"), unwrap: true)}, - { "windows/arm64", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, "16.6.2", "win", "arm64", "zip"), Path.Combine(dest, "bin"), unwrap: true)}, + { "windows/arm64", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "win", "arm64", "zip"), Path.Combine(dest, "bin"), unwrap: true)}, { "linux/amd64", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "linux", "x64", "tar.gz"), dest, tarextraopts, true)}, { "linux/arm", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "linux", "armv7l", "tar.gz"), dest, tarextraopts, true)}, { "linux/arm64", dest => DownloadTool(executionContext, NodeOfficialUrl(nodeUrl, nodeVersion, "linux", "arm64", "tar.gz"), dest, tarextraopts, true)},