Files
runner/src/Runner.Worker/Handlers/RunnerPluginHandler.cs
2020-04-13 21:46:30 -04:00

59 lines
1.9 KiB
C#

using System.Threading.Tasks;
using System;
using GitHub.Runner.Sdk;
using GitHub.Runner.Common;
using Pipelines = GitHub.DistributedTask.Pipelines;
namespace GitHub.Runner.Worker.Handlers
{
[ServiceLocator(Default = typeof(RunnerPluginHandler))]
public interface IRunnerPluginHandler : IHandler
{
PluginActionExecutionData Data { get; set; }
}
public sealed class RunnerPluginHandler : Handler, IRunnerPluginHandler
{
public PluginActionExecutionData Data { get; set; }
public async Task RunAsync(ActionRunStage stage)
{
// Validate args.
Trace.Entering();
ArgUtil.NotNull(Data, nameof(Data));
ArgUtil.NotNull(ExecutionContext, nameof(ExecutionContext));
ArgUtil.NotNull(Inputs, nameof(Inputs));
string plugin = null;
if (stage == ActionRunStage.Main)
{
plugin = Data.Plugin;
}
else if (stage == ActionRunStage.Post)
{
plugin = Data.Post;
}
ArgUtil.NotNullOrEmpty(plugin, nameof(plugin));
// Update the env dictionary.
AddPrependPathToEnvironment();
// Make sure only particular task get run as runner plugin.
var runnerPlugin = HostContext.GetService<IRunnerPluginManager>();
using (var outputManager = new OutputManager(ExecutionContext, ActionCommandManager))
{
ActionCommandManager.EnablePluginInternalCommand();
try
{
await runnerPlugin.RunPluginActionAsync(ExecutionContext, plugin, Inputs, Environment, RuntimeVariables, outputManager.OnDataReceived);
}
finally
{
ActionCommandManager.DisablePluginInternalCommand();
}
}
}
}
}