From 855b90c3d4ed12677646bf0ce8b0508042d618fc Mon Sep 17 00:00:00 2001 From: Ethan Chiu <17chiue@gmail.com> Date: Tue, 28 Jul 2020 10:15:46 -0400 Subject: [PATCH 1/7] Explicitly define what is allowed for a composite action (#605) * Explicitly define what is allowed for an action * Add step-env * Remove secrets + defaults * new line * Add safety check to prevent from checking defaults in ScriptHandler for composite action * Revert "Add safety check to prevent from checking defaults in ScriptHandler for composite action" This reverts commit aeae15de7b621fcc500f44442c09f395d2aa39ac. * Need to explictly use ActionStep type since we need the .Inputs attribute which is only found in the ActionStep not IStep * Fix ActionManifestManager * Remove todos * Revert "Revert "Add safety check to prevent from checking defaults in ScriptHandler for composite action"" This reverts commit a22fcbc03638bc5f4db601588cc633b8b680d586. * revert * Remove needs in env * Make shell required + add inputs * Remove passing context to all composite steps attribuyte --- src/Runner.Worker/Handlers/ScriptHandler.cs | 4 -- src/Runner.Worker/action_yaml.json | 64 ++++++++++++++++----- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/src/Runner.Worker/Handlers/ScriptHandler.cs b/src/Runner.Worker/Handlers/ScriptHandler.cs index 397d9a176..022b59420 100644 --- a/src/Runner.Worker/Handlers/ScriptHandler.cs +++ b/src/Runner.Worker/Handlers/ScriptHandler.cs @@ -164,8 +164,6 @@ namespace GitHub.Runner.Worker.Handlers string workingDirectory = null; if (!Inputs.TryGetValue("workingDirectory", out workingDirectory)) { - // TODO: figure out how defaults interact with template later - // for now, we won't check job.defaults if we are inside a template. if (string.IsNullOrEmpty(ExecutionContext.ScopeName) && ExecutionContext.Global.JobDefaults.TryGetValue("run", out var runDefaults)) { if (runDefaults.TryGetValue("working-directory", out workingDirectory)) @@ -180,8 +178,6 @@ namespace GitHub.Runner.Worker.Handlers string shell = null; if (!Inputs.TryGetValue("shell", out shell) || string.IsNullOrEmpty(shell)) { - // TODO: figure out how defaults interact with template later - // for now, we won't check job.defaults if we are inside a template. if (string.IsNullOrEmpty(ExecutionContext.ScopeName) && ExecutionContext.Global.JobDefaults.TryGetValue("run", out var runDefaults)) { if (runDefaults.TryGetValue("shell", out shell)) diff --git a/src/Runner.Worker/action_yaml.json b/src/Runner.Worker/action_yaml.json index 82b24a695..a4a09181b 100644 --- a/src/Runner.Worker/action_yaml.json +++ b/src/Runner.Worker/action_yaml.json @@ -108,19 +108,26 @@ } }, "composite-steps": { - "context": [ - "github", - "strategy", - "matrix", - "steps", - "inputs", - "job", - "runner", - "env", - "hashFiles(1,255)" - ], "sequence": { - "item-type": "any" + "item-type": "composite-step" + } + }, + "composite-step": { + "mapping": { + "properties": { + "name": "string-steps-context", + "id": "non-empty-string", + "run": { + "type": "string-steps-context", + "required": true + }, + "env": "step-env", + "working-directory": "string-steps-context", + "shell": { + "type": "non-empty-string", + "required": true + } + } } }, "container-runs-context": { @@ -157,6 +164,37 @@ "string": { "require-non-empty": true } + }, + "string-steps-context": { + "context": [ + "github", + "inputs", + "strategy", + "matrix", + "steps", + "job", + "runner", + "env", + "hashFiles(1,255)" + ], + "string": {} + }, + "step-env": { + "context": [ + "github", + "inputs", + "strategy", + "matrix", + "steps", + "job", + "runner", + "env", + "hashFiles(1,255)" + ], + "mapping": { + "loose-key-type": "non-empty-string", + "loose-value-type": "string" + } } } -} \ No newline at end of file +} From d59092d9738cff483e8427ce720ae459a9881c04 Mon Sep 17 00:00:00 2001 From: Ethan Chiu <17chiue@gmail.com> Date: Wed, 29 Jul 2020 14:28:14 -0400 Subject: [PATCH 2/7] GITHUB_ACTION_PATH + GITHUB_ACTION so that we can run scripts for Composite Run Steps (#615) * Add environment variable for GITHUB_ACTION_PATH * ah * Remove debugging messages * Set github action path at step level instead of global scope to avoid necessary removal * Remove set context for github action * Set github action path before and after composite action * Copy GitHub Context, use this copied context for each composit step, and then set the action_path for each one (to avoid stamping over parent pointer GitHubContext --- src/Runner.Worker/GitHubContext.cs | 1 + .../Handlers/CompositeActionHandler.cs | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) 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 50015a574..e83b5fb67 100644 --- a/src/Runner.Worker/Handlers/CompositeActionHandler.cs +++ b/src/Runner.Worker/Handlers/CompositeActionHandler.cs @@ -56,6 +56,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(); @@ -64,6 +72,11 @@ namespace GitHub.Runner.Worker.Handlers actionRunner.Condition = actionStep.Condition; var step = ExecutionContext.CreateCompositeStep(childScopeName, actionRunner, inputsData, Environment); + + // Set GITHUB_ACTION_PATH + step.ExecutionContext.ExpressionValues["github"] = compositeGitHubContext; + step.ExecutionContext.SetGitHubContext("action_path", ActionDirectory); + compositeSteps.Add(step); } @@ -176,9 +189,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 From 89a13db2c3b72e87d7c42798f39edb16df822f31 Mon Sep 17 00:00:00 2001 From: Ethan Chiu <17chiue@gmail.com> Date: Wed, 29 Jul 2020 15:12:15 -0400 Subject: [PATCH 3/7] Remove TESTING_COMPOSITE_ACTIONS_ALPHA Env Variable (#624) --- src/Runner.Worker/ActionManager.cs | 4 ++-- src/Runner.Worker/ActionManifestManager.cs | 21 ++++++--------------- 2 files changed, 8 insertions(+), 17 deletions(-) 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 aa6637f85..04ce2775e 100644 --- a/src/Runner.Worker/ActionManifestManager.cs +++ b/src/Runner.Worker/ActionManifestManager.cs @@ -105,12 +105,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": @@ -423,14 +418,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; @@ -478,7 +469,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) { From bc1fe2cfe0a86bb8211ea19e65b359ef452049dc Mon Sep 17 00:00:00 2001 From: efyx <80339+efyx@users.noreply.github.com> Date: Wed, 29 Jul 2020 21:20:28 +0200 Subject: [PATCH 4/7] Fix poor performance of process spawned from svc daemon (#614) --- src/Misc/layoutbin/actions.runner.plist.template | 2 ++ 1 file changed, 2 insertions(+) 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 From 38f816c2ae2a8c441feb8df3e1108ff245f1c8a7 Mon Sep 17 00:00:00 2001 From: TingluoHuang Date: Wed, 29 Jul 2020 15:31:45 -0400 Subject: [PATCH 5/7] prepare release 2.272.0 runner. --- .github/workflows/release.yml | 1 + releaseNote.md | 21 +++++++++------------ src/runnerversion | 2 +- 3 files changed, 11 insertions(+), 13 deletions(-) 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/runnerversion b/src/runnerversion index 58301aa10..d807ea93e 100644 --- a/src/runnerversion +++ b/src/runnerversion @@ -1 +1 @@ -2.267.0 +2.272.0 From f028b4e2b0c9fcc3b58dba4de83efde5e9c17ae6 Mon Sep 17 00:00:00 2001 From: Ethan Chiu <17chiue@gmail.com> Date: Wed, 29 Jul 2020 16:19:04 -0400 Subject: [PATCH 6/7] Revert JobSteps to Queue Data Structure (#625) * Revert JobSteps to Queue data structure * Revert tests --- src/Runner.Worker/ExecutionContext.cs | 6 +++--- src/Runner.Worker/JobRunner.cs | 2 +- src/Runner.Worker/StepsRunner.cs | 5 ++--- src/Test/L0/Worker/StepsRunnerL0.cs | 26 +++++++++++++------------- 4 files changed, 19 insertions(+), 20 deletions(-) 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/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/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); From 7b608e3e92e989c3009a895cd3c7c66e7ccab1ee Mon Sep 17 00:00:00 2001 From: Christopher Johnson Date: Thu, 30 Jul 2020 12:03:40 -0400 Subject: [PATCH 7/7] Adding help text for the new runnergroup feature (#626) Co-authored-by: Christopher Johnson --- src/Runner.Listener/Runner.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) 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");