Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement new echo behavior and command #139

Merged
merged 9 commits into from
Oct 25, 2019
1 change: 1 addition & 0 deletions src/Runner.Common/ExtensionManager.cs
Expand Up @@ -54,6 +54,7 @@ public sealed class ExtensionManager : RunnerService, IExtensionManager
Add<T>(extensions, "GitHub.Runner.Worker.DebugCommandExtension, Runner.Worker");
Add<T>(extensions, "GitHub.Runner.Worker.GroupCommandExtension, Runner.Worker");
Add<T>(extensions, "GitHub.Runner.Worker.EndGroupCommandExtension, Runner.Worker");
Add<T>(extensions, "GitHub.Runner.Worker.EchoCommandExtension, Runner.Worker");
break;
default:
// This should never happen.
Expand Down
82 changes: 46 additions & 36 deletions src/Runner.Worker/ActionCommandManager.cs
Expand Up @@ -107,26 +107,23 @@ public bool TryProcessCommand(IExecutionContext context, string input)
}
else if (_commandExtensions.TryGetValue(actionCommand.Command, out IActionCommandExtension extension))
{
bool omitEcho;
try
{
extension.ProcessCommand(context, input, actionCommand, out omitEcho);
extension.ProcessCommand(context, input, actionCommand);

if (context.EchoOnActionCommandSuccess)
juliobbv marked this conversation as resolved.
Show resolved Hide resolved
{
context.Output(input);
context.Debug($"Processed command '{actionCommand.Command}' successfully");
}
}
catch (Exception ex)
{
omitEcho = true;
context.Output(input);
context.Error($"Unable to process command '{input}' successfully.");
context.Error(ex);
context.CommandResult = TaskResult.Failed;
}

if (!omitEcho)
{
context.Output(input);
context.Debug($"Processed command");
}

}
else
{
Expand All @@ -143,7 +140,7 @@ public interface IActionCommandExtension : IExtension
{
string Command { get; }

void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho);
void ProcessCommand(IExecutionContext context, string line, ActionCommand command);
}

public sealed class InternalPluginSetRepoPathCommandExtension : RunnerService, IActionCommandExtension
Expand All @@ -152,7 +149,7 @@ public sealed class InternalPluginSetRepoPathCommandExtension : RunnerService, I

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
if (!command.Properties.TryGetValue(SetRepoPathCommandProperties.repoFullName, out string repoFullName) || string.IsNullOrEmpty(repoFullName))
{
Expand All @@ -166,8 +163,6 @@ public void ProcessCommand(IExecutionContext context, string line, ActionCommand

var directoryManager = HostContext.GetService<IPipelineDirectoryManager>();
var trackingConfig = directoryManager.UpdateRepositoryDirectory(context, repoFullName, command.Data, StringUtil.ConvertToBoolean(workspaceRepo));

omitEcho = true;
}

private static class SetRepoPathCommandProperties
Expand All @@ -183,7 +178,7 @@ public sealed class SetEnvCommandExtension : RunnerService, IActionCommandExtens

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
if (!command.Properties.TryGetValue(SetEnvCommandProperties.Name, out string envName) || string.IsNullOrEmpty(envName))
{
Expand All @@ -194,7 +189,6 @@ public void ProcessCommand(IExecutionContext context, string line, ActionCommand
context.SetEnvContext(envName, command.Data);
context.Output(line);
juliobbv marked this conversation as resolved.
Show resolved Hide resolved
context.Debug($"{envName}='{command.Data}'");
omitEcho = true;
}

private static class SetEnvCommandProperties
Expand All @@ -209,7 +203,7 @@ public sealed class SetOutputCommandExtension : RunnerService, IActionCommandExt

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
if (!command.Properties.TryGetValue(SetOutputCommandProperties.Name, out string outputName) || string.IsNullOrEmpty(outputName))
{
Expand All @@ -219,7 +213,6 @@ public void ProcessCommand(IExecutionContext context, string line, ActionCommand
context.SetOutput(outputName, command.Data, out var reference);
context.Output(line);
juliobbv marked this conversation as resolved.
Show resolved Hide resolved
context.Debug($"{reference}='{command.Data}'");
omitEcho = true;
}

private static class SetOutputCommandProperties
Expand All @@ -234,7 +227,7 @@ public sealed class SaveStateCommandExtension : RunnerService, IActionCommandExt

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
if (!command.Properties.TryGetValue(SaveStateCommandProperties.Name, out string stateName) || string.IsNullOrEmpty(stateName))
{
Expand All @@ -243,7 +236,6 @@ public void ProcessCommand(IExecutionContext context, string line, ActionCommand

context.IntraActionState[stateName] = command.Data;
context.Debug($"Save intra-action state {stateName} = {command.Data}");
omitEcho = true;
}

private static class SaveStateCommandProperties
Expand All @@ -258,7 +250,7 @@ public sealed class AddMaskCommandExtension : RunnerService, IActionCommandExten

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
if (string.IsNullOrWhiteSpace(command.Data))
{
Expand All @@ -269,8 +261,6 @@ public void ProcessCommand(IExecutionContext context, string line, ActionCommand
HostContext.SecretMasker.AddValue(command.Data);
Trace.Info($"Add new secret mask with length of {command.Data.Length}");
}

omitEcho = true;
}
}

Expand All @@ -280,12 +270,11 @@ public sealed class AddPathCommandExtension : RunnerService, IActionCommandExten

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
ArgUtil.NotNullOrEmpty(command.Data, "path");
context.PrependPath.RemoveAll(x => string.Equals(x, command.Data, StringComparison.CurrentCulture));
context.PrependPath.Add(command.Data);
omitEcho = false;
}
}

Expand All @@ -295,9 +284,8 @@ public sealed class AddMatcherCommandExtension : RunnerService, IActionCommandEx

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
omitEcho = false;
var file = command.Data;

// File is required
Expand Down Expand Up @@ -342,9 +330,8 @@ public sealed class RemoveMatcherCommandExtension : RunnerService, IActionComman

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
omitEcho = false;
command.Properties.TryGetValue(RemoveMatcherCommandProperties.Owner, out string owner);
var file = command.Data;

juliobbv marked this conversation as resolved.
Show resolved Hide resolved
Expand Down Expand Up @@ -410,9 +397,8 @@ public sealed class DebugCommandExtension : RunnerService, IActionCommandExtensi

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string inputLine, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string inputLine, ActionCommand command)
{
omitEcho = true;
context.Debug(command.Data);
}
}
Expand All @@ -438,10 +424,8 @@ public abstract class IssueCommandExtension : RunnerService, IActionCommandExten

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string inputLine, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string inputLine, ActionCommand command)
{
omitEcho = true;

Issue issue = new Issue()
{
Category = "General",
Expand All @@ -468,11 +452,37 @@ public abstract class GroupingCommandExtension : RunnerService, IActionCommandEx
public abstract string Command { get; }
public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command, out bool omitEcho)
public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
var data = this is GroupCommandExtension ? command.Data : string.Empty;
context.Output($"##[{Command}]{data}");
juliobbv marked this conversation as resolved.
Show resolved Hide resolved
omitEcho = true;
}
}

