Issue 1662: retry policy for methods GetTenantCredential and GetJITRunnerTokenAsync (#1691)

* Issue 1662: Adding retry policy for methods GetTenantCredential and GetJITRunnerTokenAsync

* Adding HttpClient creation to the retry

* Random backoff time
This commit is contained in:
ruvceskistefan
2022-02-16 16:56:45 +01:00
committed by GitHub
parent bd77ccf34e
commit f2578529b0

View File

@@ -613,32 +613,52 @@ namespace GitHub.Runner.Listener.Configuration
throw new ArgumentException($"'{githubUrl}' should point to an org or repository."); throw new ArgumentException($"'{githubUrl}' should point to an org or repository.");
} }
using (var httpClientHandler = HostContext.CreateHttpClientHandler()) int retryCount = 0;
using (var httpClient = new HttpClient(httpClientHandler)) while(retryCount < 3)
{ {
var base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"github:{githubToken}")); using (var httpClientHandler = HostContext.CreateHttpClientHandler())
HostContext.SecretMasker.AddValue(base64EncodingToken); using (var httpClient = new HttpClient(httpClientHandler))
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 base64EncodingToken = Convert.ToBase64String(Encoding.UTF8.GetBytes($"github:{githubToken}"));
var jsonResponse = await response.Content.ReadAsStringAsync(); HostContext.SecretMasker.AddValue(base64EncodingToken);
return StringUtil.ConvertFromJson<GitHubRunnerRegisterToken>(jsonResponse); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", base64EncodingToken);
} httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents);
else httpClient.DefaultRequestHeaders.Accept.ParseAdd("application/vnd.github.v3+json");
{ try
_term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); {
var errorResponse = await response.Content.ReadAsStringAsync(); var response = await httpClient.PostAsync(githubApiUrl, new StringContent(string.Empty));
_term.WriteError(errorResponse);
response.EnsureSuccessStatusCode(); if (response.IsSuccessStatusCode)
return null; {
Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'");
var jsonResponse = await response.Content.ReadAsStringAsync();
return StringUtil.ConvertFromJson<GitHubRunnerRegisterToken>(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<GitHubAuthResult> GetTenantCredential(string githubUrl, string githubToken, string runnerEvent) private async Task<GitHubAuthResult> GetTenantCredential(string githubUrl, string githubToken, string runnerEvent)
@@ -654,35 +674,57 @@ namespace GitHub.Runner.Listener.Configuration
githubApiUrl = $"{gitHubUrlBuilder.Scheme}://{gitHubUrlBuilder.Host}/api/v3/actions/runner-registration"; githubApiUrl = $"{gitHubUrlBuilder.Scheme}://{gitHubUrlBuilder.Host}/api/v3/actions/runner-registration";
} }
using (var httpClientHandler = HostContext.CreateHttpClientHandler()) int retryCount = 0;
using (var httpClient = new HttpClient(httpClientHandler)) while (retryCount < 3)
{ {
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("RemoteAuth", githubToken); using (var httpClientHandler = HostContext.CreateHttpClientHandler())
httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents); using (var httpClient = new HttpClient(httpClientHandler))
var bodyObject = new Dictionary<string, string>()
{ {
{"url", githubUrl}, httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("RemoteAuth", githubToken);
{"runner_event", runnerEvent} httpClient.DefaultRequestHeaders.UserAgent.AddRange(HostContext.UserAgents);
};
var response = await httpClient.PostAsync(githubApiUrl, new StringContent(StringUtil.ConvertToJson(bodyObject), null, "application/json")); var bodyObject = new Dictionary<string, string>()
{
{"url", githubUrl},
{"runner_event", runnerEvent}
};
if (response.IsSuccessStatusCode) try
{ {
Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); var response = await httpClient.PostAsync(githubApiUrl, new StringContent(StringUtil.ConvertToJson(bodyObject), null, "application/json"));
var jsonResponse = await response.Content.ReadAsStringAsync();
return StringUtil.ConvertFromJson<GitHubAuthResult>(jsonResponse); if(response.IsSuccessStatusCode)
} {
else Trace.Info($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'");
{ var jsonResponse = await response.Content.ReadAsStringAsync();
_term.WriteError($"Http response code: {response.StatusCode} from 'POST {githubApiUrl}'"); return StringUtil.ConvertFromJson<GitHubAuthResult>(jsonResponse);
var errorResponse = await response.Content.ReadAsStringAsync(); }
_term.WriteError(errorResponse); else if(response.StatusCode == System.Net.HttpStatusCode.NotFound)
response.EnsureSuccessStatusCode(); {
return null; // 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;
} }
} }
} }