diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 3fe1ee2ac..952ba2c50 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -686,8 +686,11 @@ namespace GitHub.Runner.Worker // Endpoints Global.Endpoints = message.Resources.Endpoints; - // Variables - Global.Variables = new Variables(HostContext, message.Variables); + // Ser debug using vars context if debug variables are not already present. + var variables = message.Variables; + SetDebugUsingVars(variables, message.ContextData); + + Global.Variables = new Variables(HostContext, variables); if (Global.Variables.GetBoolean("DistributedTask.ForceInternalNodeVersionOnRunnerTo12") ?? false) { @@ -1077,6 +1080,31 @@ namespace GitHub.Runner.Worker return CreateChild(newGuid, displayName, newGuid.ToString("N"), null, null, ActionRunStage.Post, intraActionState, _childTimelineRecordOrder - Root.PostJobSteps.Count, siblingScopeName: siblingScopeName); } + // Sets debug using vars context in case debug variables are not present. + private static void SetDebugUsingVars(IDictionary variables, IDictionary contextData) + { + if (contextData != null && + contextData.TryGetValue(PipelineTemplateConstants.Vars, out var varsPipelineContextData) && + varsPipelineContextData != null && + varsPipelineContextData is DictionaryContextData varsContextData) + { + // Set debug variables only when StepDebug/RunnerDebug variables are not present. + if (!variables.ContainsKey(Constants.Variables.Actions.StepDebug) && + varsContextData.TryGetValue(Constants.Variables.Actions.StepDebug, out var stepDebugValue) && + stepDebugValue is StringContextData) + { + variables[Constants.Variables.Actions.StepDebug] = stepDebugValue.ToString(); + } + + if (!variables.ContainsKey(Constants.Variables.Actions.RunnerDebug) && + varsContextData.TryGetValue(Constants.Variables.Actions.RunnerDebug, out var runDebugValue) && + runDebugValue is StringContextData) + { + variables[Constants.Variables.Actions.RunnerDebug] = runDebugValue.ToString(); + } + } + } + public void ApplyContinueOnError(TemplateToken continueOnErrorToken) { if (Result != TaskResult.Failed) diff --git a/src/Test/L0/Worker/ExecutionContextL0.cs b/src/Test/L0/Worker/ExecutionContextL0.cs index 937d964e8..3aef7fb58 100644 --- a/src/Test/L0/Worker/ExecutionContextL0.cs +++ b/src/Test/L0/Worker/ExecutionContextL0.cs @@ -889,6 +889,95 @@ namespace GitHub.Runner.Common.Tests.Worker } } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void ActionVariables_DebugUsingVars() + { + using (TestHostContext hc = CreateTestContext()) + { + TaskOrchestrationPlanReference plan = new TaskOrchestrationPlanReference(); + TimelineReference timeline = new TimelineReference(); + Guid jobId = Guid.NewGuid(); + string jobName = "some job name"; + var jobRequest = new Pipelines.AgentJobRequestMessage(plan, timeline, jobId, jobName, jobName, null, null, null, new Dictionary(), new List(), new Pipelines.JobResources(), new Pipelines.ContextData.DictionaryContextData(), new Pipelines.WorkspaceOptions(), new List(), null, null, null, null); + jobRequest.Resources.Repositories.Add(new Pipelines.RepositoryResource() + { + Alias = Pipelines.PipelineConstants.SelfAlias, + Id = "github", + Version = "sha1" + }); + jobRequest.ContextData["github"] = new Pipelines.ContextData.DictionaryContextData(); + + var inputVarsContext = new DictionaryContextData(); + + inputVarsContext[Constants.Variables.Actions.StepDebug] = new StringContextData("true"); + inputVarsContext[Constants.Variables.Actions.RunnerDebug] = new StringContextData("true"); + jobRequest.ContextData["vars"] = inputVarsContext; + + // Arrange: Setup the paging logger. + var pagingLogger1 = new Mock(); + var jobServerQueue = new Mock(); + hc.EnqueueInstance(pagingLogger1.Object); + hc.SetSingleton(jobServerQueue.Object); + + var jobContext = new Runner.Worker.ExecutionContext(); + jobContext.Initialize(hc); + + jobContext.InitializeJob(jobRequest, CancellationToken.None); + + + Assert.Equal("true", jobContext.Global.Variables.Get(Constants.Variables.Actions.StepDebug)); + Assert.Equal("true", jobContext.Global.Variables.Get(Constants.Variables.Actions.RunnerDebug)); + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void ActionVariables_SecretsPrecedenceForDebugUsingVars() + { + using (TestHostContext hc = CreateTestContext()) + { + TaskOrchestrationPlanReference plan = new TaskOrchestrationPlanReference(); + TimelineReference timeline = new TimelineReference(); + Guid jobId = Guid.NewGuid(); + string jobName = "some job name"; + var jobRequest = new Pipelines.AgentJobRequestMessage(plan, timeline, jobId, jobName, jobName, null, null, null, new Dictionary(), new List(), new Pipelines.JobResources(), new Pipelines.ContextData.DictionaryContextData(), new Pipelines.WorkspaceOptions(), new List(), null, null, null, null); + jobRequest.Resources.Repositories.Add(new Pipelines.RepositoryResource() + { + Alias = Pipelines.PipelineConstants.SelfAlias, + Id = "github", + Version = "sha1" + }); + jobRequest.ContextData["github"] = new Pipelines.ContextData.DictionaryContextData(); + + var inputVarsContext = new DictionaryContextData(); + + inputVarsContext[Constants.Variables.Actions.StepDebug] = new StringContextData("true"); + inputVarsContext[Constants.Variables.Actions.RunnerDebug] = new StringContextData("true"); + jobRequest.ContextData["vars"] = inputVarsContext; + + jobRequest.Variables[Constants.Variables.Actions.StepDebug] = "false"; + jobRequest.Variables[Constants.Variables.Actions.RunnerDebug] = "false"; + + // Arrange: Setup the paging logger. + var pagingLogger1 = new Mock(); + var jobServerQueue = new Mock(); + hc.EnqueueInstance(pagingLogger1.Object); + hc.SetSingleton(jobServerQueue.Object); + + var jobContext = new Runner.Worker.ExecutionContext(); + jobContext.Initialize(hc); + + jobContext.InitializeJob(jobRequest, CancellationToken.None); + + + Assert.Equal("false", jobContext.Global.Variables.Get(Constants.Variables.Actions.StepDebug)); + Assert.Equal("false", jobContext.Global.Variables.Get(Constants.Variables.Actions.RunnerDebug)); + } + } + private bool ExpressionValuesAssertEqual(DictionaryContextData expect, DictionaryContextData actual) { foreach (var key in expect.Keys.ToList())