public sealed class EchoCommandExtension : RunnerService, IActionCommandExtension
{
public string Command => "echo";

public Type ExtensionType => typeof(IActionCommandExtension);

public void ProcessCommand(IExecutionContext context, string line, ActionCommand command)
{
ArgUtil.NotNullOrEmpty(command.Data, "value");

switch (command.Data.Trim().ToLower())
juliobbv marked this conversation as resolved.
Show resolved Hide resolved
{
case "on":
context.EchoOnActionCommandSuccess = true;
context.Debug("Setting echo command value to 'on'");
break;
case "off":
context.EchoOnActionCommandSuccess = false;
context.Debug("Setting echo command value to 'off'");
break;
default:
throw new Exception($"Invalid echo command value. Possible values can be: 'on', 'off'. Current value is: '{command.Data}'.");
break;
}
}
}
}
8 changes: 8 additions & 0 deletions src/Runner.Worker/ExecutionContext.cs
Expand Up @@ -62,6 +62,8 @@ public interface IExecutionContext : IRunnerService
// Only job level ExecutionContext has PostJobSteps
Stack<IStep> PostJobSteps { get; }

Boolean EchoOnActionCommandSuccess { get; set; }
juliobbv marked this conversation as resolved.
Show resolved Hide resolved

// Initialize
void InitializeJob(Pipelines.AgentJobRequestMessage message, CancellationToken token);
void CancelToken();
Expand Down Expand Up @@ -153,6 +155,8 @@ public sealed class ExecutionContext : RunnerService, IExecutionContext
// Only job level ExecutionContext has PostJobSteps
public Stack<IStep> PostJobSteps { get; private set; }

public Boolean EchoOnActionCommandSuccess { get; set; }


public TaskResult? Result
{
Expand Down Expand Up @@ -292,6 +296,7 @@ public IExecutionContext CreateChild(Guid recordId, string displayName, string r
child.PrependPath = PrependPath;
child.Container = Container;
child.ServiceContainers = ServiceContainers;
child.EchoOnActionCommandSuccess = EchoOnActionCommandSuccess;

if (recordOrder != null)
{
Expand Down Expand Up @@ -704,6 +709,9 @@ public void InitializeJob(Pipelines.AgentJobRequestMessage message, Cancellation
_logger = HostContext.CreateService<IPagingLogger>();
_logger.Setup(_mainTimelineId, _record.Id);

// Initialize 'echo on action command success' property, default to false, unless Step_Debug is set
EchoOnActionCommandSuccess = Variables.Step_Debug ?? false;

// Verbosity (from GitHub.Step_Debug).
WriteDebug = Variables.Step_Debug ?? false;

Expand Down