diff --git a/src/Runner.Listener/Configuration/ConfigurationManager.cs b/src/Runner.Listener/Configuration/ConfigurationManager.cs index b70a1e7b91e..34b8e994f0a 100644 --- a/src/Runner.Listener/Configuration/ConfigurationManager.cs +++ b/src/Runner.Listener/Configuration/ConfigurationManager.cs @@ -613,32 +613,52 @@ private async Task GetJITRunnerTokenAsync(string gith throw new ArgumentException($"'{githubUrl}' should point to an org or repository."); } - using (var httpClientHandler = HostContext.CreateHttpClientHandler()) - using (var httpClient = new HttpClient(httpClientHandler)) + int retryCount = 0; + while(retryCount < 3) { - var base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"github:{githubToken}")); - HostContext.SecretMasker.AddValue(base64EncodingToken); - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", base64EncodingToken); - httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); - httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github.v3+json"); - - var response = await httpClient.PostAsync(githubApiUrl, new StringContent(string.Empty)); - - if (response.IsSuccessStatusCode) - { - Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); - var jsonResponse = await response.Content.ReadAsStringAsync(); - return StringUtil.ConvertFromJson(jsonResponse); - } - else + using (var httpClientHandler = HostContext.CreateHttpClientHandler()) + using (var httpClient = new HttpClient(httpClientHandler)) { - _term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); - var errorResponse = await response.Content.ReadAsStringAsync(); - _term.WriteError(errorResponse); - response.EnsureSuccessStatusCode(); - return null; + var base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"github:{githubToken}")); + HostContext.SecretMasker.AddValue(base64EncodingToken); + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", base64EncodingToken); + httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); + httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github.v3+json"); + try + { + var response = await httpClient.PostAsync(githubApiUrl, new StringContent(string.Empty)); + + if (response.IsSuccessStatusCode) + { + Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return StringUtil.ConvertFromJson(jsonResponse); + } + else if(response.StatusCode == System.Net.HttpStatusCode.NotFound) + { + // It doesn't make sense to retry in this case, so just stop + break; + } + else + { + _term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); + var errorResponse = await response.Content.ReadAsStringAsync(); + _term.WriteError(errorResponse); + response.EnsureSuccessStatusCode(); + } + } + catch(Exception ex) when (retryCount < 2) + { + retryCount++; + Trace.Error($"Failed to get JIT runner token -- Atempt: {retryCount}"); + Trace.Error(ex); + Trace.Info("Retrying in 5 seconds"); + } } + var backOff = BackoffTimerHelper.GetRandomBackoff(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5)); + await Task.Delay(backOff); } + return null; } private async Task GetTenantCredential(string githubUrl, string githubToken, string runnerEvent) @@ -654,35 +674,57 @@ private async Task GetTenantCredential(string githubUrl, strin githubApiUrl = $"{gitHubUrlBuilder.Scheme}://{gitHubUrlBuilder.Host}/api/v3/actions/runner-registration"; } - using (var httpClientHandler = HostContext.CreateHttpClientHandler()) - using (var httpClient = new HttpClient(httpClientHandler)) + int retryCount = 0; + while (retryCount < 3) { - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("RemoteAuth", githubToken); - httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); - - var bodyObject = new Dictionary() + using (var httpClientHandler = HostContext.CreateHttpClientHandler()) + using (var httpClient = new HttpClient(httpClientHandler)) { - {"url", githubUrl}, - {"runner_event", runnerEvent} - }; + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("RemoteAuth", githubToken); + httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); - var response = await httpClient.PostAsync(githubApiUrl, new StringContent(StringUtil.ConvertToJson(bodyObject), null, "application/json")); + var bodyObject = new Dictionary() + { + {"url", githubUrl}, + {"runner_event", runnerEvent} + }; - if (response.IsSuccessStatusCode) - { - Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); - var jsonResponse = await response.Content.ReadAsStringAsync(); - return StringUtil.ConvertFromJson(jsonResponse); - } - else - { - _term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); - var errorResponse = await response.Content.ReadAsStringAsync(); - _term.WriteError(errorResponse); - response.EnsureSuccessStatusCode(); - return null; + try + { + var response = await httpClient.PostAsync(githubApiUrl, new StringContent(StringUtil.ConvertToJson(bodyObject), null, "application/json")); + + if(response.IsSuccessStatusCode) + { + Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); + var jsonResponse = await response.Content.ReadAsStringAsync(); + return StringUtil.ConvertFromJson(jsonResponse); + } + else if(response.StatusCode == System.Net.HttpStatusCode.NotFound) + { + // It doesn't make sense to retry in this case, so just stop + break; + } + else + { + _term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); + var errorResponse = await response.Content.ReadAsStringAsync(); + _term.WriteError(errorResponse); + // Something else bad happened, let's go to our retry logic + response.EnsureSuccessStatusCode(); + } + } + catch(Exception ex) when (retryCount < 2) + { + retryCount++; + Trace.Error($"Failed to get tenant credentials -- Atempt: {retryCount}"); + Trace.Error(ex); + Trace.Info("Retrying in 5 seconds"); + } } + var backOff = BackoffTimerHelper.GetRandomBackoff(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5)); + await Task.Delay(backOff); } + return null; } } }