diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 240d549f6..dd78a7723 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,6 +1,7 @@ name: Runner CD on: + workflow_dispatch: push: paths: - releaseVersion diff --git a/releaseNote.md b/releaseNote.md index 48d725bc5..fd009ee62 100644 --- a/releaseNote.md +++ b/releaseNote.md @@ -1,18 +1,15 @@ ## Features - - Resolve action download info from server (#508, #515, #550) - - Print runner and machine name to log. (#539) + - Composite Actions Support for Multiple Run Steps (#549, #557, #564, #568, #569, #578, #591, #599, #605, #609, #610, #615, #624) + - Prepare to switch GITHUB_ACTION to use ContextName instead of refname (#593) + - Fold logs for intermediate docker commands (#608) + - Add ability to register a runner to the non-default self-hosted runner group (#613) + ## Bugs - - Reduce input validation warnings (#506) - - Fix null ref exception in SecretMasker caused by `hashfiles` timeout. (#516) - - Add libicu66 to `./installDependencies.sh` for Ubuntu 20.04 (#535) - - Fix DataContract with Token service (#532) - - Skip search $PATH on command with fully qualified path (#526) - - Restore SELinux context on service file when SELinux is enabled (#525) + - Double quotes around variable so CD works if path contains spaces (#602) + - Bump lodash in /src/Misc/expressionFunc/hashFiles (#603) + - Fix poor performance of process spawned from svc daemon (#614) ## Misc - - Remove SPS/Token migration code. Remove GHES url manipulate code. (#513) - - Add sub-step for developer flow for clarity (#523) - - Update Links and Language to Git + VSCode (#522) - - Update runner configuration exception message (#540) + - Move shared ExecutionContext properties under .Global (#594) ## Windows x64 We recommend configuring the runner in a root folder of the Windows drive (e.g. "C:\actions-runner"). This will help avoid issues related to service identity folder permissions and long file path restrictions on Windows. diff --git a/src/Misc/layoutbin/actions.runner.plist.template b/src/Misc/layoutbin/actions.runner.plist.template index 351c11001..c6ba1bd5c 100644 --- a/src/Misc/layoutbin/actions.runner.plist.template +++ b/src/Misc/layoutbin/actions.runner.plist.template @@ -23,5 +23,7 @@ ACTIONS_RUNNER_SVC 1 + ProcessType + Interactive diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs index 2fd57d23c..4ae3407d3 100644 --- a/src/Runner.Listener/Runner.cs +++ b/src/Runner.Listener/Runner.cs @@ -462,13 +462,14 @@ Options: --commit Prints the runner commit Config Options: - --unattended Disable interactive prompts for missing arguments. Defaults will be used for missing options - --url string Repository to add the runner to. Required if unattended - --token string Registration token. Required if unattended - --name string Name of the runner to configure (default {Environment.MachineName ?? "myrunner"}) - --labels string Extra labels in addition to the default: 'self-hosted,{Constants.Runner.Platform},{Constants.Runner.PlatformArchitecture}' - --work string Relative runner work directory (default {Constants.Path.WorkDirectory}) - --replace Replace any existing runner with the same name (default false)"); + --unattended Disable interactive prompts for missing arguments. Defaults will be used for missing options + --url string Repository to add the runner to. Required if unattended + --token string Registration token. Required if unattended + --name string Name of the runner to configure (default {Environment.MachineName ?? "myrunner"}) + --runnergroup string Name of the runner group to add this runner to (defaults to the default runner group) + --labels string Extra labels in addition to the default: 'self-hosted,{Constants.Runner.Platform},{Constants.Runner.PlatformArchitecture}' + --work string Relative runner work directory (default {Constants.Path.WorkDirectory}) + --replace Replace any existing runner with the same name (default false)"); #if OS_WINDOWS _term.WriteLine($@" --runasservice Run the runner as a service"); _term.WriteLine($@" --windowslogonaccount string Account to run the service as. Requires runasservice"); diff --git a/src/Runner.Worker/ActionManager.cs b/src/Runner.Worker/ActionManager.cs index 1a730130a..da4af0b67 100644 --- a/src/Runner.Worker/ActionManager.cs +++ b/src/Runner.Worker/ActionManager.cs @@ -395,7 +395,7 @@ namespace GitHub.Runner.Worker Trace.Info($"Action cleanup plugin: {plugin.PluginTypeName}."); } } - else if (definition.Data.Execution.ExecutionType == ActionExecutionType.Composite && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) + else if (definition.Data.Execution.ExecutionType == ActionExecutionType.Composite) { var compositeAction = definition.Data.Execution as CompositeActionExecutionData; Trace.Info($"Load {compositeAction.Steps?.Count ?? 0} action steps."); @@ -1048,7 +1048,7 @@ namespace GitHub.Runner.Worker Trace.Info($"Action plugin: {(actionDefinitionData.Execution as PluginActionExecutionData).Plugin}, no more preparation."); return null; } - else if (actionDefinitionData.Execution.ExecutionType == ActionExecutionType.Composite && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) + else if (actionDefinitionData.Execution.ExecutionType == ActionExecutionType.Composite) { Trace.Info($"Action composite: {(actionDefinitionData.Execution as CompositeActionExecutionData).Steps}, no more preparation."); return null; diff --git a/src/Runner.Worker/ActionManifestManager.cs b/src/Runner.Worker/ActionManifestManager.cs index 043f6c1cd..7b0315f2e 100644 --- a/src/Runner.Worker/ActionManifestManager.cs +++ b/src/Runner.Worker/ActionManifestManager.cs @@ -31,7 +31,7 @@ namespace GitHub.Runner.Worker string EvaluateDefaultInput(IExecutionContext executionContext, string inputName, TemplateToken token); - string EvaluateDefaultInputInsideComposite(IExecutionContext executionContext, string inputName, TemplateToken token); + // string EvaluateDefaultInputInsideComposite(IExecutionContext executionContext, string inputName, TemplateToken token); } public sealed class ActionManifestManager : RunnerService, IActionManifestManager @@ -107,12 +107,7 @@ namespace GitHub.Runner.Worker break; case "outputs": - if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) - { - actionOutputs = actionPair.Value.AssertMapping("outputs"); - break; - } - Trace.Info($"Ignore action property outputs. Outputs for a whole action is not supported yet."); + actionOutputs = actionPair.Value.AssertMapping("outputs"); break; case "description": @@ -311,80 +306,82 @@ namespace GitHub.Runner.Worker return result; } - public string EvaluateDefaultInputInsideComposite( - IExecutionContext executionContext, - string inputName, - TemplateToken token) - { - string result = ""; - if (token != null) - { - // Add GitHub Expression Values - var githubContext = executionContext.ExpressionValues["github"]; - Trace.Info($"GitHub Context EvaluateDefaultInputInsideComposite: {StringUtil.ConvertToJson(githubContext)}"); + // public string EvaluateDefaultInputInsideComposite( + // IExecutionContext executionContext, + // string inputName, + // TemplateToken token) + // { + // string result = ""; + // if (token != null) + // { + // // Add GitHub Expression Values + // var githubContext = executionContext.ExpressionValues["github"]; + // Trace.Info($"GitHub Context EvaluateDefaultInputInsideComposite: {StringUtil.ConvertToJson(githubContext)}"); - var temp = new Dictionary(); - temp["github"] = githubContext; + // var temp = new Dictionary(); + // temp["github"] = githubContext; - var templateContext = CreateTemplateContext(executionContext, temp); - try - { + // // Trace.Info($"Token: {StringUtil.ConvertToJson(token)}"); - var evaluateResult = TemplateEvaluator.Evaluate(templateContext, "step-with", token, 0, null, omitHeader: true); + // var templateContext = CreateTemplateContext(executionContext, temp); + // try + // { - Trace.Info($"Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult)}"); - templateContext.Errors.Check(); + // var evaluateResult = TemplateEvaluator.Evaluate(templateContext, "uses-input", token, 0, null, omitHeader: true); - // Can't evaluate the default github.respository, etc. + // Trace.Info($"Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult)}"); + // templateContext.Errors.Check(); + + // // Can't evaluate the default github.respository, etc. - // TODO: restrict to only be used for composite "uses" steps - // Find better way to isolate only - // We could create a whitelist for just checkout? - // (ex: "repo", "token", etc.) - // if (evaluateResult is BasicExpressionToken) - // { + // // TODO: restrict to only be used for composite "uses" steps + // // Find better way to isolate only + // // We could create a whitelist for just checkout? + // // (ex: "repo", "token", etc.) + // // if (evaluateResult is BasicExpressionToken) + // // { - // // var evaluateResult2 = TemplateEvaluator.Evaluate(templateContext, "step-with", token, 0, null, omitHeader: true); - // // templateContext.Errors.Check(); + // // // var evaluateResult2 = TemplateEvaluator.Evaluate(templateContext, "step-with", token, 0, null, omitHeader: true); + // // // templateContext.Errors.Check(); - // // Trace.Info($"Test2 Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult2)}"); - // // var result2 = evaluateResult2.AssertString($"default value for input '{inputName}'").Value; + // // // Trace.Info($"Test2 Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult2)}"); + // // // var result2 = evaluateResult2.AssertString($"default value for input '{inputName}'").Value; - // // TODO 6/28 => Try just getting it from the getgithubcontext lmao. + // // // TODO 6/28 => Try just getting it from the getgithubcontext lmao. - // // Trace.Info($"Basic expr token: {evaluateResult}"); + // // // Trace.Info($"Basic expr token: {evaluateResult}"); - // var stringVersion = evaluateResult.AssertString($"default value for input '{inputName}'").Value; + // // var stringVersion = evaluateResult.AssertString($"default value for input '{inputName}'").Value; - // // no we have to use the template evaluator since it's a + // // // no we have to use the template evaluator since it's a - // // var githubTokenSplit = + // // // var githubTokenSplit = - // // // Evaluate it - // // var evaluateResult = executionContext.GetGitHubContext(""); + // // // // Evaluate it + // // // var evaluateResult = executionContext.GetGitHubContext(""); - // return result2; - // } + // // return result2; + // // } - // Trace.Info($"Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult)}"); + // // Trace.Info($"Input '{inputName}': default value evaluate result: {StringUtil.ConvertToJson(evaluateResult)}"); - // String - result = evaluateResult.AssertString($"default value for input '{inputName}'").Value; - } - catch (Exception ex) when (!(ex is TemplateValidationException)) - { - Trace.Error(ex); - templateContext.Errors.Add(ex); - } + // // String + // result = evaluateResult.AssertString($"default value for input '{inputName}'").Value; + // } + // catch (Exception ex) when (!(ex is TemplateValidationException)) + // { + // Trace.Error(ex); + // templateContext.Errors.Add(ex); + // } - templateContext.Errors.Check(); - } + // templateContext.Errors.Check(); + // } - return result; + // return result; - } + // } private TemplateContext CreateTemplateContext( IExecutionContext executionContext, @@ -500,14 +497,10 @@ namespace GitHub.Runner.Worker preIfToken = run.Value.AssertString("pre-if"); break; case "steps": - if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) - { - var stepsToken = run.Value.AssertSequence("steps"); - steps = PipelineTemplateConverter.ConvertToSteps(templateContext, stepsToken); - templateContext.Errors.Check(); - break; - } - throw new Exception("You aren't supposed to be using Composite Actions yet!"); + var stepsToken = run.Value.AssertSequence("steps"); + steps = PipelineTemplateConverter.ConvertToSteps(templateContext, stepsToken); + templateContext.Errors.Check(); + break; default: Trace.Info($"Ignore run property {runsKey}."); break; @@ -555,7 +548,7 @@ namespace GitHub.Runner.Worker }; } } - else if (string.Equals(usingToken.Value, "composite", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TESTING_COMPOSITE_ACTIONS_ALPHA"))) + else if (string.Equals(usingToken.Value, "composite", StringComparison.OrdinalIgnoreCase)) { if (steps == null) { diff --git a/src/Runner.Worker/ActionRunner.cs b/src/Runner.Worker/ActionRunner.cs index b10681013..8adf1c52d 100644 --- a/src/Runner.Worker/ActionRunner.cs +++ b/src/Runner.Worker/ActionRunner.cs @@ -192,14 +192,15 @@ namespace GitHub.Runner.Worker if (!inputs.ContainsKey(key)) { Trace.Info($"Definition Input Key: {key}"); - if (ExecutionContext.InsideComposite) - { - inputs[key] = manifestManager.EvaluateDefaultInputInsideComposite(ExecutionContext, key, input.Value); - } - else - { - inputs[key] = manifestManager.EvaluateDefaultInput(ExecutionContext, key, input.Value); - } + // if (ExecutionContext.InsideComposite) + // { + // inputs[key] = manifestManager.EvaluateDefaultInputInsideComposite(ExecutionContext, key, input.Value); + // } + // else + // { + // inputs[key] = manifestManager.EvaluateDefaultInput(ExecutionContext, key, input.Value); + // } + inputs[key] = manifestManager.EvaluateDefaultInput(ExecutionContext, key, input.Value); Trace.Info($"Definition Input Value: {inputs[key]}"); } } diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 1aad95c9c..f5211f523 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -53,7 +53,7 @@ namespace GitHub.Runner.Worker JobContext JobContext { get; } // Only job level ExecutionContext has JobSteps - List JobSteps { get; } + Queue JobSteps { get; } // Only job level ExecutionContext has PostJobSteps Stack PostJobSteps { get; } @@ -144,7 +144,7 @@ namespace GitHub.Runner.Worker public GlobalContext Global { get; private set; } // Only job level ExecutionContext has JobSteps - public List JobSteps { get; private set; } + public Queue JobSteps { get; private set; } // Only job level ExecutionContext has PostJobSteps public Stack PostJobSteps { get; private set; } @@ -663,7 +663,7 @@ namespace GitHub.Runner.Worker Global.PrependPath = new List(); // JobSteps for job ExecutionContext - JobSteps = new List(); + JobSteps = new Queue(); // PostJobSteps for job ExecutionContext PostJobSteps = new Stack(); diff --git a/src/Runner.Worker/GitHubContext.cs b/src/Runner.Worker/GitHubContext.cs index ac6566ad9..1ecca19f0 100644 --- a/src/Runner.Worker/GitHubContext.cs +++ b/src/Runner.Worker/GitHubContext.cs @@ -9,6 +9,7 @@ namespace GitHub.Runner.Worker private readonly HashSet _contextEnvWhitelist = new HashSet(StringComparer.OrdinalIgnoreCase) { "action", + "action_path", "actor", "api_url", "base_ref", diff --git a/src/Runner.Worker/Handlers/CompositeActionHandler.cs b/src/Runner.Worker/Handlers/CompositeActionHandler.cs index d451ec13e..96e4ef4d5 100644 --- a/src/Runner.Worker/Handlers/CompositeActionHandler.cs +++ b/src/Runner.Worker/Handlers/CompositeActionHandler.cs @@ -58,6 +58,14 @@ namespace GitHub.Runner.Worker.Handlers childScopeName = $"__{Guid.NewGuid()}"; } + // Copy the github context so that we don't modify the original pointer + // We can't use PipelineContextData.Clone() since that creates a null pointer exception for copying a GitHubContext + var compositeGitHubContext = new GitHubContext(); + foreach (var pair in githubContext) + { + compositeGitHubContext[pair.Key] = pair.Value; + } + foreach (Pipelines.ActionStep actionStep in actionSteps) { var actionRunner = HostContext.CreateService(); @@ -67,9 +75,9 @@ namespace GitHub.Runner.Worker.Handlers var step = ExecutionContext.CreateCompositeStep(childScopeName, actionRunner, inputsData, Environment); - // TESTING: Blatantly pass github object so that we have access to it for checking out - // (Later, we can just do this for the checkout step!) - step.ExecutionContext.ExpressionValues["github"] = githubContext; + // Set GITHUB_ACTION_PATH + step.ExecutionContext.ExpressionValues["github"] = compositeGitHubContext; + step.ExecutionContext.SetGitHubContext("action_path", ActionDirectory); compositeSteps.Add(step); } @@ -183,9 +191,6 @@ namespace GitHub.Runner.Worker.Handlers var actionStep = step as IActionRunner; - // Set GITHUB_ACTION - step.ExecutionContext.SetGitHubContext("action", step.ExecutionContext.GetFullyQualifiedContextName()); - try { // Evaluate and merge action's env block to env context diff --git a/src/Runner.Worker/JobRunner.cs b/src/Runner.Worker/JobRunner.cs index 3ea9e0e04..4fb6662eb 100644 --- a/src/Runner.Worker/JobRunner.cs +++ b/src/Runner.Worker/JobRunner.cs @@ -152,7 +152,7 @@ namespace GitHub.Runner.Worker { foreach (var step in jobSteps) { - jobContext.JobSteps.Add(step); + jobContext.JobSteps.Enqueue(step); } await stepsRunner.RunAsync(jobContext); diff --git a/src/Runner.Worker/StepsRunner.cs b/src/Runner.Worker/StepsRunner.cs index 7877ae6a7..40430b694 100644 --- a/src/Runner.Worker/StepsRunner.cs +++ b/src/Runner.Worker/StepsRunner.cs @@ -59,14 +59,13 @@ namespace GitHub.Runner.Worker checkPostJobActions = true; while (jobContext.PostJobSteps.TryPop(out var postStep)) { - jobContext.JobSteps.Add(postStep); + jobContext.JobSteps.Enqueue(postStep); } continue; } - var step = jobContext.JobSteps[0]; - jobContext.JobSteps.RemoveAt(0); + var step = jobContext.JobSteps.Dequeue(); Trace.Info($"Processing step: DisplayName='{step.DisplayName}'"); ArgUtil.NotNull(step.ExecutionContext, nameof(step.ExecutionContext)); diff --git a/src/Runner.Worker/action_yaml.json b/src/Runner.Worker/action_yaml.json index eb143457e..2e129a7b0 100644 --- a/src/Runner.Worker/action_yaml.json +++ b/src/Runner.Worker/action_yaml.json @@ -232,6 +232,20 @@ "loose-key-type": "non-empty-string", "loose-value-type": "string" } + }, + "uses-input": { + "context": [ + "github", + "inputs", + "strategy", + "matrix", + "steps", + "job", + "runner", + "env", + "hashFiles(1,255)" + ], + "string": {} } } } \ No newline at end of file diff --git a/src/Test/L0/Worker/StepsRunnerL0.cs b/src/Test/L0/Worker/StepsRunnerL0.cs index 87ef812c3..3d97b0110 100644 --- a/src/Test/L0/Worker/StepsRunnerL0.cs +++ b/src/Test/L0/Worker/StepsRunnerL0.cs @@ -82,7 +82,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -117,7 +117,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -156,7 +156,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Steps.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Steps.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -210,7 +210,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Steps.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Steps.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -289,7 +289,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Steps.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Steps.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -332,7 +332,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Step.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Step.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -363,7 +363,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -393,7 +393,7 @@ namespace GitHub.Runner.Common.Tests.Worker { _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(variableSet.Select(x => x.Object).ToList())); + _ec.Setup(x => x.JobSteps).Returns(new Queue(variableSet.Select(x => x.Object).ToList())); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -419,7 +419,7 @@ namespace GitHub.Runner.Common.Tests.Worker _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(new[] { step1.Object })); + _ec.Setup(x => x.JobSteps).Returns(new Queue(new[] { step1.Object })); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -457,7 +457,7 @@ namespace GitHub.Runner.Common.Tests.Worker _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(new[] { step1.Object, step2.Object })); + _ec.Setup(x => x.JobSteps).Returns(new Queue(new[] { step1.Object, step2.Object })); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -495,7 +495,7 @@ namespace GitHub.Runner.Common.Tests.Worker _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(new[] { step1.Object, step2.Object })); + _ec.Setup(x => x.JobSteps).Returns(new Queue(new[] { step1.Object, step2.Object })); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -526,7 +526,7 @@ namespace GitHub.Runner.Common.Tests.Worker _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(new[] { step1.Object, step2.Object, step3.Object })); + _ec.Setup(x => x.JobSteps).Returns(new Queue(new[] { step1.Object, step2.Object, step3.Object })); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); @@ -562,7 +562,7 @@ namespace GitHub.Runner.Common.Tests.Worker _ec.Object.Result = null; - _ec.Setup(x => x.JobSteps).Returns(new List(new[] { step1.Object, step2.Object, step3.Object })); + _ec.Setup(x => x.JobSteps).Returns(new Queue(new[] { step1.Object, step2.Object, step3.Object })); // Act. await _stepsRunner.RunAsync(jobContext: _ec.Object); diff --git a/src/runnerversion b/src/runnerversion index 58301aa10..08b78dcc6 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.267.0 +2.274.0