diff --git a/src/Runner.Listener/MessageListener.cs b/src/Runner.Listener/MessageListener.cs index 056fe00f5..5718654b7 100644 --- a/src/Runner.Listener/MessageListener.cs +++ b/src/Runner.Listener/MessageListener.cs @@ -164,9 +164,30 @@ namespace GitHub.Runner.Listener } } + if (ex is TaskAgentSessionConflictException) + { + try + { + var newCred = await GetNewOAuthAuthorizationSetting(token, true); + if (newCred != null) + { + await _runnerServer.ConnectAsync(new Uri(_settings.ServerUrl), newCred); + Trace.Info("Updated connection to use migrated credential for next CreateSession call."); + _useMigratedCredentials = true; + _authorizationUrlMigrationBackgroundTask = null; + _needToCheckAuthorizationUrlUpdate = false; + } + } + catch (Exception e) + { + Trace.Error("Fail to refresh connection with new authorization url."); + Trace.Error(e); + } + } + if (!IsSessionCreationExceptionRetriable(ex)) { - if (_useMigratedCredentials) + if (_useMigratedCredentials && !(ex is TaskAgentSessionConflictException)) { // migrated credentials might cause lose permission during permission check, // we will force to use original credential and try again @@ -516,14 +537,11 @@ namespace GitHub.Runner.Listener } } - private async Task GetNewOAuthAuthorizationSetting(CancellationToken token) + private async Task GetNewOAuthAuthorizationSetting(CancellationToken token, bool adhoc = false) { Trace.Info("Start checking oauth authorization url update."); while (true) { - var backoff = BackoffTimerHelper.GetRandomBackoff(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(45)); - await HostContext.Delay(backoff, token); - try { var migratedAuthorizationUrl = await _runnerServer.GetRunnerAuthUrlAsync(_settings.PoolId, _settings.AgentId); @@ -538,7 +556,14 @@ namespace GitHub.Runner.Listener { // We don't need to update credentials. Trace.Info("No needs to update authorization url"); - await Task.Delay(TimeSpan.FromMilliseconds(-1), token); + if (adhoc) + { + return null; + } + else + { + await Task.Delay(TimeSpan.FromMilliseconds(-1), token); + } } var keyManager = HostContext.GetService(); @@ -572,7 +597,7 @@ namespace GitHub.Runner.Listener Trace.Verbose("No authorization url updates"); } } - catch (Exception ex) + catch (Exception ex) when (!token.IsCancellationRequested) { Trace.Error("Fail to get/test new authorization url."); Trace.Error(ex); @@ -588,6 +613,16 @@ namespace GitHub.Runner.Listener Trace.Error(e); } } + + if (adhoc) + { + return null; + } + else + { + var backoff = BackoffTimerHelper.GetRandomBackoff(TimeSpan.FromMinutes(30), TimeSpan.FromMinutes(45)); + await HostContext.Delay(backoff, token); + } } } } diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index 48c8d096f..f47629bf3 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -369,8 +369,8 @@ namespace GitHub.Runner.Worker if (!string.IsNullOrEmpty(ContextName)) { - StepsContext.SetOutcome(ScopeName, ContextName, (Outcome ?? Result ?? TaskResult.Succeeded).ToActionResult().ToString()); - StepsContext.SetConclusion(ScopeName, ContextName, (Result ?? TaskResult.Succeeded).ToActionResult().ToString()); + StepsContext.SetOutcome(ScopeName, ContextName, (Outcome ?? Result ?? TaskResult.Succeeded).ToActionResult()); + StepsContext.SetConclusion(ScopeName, ContextName, (Result ?? TaskResult.Succeeded).ToActionResult()); } return Result.Value; diff --git a/src/Runner.Worker/JobContext.cs b/src/Runner.Worker/JobContext.cs index 05d31ce28..d824fbe91 100644 --- a/src/Runner.Worker/JobContext.cs +++ b/src/Runner.Worker/JobContext.cs @@ -21,7 +21,7 @@ namespace GitHub.Runner.Worker } set { - this["status"] = new StringContextData(value.ToString()); + this["status"] = new StringContextData(value.ToString().ToLowerInvariant()); } } diff --git a/src/Runner.Worker/StepsContext.cs b/src/Runner.Worker/StepsContext.cs index d9add5a09..bcd3a6217 100644 --- a/src/Runner.Worker/StepsContext.cs +++ b/src/Runner.Worker/StepsContext.cs @@ -59,19 +59,19 @@ namespace GitHub.Runner.Worker public void SetConclusion( string scopeName, string stepName, - string conclusion) + ActionResult conclusion) { var step = GetStep(scopeName, stepName); - step["conclusion"] = new StringContextData(conclusion); + step["conclusion"] = new StringContextData(conclusion.ToString().ToLowerInvariant()); } public void SetOutcome( string scopeName, string stepName, - string outcome) + ActionResult outcome) { var step = GetStep(scopeName, stepName); - step["outcome"] = new StringContextData(outcome); + step["outcome"] = new StringContextData(outcome.ToString().ToLowerInvariant()); } private DictionaryContextData GetStep(string scopeName, string stepName) diff --git a/src/Test/L0/Worker/ExecutionContextL0.cs b/src/Test/L0/Worker/ExecutionContextL0.cs index 38fe135ee..7dbbf099f 100644 --- a/src/Test/L0/Worker/ExecutionContextL0.cs +++ b/src/Test/L0/Worker/ExecutionContextL0.cs @@ -1,4 +1,5 @@ -using GitHub.DistributedTask.WebApi; +using GitHub.DistributedTask.Pipelines.ContextData; +using GitHub.DistributedTask.WebApi; using GitHub.Runner.Worker; using Moq; using System; @@ -323,6 +324,60 @@ namespace GitHub.Runner.Common.Tests.Worker } } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public void ActionResult_Lowercase() + { + 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(); + jobRequest.Variables["ACTIONS_STEP_DEBUG"] = "true"; + + // 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); + + // Act. + jobContext.InitializeJob(jobRequest, CancellationToken.None); + + jobContext.StepsContext.SetConclusion(null, "step1", ActionResult.Success); + var conclusion1 = (jobContext.StepsContext.GetScope(null)["step1"] as DictionaryContextData)["conclusion"].ToString(); + Assert.Equal(conclusion1, conclusion1.ToLowerInvariant()); + + jobContext.StepsContext.SetOutcome(null, "step2", ActionResult.Cancelled); + var outcome1 = (jobContext.StepsContext.GetScope(null)["step2"] as DictionaryContextData)["outcome"].ToString(); + Assert.Equal(outcome1, outcome1.ToLowerInvariant()); + + jobContext.StepsContext.SetConclusion(null, "step3", ActionResult.Failure); + var conclusion2 = (jobContext.StepsContext.GetScope(null)["step3"] as DictionaryContextData)["conclusion"].ToString(); + Assert.Equal(conclusion2, conclusion2.ToLowerInvariant()); + + jobContext.StepsContext.SetOutcome(null, "step4", ActionResult.Skipped); + var outcome2 = (jobContext.StepsContext.GetScope(null)["step4"] as DictionaryContextData)["outcome"].ToString(); + Assert.Equal(outcome2, outcome2.ToLowerInvariant()); + + jobContext.JobContext.Status = ActionResult.Success; + Assert.Equal(jobContext.JobContext["status"].ToString(), jobContext.JobContext["status"].ToString().ToLowerInvariant()); + } + } + private TestHostContext CreateTestContext([CallerMemberName] String testName = "") { var hc = new TestHostContext(this, testName); diff --git a/src/Test/L0/Worker/StepsRunnerL0.cs b/src/Test/L0/Worker/StepsRunnerL0.cs index c2996fab5..2d7cb9fb0 100644 --- a/src/Test/L0/Worker/StepsRunnerL0.cs +++ b/src/Test/L0/Worker/StepsRunnerL0.cs @@ -536,12 +536,12 @@ namespace GitHub.Runner.Common.Tests.Worker step2.Verify(x => x.RunAsync(), Times.Once); step3.Verify(x => x.RunAsync(), Times.Once); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["conclusion"].AssertString("")); - Assert.Equal(TaskResult.Failed.ToActionResult().ToString(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["conclusion"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Failed.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["conclusion"].AssertString("")); } } @@ -572,12 +572,12 @@ namespace GitHub.Runner.Common.Tests.Worker step2.Verify(x => x.RunAsync(), Times.Once); step3.Verify(x => x.RunAsync(), Times.Once); - Assert.Equal(TaskResult.Skipped.ToActionResult().ToString(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Skipped.ToActionResult().ToString(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["conclusion"].AssertString("")); - Assert.Equal(TaskResult.Failed.ToActionResult().ToString(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["conclusion"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["outcome"].AssertString("")); - Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Skipped.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Skipped.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step1"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Failed.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step2"].AssertDictionary("")["conclusion"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["outcome"].AssertString("")); + Assert.Equal(TaskResult.Succeeded.ToActionResult().ToString().ToLowerInvariant(), _stepContext.GetScope(null)["step3"].AssertDictionary("")["conclusion"].AssertString("")); } } @@ -615,8 +615,8 @@ namespace GitHub.Runner.Common.Tests.Worker stepContext.Object.Result = r; } - _stepContext.SetOutcome("", stepContext.Object.ContextName, (stepContext.Object.Outcome ?? stepContext.Object.Result ?? TaskResult.Succeeded).ToActionResult().ToString()); - _stepContext.SetConclusion("", stepContext.Object.ContextName, (stepContext.Object.Result ?? TaskResult.Succeeded).ToActionResult().ToString()); + _stepContext.SetOutcome("", stepContext.Object.ContextName, (stepContext.Object.Outcome ?? stepContext.Object.Result ?? TaskResult.Succeeded).ToActionResult()); + _stepContext.SetConclusion("", stepContext.Object.ContextName, (stepContext.Object.Result ?? TaskResult.Succeeded).ToActionResult()); }); var trace = hc.GetTrace(); stepContext.Setup(x => x.Write(It.IsAny(), It.IsAny())).Callback((string tag, string message) => { trace.Info($"[{tag}]{message}"); });