From 8770849c3bbc21632ac9bc1b45063d44e0eda258 Mon Sep 17 00:00:00 2001 From: eric sciple Date: Wed, 30 Oct 2019 22:16:31 -0400 Subject: [PATCH] add set-workspace command --- src/Runner.Common/ExtensionManager.cs | 1 + src/Runner.Worker/ActionCommandManager.cs | 34 +++++++++++++++++++++++ src/Runner.Worker/ExecutionContext.cs | 8 ++++++ 3 files changed, 43 insertions(+) diff --git a/src/Runner.Common/ExtensionManager.cs b/src/Runner.Common/ExtensionManager.cs index c53fc3647..689cd8a6a 100644 --- a/src/Runner.Common/ExtensionManager.cs +++ b/src/Runner.Common/ExtensionManager.cs @@ -42,6 +42,7 @@ namespace GitHub.Runner.Common // Action command extensions. case "GitHub.Runner.Worker.IActionCommandExtension": Add(extensions, "GitHub.Runner.Worker.InternalPluginSetRepoPathCommandExtension, Runner.Worker"); + Add(extensions, "GitHub.Runner.Worker.SetWorkspaceCommandExtension, Runner.Worker"); Add(extensions, "GitHub.Runner.Worker.SetEnvCommandExtension, Runner.Worker"); Add(extensions, "GitHub.Runner.Worker.SetOutputCommandExtension, Runner.Worker"); Add(extensions, "GitHub.Runner.Worker.SaveStateCommandExtension, Runner.Worker"); diff --git a/src/Runner.Worker/ActionCommandManager.cs b/src/Runner.Worker/ActionCommandManager.cs index a1a268d60..60cfd4081 100644 --- a/src/Runner.Worker/ActionCommandManager.cs +++ b/src/Runner.Worker/ActionCommandManager.cs @@ -184,6 +184,40 @@ namespace GitHub.Runner.Worker } } + public sealed class SetWorkspaceCommandExtension : RunnerService, IActionCommandExtension + { + public string Command => "set-workspace"; + + public Type ExtensionType => typeof(IActionCommandExtension); + + public void ProcessCommand(IExecutionContext context, string line, ActionCommand command) + { + string path = command.Data; + if (string.IsNullOrWhiteSpace(path)) + { + throw new Exception("Path not specified"); + } + + if (!Path.IsPathRooted(path)) + { + throw new Exception("Expected a rooted path"); + } + + string runnerWorkspace = context.GetRunnerContext("workspace"); + ArgUtil.Directory(runnerWorkspace, nameof(runnerWorkspace)); + + // Must be under runner workspace + path = Path.GetFullPath(path); // remove relative pathing and normalize slashes + if (!path.StartsWith(runnerWorkspace + Path.DirectorySeparatorChar, IOUtil.FilePathStringComparison)) + { + throw new Exception($"Expected path to be under {runnerWorkspace}"); + } + + Trace.Info($"Setting GitHub workspace to '{path}'"); + context.SetGitHubContext("workspace", path); + } + } + public sealed class SetEnvCommandExtension : RunnerService, IActionCommandExtension { public string Command => "set-env"; diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 2f7de9e5b..cc2426791 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -78,6 +78,7 @@ namespace GitHub.Runner.Worker void Start(string currentOperation = null); TaskResult Complete(TaskResult? result = null, string currentOperation = null, string resultCode = null); void SetEnvContext(string name, string value); + string GetRunnerContext(string name); void SetRunnerContext(string name, string value); string GetGitHubContext(string name); void SetGitHubContext(string name, string value); @@ -365,6 +366,13 @@ namespace GitHub.Runner.Worker return Result.Value; } + public string GetRunnerContext(string name) + { + ArgUtil.NotNullOrEmpty(name, nameof(name)); + var runnerContext = ExpressionValues["runner"] as RunnerContext; + return runnerContext[name].AssertString($"runner[{name}]"); + } + public void SetRunnerContext(string name, string value) { ArgUtil.NotNullOrEmpty(name, nameof(name));