From 8911283cdbcb04f0995f27d45d69f82222c9de4c Mon Sep 17 00:00:00 2001 From: eric sciple Date: Thu, 7 Nov 2019 11:26:29 -0500 Subject: [PATCH 1/6] fix problem matcher to treat fromPath as a file path (#183) --- src/Runner.Worker/Handlers/OutputManager.cs | 14 +- src/Test/L0/Worker/OutputManagerL0.cs | 227 +++++++++++++++++++- 2 files changed, 225 insertions(+), 16 deletions(-) diff --git a/src/Runner.Worker/Handlers/OutputManager.cs b/src/Runner.Worker/Handlers/OutputManager.cs index 0a06bf956..a53a0436f 100644 --- a/src/Runner.Worker/Handlers/OutputManager.cs +++ b/src/Runner.Worker/Handlers/OutputManager.cs @@ -263,15 +263,17 @@ namespace GitHub.Runner.Worker.Handlers // Root using fromPath if (!string.IsNullOrWhiteSpace(match.FromPath) && !Path.IsPathRooted(file)) { - file = Path.Combine(match.FromPath, file); + var fromDirectory = Path.GetDirectoryName(match.FromPath); + if (!string.IsNullOrWhiteSpace(fromDirectory)) + { + file = Path.Combine(fromDirectory, file); + } } - // Root using system.defaultWorkingDirectory + // Root using workspace if (!Path.IsPathRooted(file)) { - var githubContext = _executionContext.ExpressionValues["github"] as GitHubContext; - ArgUtil.NotNull(githubContext, nameof(githubContext)); - var workspace = githubContext["workspace"].ToString(); + var workspace = _executionContext.GetGitHubContext("workspace"); ArgUtil.NotNullOrEmpty(workspace, "workspace"); file = Path.Combine(workspace, file); @@ -297,7 +299,7 @@ namespace GitHub.Runner.Worker.Handlers } else { - // prefer `/` on all platforms + // Prefer `/` on all platforms issue.Data["file"] = file.Substring(repositoryPath.Length).TrimStart(Path.DirectorySeparatorChar).Replace(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); } } diff --git a/src/Test/L0/Worker/OutputManagerL0.cs b/src/Test/L0/Worker/OutputManagerL0.cs index 8e0680dda..cb0eefebd 100644 --- a/src/Test/L0/Worker/OutputManagerL0.cs +++ b/src/Test/L0/Worker/OutputManagerL0.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using System.IO; using System.Linq; using System.Runtime.CompilerServices; using GitHub.Runner.Sdk; @@ -158,7 +159,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void Code() + public void MatcherCode() { var matchers = new IssueMatchersConfig { @@ -300,7 +301,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void LineColumn() + public void MatcherLineColumn() { var matchers = new IssueMatchersConfig { @@ -348,7 +349,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void ProcessCommand() + public void MatcherDoesNotReceiveCommand() { using (Setup()) using (_outputManager) @@ -382,7 +383,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void RemoveColorCodes() + public void MatcherRemoveColorCodes() { using (Setup()) using (_outputManager) @@ -528,7 +529,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void Severity() + public void MatcherSeverity() { var matchers = new IssueMatchersConfig { @@ -589,7 +590,7 @@ namespace GitHub.Runner.Common.Tests.Worker [Fact] [Trait("Level", "L0")] [Trait("Category", "Worker")] - public void Timeout() + public void MatcherTimeout() { Environment.SetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_ISSUE_MATCHER_TIMEOUT", "0:0:0.01"); var matchers = new IssueMatchersConfig @@ -640,10 +641,216 @@ namespace GitHub.Runner.Common.Tests.Worker } } - // todo: roots file against fromPath - // todo: roots file against system.defaultWorkingDirectory - // todo: matches repository - // todo: checks file exists + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void MatcherFile() + { + var matchers = new IssueMatchersConfig + { + Matchers = + { + new IssueMatcherConfig + { + Owner = "my-matcher-1", + Patterns = new[] + { + new IssuePatternConfig + { + Pattern = @"(.+): (.+)", + File = 1, + Message = 2, + }, + }, + }, + }, + }; + using (var hostContext = Setup(matchers: matchers)) + using (_outputManager) + { + // Setup github.workspace + var workDirectory = hostContext.GetDirectory(WellKnownDirectory.Work); + ArgUtil.NotNullOrEmpty(workDirectory, nameof(workDirectory)); + Directory.CreateDirectory(workDirectory); + var workspaceDirectory = Path.Combine(workDirectory, "workspace"); + Directory.CreateDirectory(workspaceDirectory); + _executionContext.Setup(x => x.GetGitHubContext("workspace")).Returns(workspaceDirectory); + + // Create a test file + Directory.CreateDirectory(Path.Combine(workspaceDirectory, "some-directory")); + var filePath = Path.Combine(workspaceDirectory, "some-directory", "some-file.txt"); + File.WriteAllText(filePath, ""); + + // Process + Process("some-directory/some-file.txt: some error"); + Assert.Equal(1, _issues.Count); + Assert.Equal("some error", _issues[0].Item1.Message); + Assert.Equal("some-directory/some-file.txt", _issues[0].Item1.Data["file"]); + Assert.Equal(0, _commands.Count); + Assert.Equal(0, _messages.Count); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void MatcherFileExists() + { + var matchers = new IssueMatchersConfig + { + Matchers = + { + new IssueMatcherConfig + { + Owner = "my-matcher-1", + Patterns = new[] + { + new IssuePatternConfig + { + Pattern = @"(.+): (.+)", + File = 1, + Message = 2, + }, + }, + }, + }, + }; + using (var hostContext = Setup(matchers: matchers)) + using (_outputManager) + { + // Setup github.workspace + var workDirectory = hostContext.GetDirectory(WellKnownDirectory.Work); + ArgUtil.NotNullOrEmpty(workDirectory, nameof(workDirectory)); + Directory.CreateDirectory(workDirectory); + var workspaceDirectory = Path.Combine(workDirectory, "workspace"); + Directory.CreateDirectory(workspaceDirectory); + _executionContext.Setup(x => x.GetGitHubContext("workspace")).Returns(workspaceDirectory); + + // Create a test file + File.WriteAllText(Path.Combine(workspaceDirectory, "some-file-1.txt"), ""); + + // Process + Process("some-file-1.txt: some error 1"); // file exists + Process("some-file-2.txt: some error 2"); // file does not exist + + Assert.Equal(2, _issues.Count); + Assert.Equal("some error 1", _issues[0].Item1.Message); + Assert.Equal("some-file-1.txt", _issues[0].Item1.Data["file"]); + Assert.Equal("some error 2", _issues[1].Item1.Message); + Assert.False(_issues[1].Item1.Data.ContainsKey("file")); // does not contain file key + Assert.Equal(0, _commands.Count); + Assert.Equal(0, _messages.Where(x => !x.StartsWith("##[debug]")).Count()); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void MatcherFileOutsideRepository() + { + var matchers = new IssueMatchersConfig + { + Matchers = + { + new IssueMatcherConfig + { + Owner = "my-matcher-1", + Patterns = new[] + { + new IssuePatternConfig + { + Pattern = @"(.+): (.+)", + File = 1, + Message = 2, + }, + }, + }, + }, + }; + using (var hostContext = Setup(matchers: matchers)) + using (_outputManager) + { + // Setup github.workspace + var workDirectory = hostContext.GetDirectory(WellKnownDirectory.Work); + ArgUtil.NotNullOrEmpty(workDirectory, nameof(workDirectory)); + Directory.CreateDirectory(workDirectory); + var workspaceDirectory = Path.Combine(workDirectory, "workspace"); + Directory.CreateDirectory(workspaceDirectory); + _executionContext.Setup(x => x.GetGitHubContext("workspace")).Returns(workspaceDirectory); + + // Create test files + var filePath1 = Path.Combine(workspaceDirectory, "some-file-1.txt"); + File.WriteAllText(filePath1, ""); + var workspaceSiblingDirectory = Path.Combine(Path.GetDirectoryName(workspaceDirectory), "workspace-sibling"); + Directory.CreateDirectory(workspaceSiblingDirectory); + var filePath2 = Path.Combine(workspaceSiblingDirectory, "some-file-2.txt"); + File.WriteAllText(filePath2, ""); + + // Process + Process($"{filePath1}: some error 1"); // file exists inside workspace + Process($"{filePath2}: some error 2"); // file exists outside workspace + + Assert.Equal(2, _issues.Count); + Assert.Equal("some error 1", _issues[0].Item1.Message); + Assert.Equal("some-file-1.txt", _issues[0].Item1.Data["file"]); + Assert.Equal("some error 2", _issues[1].Item1.Message); + Assert.False(_issues[1].Item1.Data.ContainsKey("file")); // does not contain file key + Assert.Equal(0, _commands.Count); + Assert.Equal(0, _messages.Where(x => !x.StartsWith("##[debug]")).Count()); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void MatcherFromPath() + { + var matchers = new IssueMatchersConfig + { + Matchers = + { + new IssueMatcherConfig + { + Owner = "my-matcher-1", + Patterns = new[] + { + new IssuePatternConfig + { + Pattern = @"(.+): (.+) \[(.+)\]", + File = 1, + Message = 2, + FromPath = 3, + }, + }, + }, + }, + }; + using (var hostContext = Setup(matchers: matchers)) + using (_outputManager) + { + // Setup github.workspace + var workDirectory = hostContext.GetDirectory(WellKnownDirectory.Work); + ArgUtil.NotNullOrEmpty(workDirectory, nameof(workDirectory)); + Directory.CreateDirectory(workDirectory); + var workspaceDirectory = Path.Combine(workDirectory, "workspace"); + Directory.CreateDirectory(workspaceDirectory); + _executionContext.Setup(x => x.GetGitHubContext("workspace")).Returns(workspaceDirectory); + + // Create a test file + Directory.CreateDirectory(Path.Combine(workspaceDirectory, "some-directory")); + Directory.CreateDirectory(Path.Combine(workspaceDirectory, "some-project", "some-directory")); + var filePath = Path.Combine(workspaceDirectory, "some-project", "some-directory", "some-file.txt"); + File.WriteAllText(filePath, ""); + + // Process + Process("some-directory/some-file.txt: some error [some-project/some-project.proj]"); + Assert.Equal(1, _issues.Count); + Assert.Equal("some error", _issues[0].Item1.Message); + Assert.Equal("some-project/some-directory/some-file.txt", _issues[0].Item1.Data["file"]); + Assert.Equal(0, _commands.Count); + Assert.Equal(0, _messages.Count); + } + } private TestHostContext Setup( [CallerMemberName] string name = "", From c5cbac97961b85dd199b7edd1fcfff1b71ecf615 Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Fri, 8 Nov 2019 09:49:20 -0500 Subject: [PATCH 2/6] Runner fails to run as a service on windows: Disable Delay Signing on the Runner Service (#185) * test release * Reverse test release changes * Remove Unused Public Keys from Runner Service --- src/Runner.Service/Windows/FinalPublicKey.snk | Bin 160 -> 0 bytes src/Runner.Service/Windows/RunnerService.csproj | 6 ++---- 2 files changed, 2 insertions(+), 4 deletions(-) delete mode 100644 src/Runner.Service/Windows/FinalPublicKey.snk diff --git a/src/Runner.Service/Windows/FinalPublicKey.snk b/src/Runner.Service/Windows/FinalPublicKey.snk deleted file mode 100644 index 110b59c7b0d27388353dcf4116f721595f473e58..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmV;R0AK$ABme*efB*oL000060ssI2Bme+XQ$aBR1ONa500968(fU`!uG#RTE`+KN zuKf+^=>2N!kB9pMc5H)8nUWr|JLj6&)!f0|n$k8CAp(#KayILlN=pn$R@96PlTucm;!K;}lU1BV%Wh@=~);)AxZ!P8VeqOH+#FjlK9EuV{ OWf&lBz>_phTGEsG5JRQ_ diff --git a/src/Runner.Service/Windows/RunnerService.csproj b/src/Runner.Service/Windows/RunnerService.csproj index 8871f9a80..73fe4ecc6 100644 --- a/src/Runner.Service/Windows/RunnerService.csproj +++ b/src/Runner.Service/Windows/RunnerService.csproj @@ -9,9 +9,8 @@ Properties RunnerService RunnerService - true - FinalPublicKey.snk - true + false + false v4.5 512 true @@ -64,7 +63,6 @@ - From 54f21c641fc49afa5b71fafe0c124cb48beb689d Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Mon, 11 Nov 2019 13:43:02 -0500 Subject: [PATCH 3/6] Update dependency docs for OSX and Windows (#162) * Update Dependency docs for .net 3.0 depedencies * Update Supported Windows Versions * Update Supported Mac OS link * Update docs/start/envosx.md Fix typo in OSX Version Co-Authored-By: Lucas Costi --- docs/start/envosx.md | 4 ++-- docs/start/envwin.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/start/envosx.md b/docs/start/envosx.md index 13969600a..d93f7a3eb 100644 --- a/docs/start/envosx.md +++ b/docs/start/envosx.md @@ -4,7 +4,7 @@ ## Supported Versions - - macOS Sierra (10.12) and later versions + - macOS High Sierra (10.13) and later versions -## [More .Net Core Prerequisites Information](https://docs.microsoft.com/en-us/dotnet/core/macos-prerequisites?tabs=netcore2x) +## [More .Net Core Prerequisites Information](https://docs.microsoft.com/en-us/dotnet/core/macos-prerequisites?tabs=netcore30) diff --git a/docs/start/envwin.md b/docs/start/envwin.md index 4dd316990..fc3500a64 100644 --- a/docs/start/envwin.md +++ b/docs/start/envwin.md @@ -5,8 +5,8 @@ - Windows 7 64-bit - Windows 8.1 64-bit - Windows 10 64-bit - - Windows Server 2008 R2 SP1 64-bit - Windows Server 2012 R2 64-bit - Windows Server 2016 64-bit + - Windows Server 2019 64-bit -## [More .Net Core Prerequisites Information](https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites?tabs=netcore2x) +## [More .Net Core Prerequisites Information](https://docs.microsoft.com/en-us/dotnet/core/windows-prerequisites?tabs=netcore30) From ced4c2ca50ca50a76d953cfd76bcaac155ab44fb Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Mon, 4 Nov 2019 14:31:21 -0500 Subject: [PATCH 4/6] add-mask is leaking a secret in master if debug or ::echo::on is set (#158) * Output after processing command to avoid leaking mask * Remove extra noise output from echo changes * Omit Echoing of add-mask command * avoid echoing on debug/warning/error --- src/Runner.Worker/ActionCommandManager.cs | 46 +++++++++++++---------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/Runner.Worker/ActionCommandManager.cs b/src/Runner.Worker/ActionCommandManager.cs index 2e2e6af1e..023e2f304 100644 --- a/src/Runner.Worker/ActionCommandManager.cs +++ b/src/Runner.Worker/ActionCommandManager.cs @@ -73,7 +73,7 @@ namespace GitHub.Runner.Worker return false; } - // process action command in serialize oreder. + // process action command in serialize order. lock (_commandSerializeLock) { if (_stopProcessCommand) @@ -107,32 +107,19 @@ namespace GitHub.Runner.Worker } else if (_commandExtensions.TryGetValue(actionCommand.Command, out IActionCommandExtension extension)) { - bool commandHasBeenOutput = false; + if (context.EchoOnActionCommand && !extension.OmitEcho) + { + context.Output(input); + } try { - if (context.EchoOnActionCommand) - { - context.Output(input); - context.Debug($"Processing command '{actionCommand.Command}'"); - commandHasBeenOutput = true; - } - extension.ProcessCommand(context, input, actionCommand); - - if (context.EchoOnActionCommand) - { - context.Debug($"Processed command '{actionCommand.Command}' successfully"); - } } catch (Exception ex) { - if (!commandHasBeenOutput) - { - context.Output(input); - } - - context.Error($"Unable to process command '{input}' successfully."); + var commandInformation = extension.OmitEcho ? extension.Command : input; + context.Error($"Unable to process command '{commandInformation}' successfully."); context.Error(ex); context.CommandResult = TaskResult.Failed; } @@ -151,6 +138,7 @@ namespace GitHub.Runner.Worker public interface IActionCommandExtension : IExtension { string Command { get; } + bool OmitEcho { get; } void ProcessCommand(IExecutionContext context, string line, ActionCommand command); } @@ -158,6 +146,7 @@ namespace GitHub.Runner.Worker public sealed class InternalPluginSetRepoPathCommandExtension : RunnerService, IActionCommandExtension { public string Command => "internal-set-repo-path"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -187,6 +176,7 @@ namespace GitHub.Runner.Worker public sealed class SetEnvCommandExtension : RunnerService, IActionCommandExtension { public string Command => "set-env"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -211,6 +201,7 @@ namespace GitHub.Runner.Worker public sealed class SetOutputCommandExtension : RunnerService, IActionCommandExtension { public string Command => "set-output"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -234,6 +225,7 @@ namespace GitHub.Runner.Worker public sealed class SaveStateCommandExtension : RunnerService, IActionCommandExtension { public string Command => "save-state"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -257,6 +249,7 @@ namespace GitHub.Runner.Worker public sealed class AddMaskCommandExtension : RunnerService, IActionCommandExtension { public string Command => "add-mask"; + public bool OmitEcho => true; public Type ExtensionType => typeof(IActionCommandExtension); @@ -268,6 +261,11 @@ namespace GitHub.Runner.Worker } else { + if (context.EchoOnActionCommand) + { + context.Output($"::{Command}::***"); + } + HostContext.SecretMasker.AddValue(command.Data); Trace.Info($"Add new secret mask with length of {command.Data.Length}"); } @@ -277,6 +275,7 @@ namespace GitHub.Runner.Worker public sealed class AddPathCommandExtension : RunnerService, IActionCommandExtension { public string Command => "add-path"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -291,6 +290,7 @@ namespace GitHub.Runner.Worker public sealed class AddMatcherCommandExtension : RunnerService, IActionCommandExtension { public string Command => "add-matcher"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -337,6 +337,7 @@ namespace GitHub.Runner.Worker public sealed class RemoveMatcherCommandExtension : RunnerService, IActionCommandExtension { public string Command => "remove-matcher"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); @@ -404,6 +405,7 @@ namespace GitHub.Runner.Worker public sealed class DebugCommandExtension : RunnerService, IActionCommandExtension { public string Command => "debug"; + public bool OmitEcho => true; public Type ExtensionType => typeof(IActionCommandExtension); @@ -431,6 +433,7 @@ namespace GitHub.Runner.Worker { public abstract IssueType Type { get; } public abstract string Command { get; } + public bool OmitEcho => true; public Type ExtensionType => typeof(IActionCommandExtension); @@ -510,6 +513,8 @@ namespace GitHub.Runner.Worker public abstract class GroupingCommandExtension : RunnerService, IActionCommandExtension { public abstract string Command { get; } + public bool OmitEcho => false; + public Type ExtensionType => typeof(IActionCommandExtension); public void ProcessCommand(IExecutionContext context, string line, ActionCommand command) @@ -522,6 +527,7 @@ namespace GitHub.Runner.Worker public sealed class EchoCommandExtension : RunnerService, IActionCommandExtension { public string Command => "echo"; + public bool OmitEcho => false; public Type ExtensionType => typeof(IActionCommandExtension); From b27cfb18e6ad32cfea4ad48146b14a7257f9f090 Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Tue, 5 Nov 2019 15:43:40 -0500 Subject: [PATCH 5/6] 2.160.1 Runner Release Notes (#171) * 2.160.1 Runner Release Notes * Minor verbiage updates to be consistent --- releaseNote.md | 11 +++++++---- src/runnerversion | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/releaseNote.md b/releaseNote.md index 34f3aa6a8..b7e6084f9 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,12 +1,15 @@ ## Features - - N/A + - Added commands to enable or disable echoing of commands (#139) ## Bugs - - Reverted removal of additional fields error and warning fields (#147) - - Actions cache would incorrectly cache the action if the tag was updated (#148) + - Do not retry uploads on 4xx Errors for Artifact Upload Service (#131) + - Actions cache no longer incorrectly caches the action if the tag was updated for self hosted runners (#148) + - Disabled echoing of commands on add-mask, debug, warning and error commands (#158) + - HashFile now is correctly configured to only support basic globbing and globstar (#149) + - HashFile now sets a default root and handles Windows paths correctly (#151) ## Misc - - Updated to .NET Core 3.0 (#127) + - N/A ## Agent Downloads diff --git a/src/runnerversion b/src/runnerversion index fef351cca..a189ba322 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.160.0 \ No newline at end of file +2.160.1 \ No newline at end of file From 9ba971592b176496ba41ed33264592102cf6e1f6 Mon Sep 17 00:00:00 2001 From: Thomas Boop <52323235+thboop@users.noreply.github.com> Date: Fri, 8 Nov 2019 11:01:27 -0500 Subject: [PATCH 6/6] V 2.160.2 Release notes and version bump (#190) --- releaseNote.md | 8 ++------ src/runnerversion | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/releaseNote.md b/releaseNote.md index b7e6084f9..99f31c6ce 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,12 +1,8 @@ ## Features - - Added commands to enable or disable echoing of commands (#139) + - N/A ## Bugs - - Do not retry uploads on 4xx Errors for Artifact Upload Service (#131) - - Actions cache no longer incorrectly caches the action if the tag was updated for self hosted runners (#148) - - Disabled echoing of commands on add-mask, debug, warning and error commands (#158) - - HashFile now is correctly configured to only support basic globbing and globstar (#149) - - HashFile now sets a default root and handles Windows paths correctly (#151) + - Fixed an issue with Strong Name Validation when running as a service on Windows (#185) ## Misc - N/A diff --git a/src/runnerversion b/src/runnerversion index a189ba322..957ed2e1e 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.160.1 \ No newline at end of file +2.160.2 \ No newline at end of file