mirror of
https://github.com/actions/runner.git
synced 2025-12-10 20:36:49 +00:00
Compare commits
1 Commits
users/eric
...
feature/do
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a3abd6814 |
@@ -4,7 +4,7 @@
|
|||||||
"features": {
|
"features": {
|
||||||
"ghcr.io/devcontainers/features/docker-in-docker:1": {},
|
"ghcr.io/devcontainers/features/docker-in-docker:1": {},
|
||||||
"ghcr.io/devcontainers/features/dotnet": {
|
"ghcr.io/devcontainers/features/dotnet": {
|
||||||
"version": "6.0.421"
|
"version": "6.0.422"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version": "16"
|
"version": "16"
|
||||||
|
|||||||
@@ -5,8 +5,8 @@ ARG TARGETOS
|
|||||||
ARG TARGETARCH
|
ARG TARGETARCH
|
||||||
ARG RUNNER_VERSION
|
ARG RUNNER_VERSION
|
||||||
ARG RUNNER_CONTAINER_HOOKS_VERSION=0.6.0
|
ARG RUNNER_CONTAINER_HOOKS_VERSION=0.6.0
|
||||||
ARG DOCKER_VERSION=25.0.5
|
ARG DOCKER_VERSION=25.0.4
|
||||||
ARG BUILDX_VERSION=0.13.2
|
ARG BUILDX_VERSION=0.13.1
|
||||||
|
|
||||||
RUN apt update -y && apt install curl unzip -y
|
RUN apt update -y && apt install curl unzip -y
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
## What's Changed
|
## What's Changed
|
||||||
|
|
||||||
- Do not give up when uploading steps metadata by @yacaovsnc in https://github.com/actions/runner/pull/3280
|
- Preserve dates when deserializing job message from Run Service by @ericsciple in https://github.com/actions/runner/pull/3269
|
||||||
- Upgrade node20 to 20.13.1 by @pje in https://github.com/actions/runner/pull/3284
|
|
||||||
- Delete all the contentHash files by @pje in https://github.com/actions/runner/pull/3285
|
|
||||||
- Make it easy to install `git` on an Action Runner Image by @jww3 in https://github.com/actions/runner/pull/3273
|
|
||||||
- Install `gpg-agent` during actions/runner container image build by @jww3 in https://github.com/actions/runner/pull/3294
|
|
||||||
|
|
||||||
**Full Changelog**: https://github.com/actions/runner/compare/v2.316.1...v2.317.0
|
**Full Changelog**: https://github.com/actions/runner/compare/v2.316.0...v2.316.1
|
||||||
|
|
||||||
_Note: Actions Runner follows a progressive release policy, so the latest release might not be available to your enterprise, organization, or repository yet.
|
_Note: Actions Runner follows a progressive release policy, so the latest release might not be available to your enterprise, organization, or repository yet.
|
||||||
To confirm which version of the Actions Runner you should expect, please view the download instructions for your enterprise, organization, or repository.
|
To confirm which version of the Actions Runner you should expect, please view the download instructions for your enterprise, organization, or repository.
|
||||||
|
|||||||
@@ -22,8 +22,6 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
Task<TaskAgentMessage> GetRunnerMessageAsync(Guid? sessionId, TaskAgentStatus status, string version, string os, string architecture, bool disableUpdate, CancellationToken token);
|
Task<TaskAgentMessage> GetRunnerMessageAsync(Guid? sessionId, TaskAgentStatus status, string version, string os, string architecture, bool disableUpdate, CancellationToken token);
|
||||||
|
|
||||||
Task DeleteRunnerMessageAsync(Guid sessionId, string jobMessageKey, CancellationToken cancellationToken);
|
|
||||||
|
|
||||||
Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials);
|
Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials);
|
||||||
|
|
||||||
Task ForceRefreshConnection(VssCredentials credentials);
|
Task ForceRefreshConnection(VssCredentials credentials);
|
||||||
@@ -77,12 +75,6 @@ namespace GitHub.Runner.Common
|
|||||||
await _brokerHttpClient.DeleteSessionAsync(cancellationToken);
|
await _brokerHttpClient.DeleteSessionAsync(cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteRunnerMessageAsync(Guid sessionId, string jobMessageKey, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
CheckConnection();
|
|
||||||
await _brokerHttpClient.DeleteRunnerMessageAsync(sessionId, jobMessageKey, cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials)
|
public Task UpdateConnectionIfNeeded(Uri serverUri, VssCredentials credentials)
|
||||||
{
|
{
|
||||||
if (_brokerUri != serverUri || !_hasConnection)
|
if (_brokerUri != serverUri || !_hasConnection)
|
||||||
|
|||||||
@@ -613,7 +613,7 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
private void SendResultsTelemetry(Exception ex)
|
private void SendResultsTelemetry(Exception ex)
|
||||||
{
|
{
|
||||||
var issue = new Issue() { Type = IssueType.Warning, Message = $"Caught exception with results. {HostContext.SecretMasker.MaskSecrets(ex.Message)}" };
|
var issue = new Issue() { Type = IssueType.Warning, Message = $"Caught exception with results. {ex.Message}" };
|
||||||
issue.Data[Constants.Runner.InternalTelemetryIssueDataKey] = Constants.Runner.ResultsUploadFailure;
|
issue.Data[Constants.Runner.InternalTelemetryIssueDataKey] = Constants.Runner.ResultsUploadFailure;
|
||||||
|
|
||||||
var telemetryRecord = new TimelineRecord()
|
var telemetryRecord = new TimelineRecord()
|
||||||
|
|||||||
@@ -62,9 +62,7 @@ namespace GitHub.Runner.Common
|
|||||||
CheckConnection();
|
CheckConnection();
|
||||||
return RetryRequest<AgentJobRequestMessage>(
|
return RetryRequest<AgentJobRequestMessage>(
|
||||||
async () => await _runServiceHttpClient.GetJobMessageAsync(requestUri, id, VarUtil.OS, cancellationToken), cancellationToken,
|
async () => await _runServiceHttpClient.GetJobMessageAsync(requestUri, id, VarUtil.OS, cancellationToken), cancellationToken,
|
||||||
shouldRetry: ex => ex is not TaskOrchestrationJobNotFoundException &&
|
shouldRetry: ex => ex is not TaskOrchestrationJobAlreadyAcquiredException);
|
||||||
ex is not TaskOrchestrationJobAlreadyAcquiredException &&
|
|
||||||
ex is not TaskOrchestrationJobUnprocessableException);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task CompleteJobAsync(
|
public Task CompleteJobAsync(
|
||||||
|
|||||||
@@ -314,30 +314,7 @@ namespace GitHub.Runner.Listener
|
|||||||
|
|
||||||
public async Task DeleteMessageAsync(TaskAgentMessage message)
|
public async Task DeleteMessageAsync(TaskAgentMessage message)
|
||||||
{
|
{
|
||||||
Trace.Entering();
|
await Task.CompletedTask;
|
||||||
ArgUtil.NotNull(_session, nameof(_session));
|
|
||||||
|
|
||||||
if (message == null || _session.SessionId == Guid.Empty)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var jobMessageKey = "";
|
|
||||||
if (MessageUtil.IsRunServiceJob(message.MessageType))
|
|
||||||
{
|
|
||||||
var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body);
|
|
||||||
jobMessageKey = messageRef.RunnerRequestId;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Broker currently doesn't support delete for other message types
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
using (var cs = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
|
|
||||||
{
|
|
||||||
await _brokerServer.DeleteRunnerMessageAsync(_session.SessionId, jobMessageKey, cs.Token);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsGetNextMessageExceptionRetriable(Exception ex)
|
private bool IsGetNextMessageExceptionRetriable(Exception ex)
|
||||||
|
|||||||
@@ -398,15 +398,7 @@ namespace GitHub.Runner.Listener
|
|||||||
{
|
{
|
||||||
using (var cs = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
|
using (var cs = new CancellationTokenSource(TimeSpan.FromSeconds(30)))
|
||||||
{
|
{
|
||||||
if (MessageUtil.IsRunServiceJob(message.MessageType))
|
await _runnerServer.DeleteAgentMessageAsync(_settings.PoolId, message.MessageId, _session.SessionId, cs.Token);
|
||||||
{
|
|
||||||
var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body);
|
|
||||||
await _brokerServer.DeleteRunnerMessageAsync(_session.SessionId, messageRef.RunnerRequestId, cs.Token);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
await _runnerServer.DeleteAgentMessageAsync(_settings.PoolId, message.MessageId, _session.SessionId, cs.Token);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -544,8 +544,6 @@ namespace GitHub.Runner.Listener
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
skipMessageDeletion = true;
|
|
||||||
|
|
||||||
var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body);
|
var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body);
|
||||||
Pipelines.AgentJobRequestMessage jobRequestMessage = null;
|
Pipelines.AgentJobRequestMessage jobRequestMessage = null;
|
||||||
|
|
||||||
@@ -565,15 +563,13 @@ namespace GitHub.Runner.Listener
|
|||||||
await runServer.ConnectAsync(new Uri(messageRef.RunServiceUrl), creds);
|
await runServer.ConnectAsync(new Uri(messageRef.RunServiceUrl), creds);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
jobRequestMessage = await runServer.GetJobMessageAsync(messageRef.RunnerRequestId, messageQueueLoopTokenSource.Token);
|
jobRequestMessage =
|
||||||
|
await runServer.GetJobMessageAsync(messageRef.RunnerRequestId,
|
||||||
|
messageQueueLoopTokenSource.Token);
|
||||||
}
|
}
|
||||||
catch (Exception ex) when (
|
catch (TaskOrchestrationJobAlreadyAcquiredException)
|
||||||
ex is TaskOrchestrationJobNotFoundException ||
|
|
||||||
ex is TaskOrchestrationJobAlreadyAcquiredException ||
|
|
||||||
ex is TaskOrchestrationJobUnprocessableException)
|
|
||||||
{
|
{
|
||||||
Trace.Error($"Skipping job: {ex.Message}");
|
Trace.Info("Job is already acquired, skip this message.");
|
||||||
skipMessageDeletion = false;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -1539,26 +1539,6 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[Serializable]
|
|
||||||
[ExceptionMapping("0.0", "3.0", "TaskOrchestrationJobUnprocessableException", "GitHub.DistributedTask.WebApi.TaskOrchestrationJobUnprocessableException, GitHub.DistributedTask.WebApi, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
|
||||||
public sealed class TaskOrchestrationJobUnprocessableException : DistributedTaskException
|
|
||||||
{
|
|
||||||
public TaskOrchestrationJobUnprocessableException(String message)
|
|
||||||
: base(message)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public TaskOrchestrationJobUnprocessableException(String message, Exception innerException)
|
|
||||||
: base(message, innerException)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
private TaskOrchestrationJobUnprocessableException(SerializationInfo info, StreamingContext context)
|
|
||||||
: base(info, context)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Serializable]
|
[Serializable]
|
||||||
[ExceptionMapping("0.0", "3.0", "TaskOrchestrationPlanSecurityException", "GitHub.DistributedTask.WebApi.TaskOrchestrationPlanSecurityException, GitHub.DistributedTask.WebApi, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
[ExceptionMapping("0.0", "3.0", "TaskOrchestrationPlanSecurityException", "GitHub.DistributedTask.WebApi.TaskOrchestrationPlanSecurityException, GitHub.DistributedTask.WebApi, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
|
||||||
public sealed class TaskOrchestrationPlanSecurityException : DistributedTaskException
|
public sealed class TaskOrchestrationPlanSecurityException : DistributedTaskException
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace GitHub.Actions.RunService.WebApi
|
|
||||||
{
|
|
||||||
[DataContract]
|
|
||||||
public class RunServiceError
|
|
||||||
{
|
|
||||||
[DataMember(Name = "source", EmitDefaultValue = false)]
|
|
||||||
public string Source { get; set; }
|
|
||||||
|
|
||||||
[DataMember(Name = "statusCode", EmitDefaultValue = false)]
|
|
||||||
public int StatusCode { get; set; }
|
|
||||||
|
|
||||||
[DataMember(Name = "errorMessage", EmitDefaultValue = false)]
|
|
||||||
public string ErrorMessage { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -86,7 +86,6 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
httpMethod,
|
httpMethod,
|
||||||
requestUri: requestUri,
|
requestUri: requestUri,
|
||||||
content: requestContent,
|
content: requestContent,
|
||||||
readErrorContent: true,
|
|
||||||
cancellationToken: cancellationToken);
|
cancellationToken: cancellationToken);
|
||||||
|
|
||||||
if (result.IsSuccess)
|
if (result.IsSuccess)
|
||||||
@@ -94,35 +93,14 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
return result.Value;
|
return result.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TryParseErrorContent(result.ErrorContent, out RunServiceError error))
|
|
||||||
{
|
|
||||||
switch ((HttpStatusCode)error.StatusCode)
|
|
||||||
{
|
|
||||||
case HttpStatusCode.NotFound:
|
|
||||||
throw new TaskOrchestrationJobNotFoundException($"Job message not found '{messageId}'. {error.ErrorMessage}");
|
|
||||||
case HttpStatusCode.Conflict:
|
|
||||||
throw new TaskOrchestrationJobAlreadyAcquiredException($"Job message already acquired '{messageId}'. {error.ErrorMessage}");
|
|
||||||
case HttpStatusCode.UnprocessableEntity:
|
|
||||||
throw new TaskOrchestrationJobUnprocessableException($"Unprocessable job '{messageId}'. {error.ErrorMessage}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Temporary back compat
|
|
||||||
switch (result.StatusCode)
|
switch (result.StatusCode)
|
||||||
{
|
{
|
||||||
case HttpStatusCode.NotFound:
|
case HttpStatusCode.NotFound:
|
||||||
throw new TaskOrchestrationJobNotFoundException($"Job message not found: {messageId}");
|
throw new TaskOrchestrationJobNotFoundException($"Job message not found: {messageId}");
|
||||||
case HttpStatusCode.Conflict:
|
case HttpStatusCode.Conflict:
|
||||||
throw new TaskOrchestrationJobAlreadyAcquiredException($"Job message already acquired: {messageId}");
|
throw new TaskOrchestrationJobAlreadyAcquiredException($"Job message already acquired: {messageId}");
|
||||||
}
|
default:
|
||||||
|
throw new Exception($"Failed to get job message: {result.Error}");
|
||||||
if (!string.IsNullOrEmpty(result.ErrorContent))
|
|
||||||
{
|
|
||||||
throw new Exception($"Failed to get job message: {result.Error}. {result.ErrorContent}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
throw new Exception($"Failed to get job message: {result.Error}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -212,26 +190,5 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
|
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
|
||||||
return JsonConvert.DeserializeObject<T>(json, s_serializerSettings);
|
return JsonConvert.DeserializeObject<T>(json, s_serializerSettings);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool TryParseErrorContent(string errorContent, out RunServiceError error)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(errorContent))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
error = JsonUtility.FromString<RunServiceError>(errorContent);
|
|
||||||
if (error?.Source == "actions-run-service")
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
string os = null,
|
string os = null,
|
||||||
string architecture = null,
|
string architecture = null,
|
||||||
bool? disableUpdate = null,
|
bool? disableUpdate = null,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default
|
||||||
|
)
|
||||||
{
|
{
|
||||||
var requestUri = new Uri(Client.BaseAddress, "message");
|
var requestUri = new Uri(Client.BaseAddress, "message");
|
||||||
|
|
||||||
@@ -122,42 +123,8 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
throw new Exception($"Failed to get job message: {result.Error}");
|
throw new Exception($"Failed to get job message: {result.Error}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task DeleteRunnerMessageAsync(
|
|
||||||
Guid? sessionId,
|
|
||||||
string jobMessageKey,
|
|
||||||
CancellationToken cancellationToken = default)
|
|
||||||
{
|
|
||||||
var requestUri = new Uri(Client.BaseAddress, "message");
|
|
||||||
|
|
||||||
List<KeyValuePair<string, string>> queryParams = new List<KeyValuePair<string, string>>();
|
|
||||||
|
|
||||||
if (sessionId != null)
|
|
||||||
{
|
|
||||||
queryParams.Add("sessionId", sessionId.Value.ToString());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(jobMessageKey))
|
|
||||||
{
|
|
||||||
queryParams.Add("jobMessageKey", jobMessageKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
queryParams.Add("status", TaskAgentStatus.Online.ToString());
|
|
||||||
|
|
||||||
var result = await SendAsync<object>(
|
|
||||||
new HttpMethod("DELETE"),
|
|
||||||
requestUri: requestUri,
|
|
||||||
queryParameters: queryParams,
|
|
||||||
cancellationToken: cancellationToken);
|
|
||||||
|
|
||||||
if (result.IsSuccess)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception($"Failed to get job message: StatusCode={result.StatusCode} Error={result.Error}");
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<TaskAgentSession> CreateSessionAsync(
|
public async Task<TaskAgentSession> CreateSessionAsync(
|
||||||
|
|
||||||
TaskAgentSession session,
|
TaskAgentSession session,
|
||||||
CancellationToken cancellationToken = default)
|
CancellationToken cancellationToken = default)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -106,11 +106,10 @@ namespace Sdk.WebApi.WebApi
|
|||||||
Uri requestUri,
|
Uri requestUri,
|
||||||
HttpContent content = null,
|
HttpContent content = null,
|
||||||
IEnumerable<KeyValuePair<String, String>> queryParameters = null,
|
IEnumerable<KeyValuePair<String, String>> queryParameters = null,
|
||||||
Boolean readErrorContent = false,
|
|
||||||
Object userState = null,
|
Object userState = null,
|
||||||
CancellationToken cancellationToken = default(CancellationToken))
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
return SendAsync<T>(method, null, requestUri, content, queryParameters, readErrorContent, userState, cancellationToken);
|
return SendAsync<T>(method, null, requestUri, content, queryParameters, userState, cancellationToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<RawHttpClientResult<T>> SendAsync<T>(
|
protected async Task<RawHttpClientResult<T>> SendAsync<T>(
|
||||||
@@ -119,20 +118,18 @@ namespace Sdk.WebApi.WebApi
|
|||||||
Uri requestUri,
|
Uri requestUri,
|
||||||
HttpContent content = null,
|
HttpContent content = null,
|
||||||
IEnumerable<KeyValuePair<String, String>> queryParameters = null,
|
IEnumerable<KeyValuePair<String, String>> queryParameters = null,
|
||||||
Boolean readErrorContent = false,
|
|
||||||
Object userState = null,
|
Object userState = null,
|
||||||
CancellationToken cancellationToken = default(CancellationToken))
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
using (VssTraceActivity.GetOrCreate().EnterCorrelationScope())
|
using (VssTraceActivity.GetOrCreate().EnterCorrelationScope())
|
||||||
using (HttpRequestMessage requestMessage = CreateRequestMessage(method, additionalHeaders, requestUri, content, queryParameters))
|
using (HttpRequestMessage requestMessage = CreateRequestMessage(method, additionalHeaders, requestUri, content, queryParameters))
|
||||||
{
|
{
|
||||||
return await SendAsync<T>(requestMessage, readErrorContent, userState, cancellationToken).ConfigureAwait(false);
|
return await SendAsync<T>(requestMessage, userState, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async Task<RawHttpClientResult<T>> SendAsync<T>(
|
protected async Task<RawHttpClientResult<T>> SendAsync<T>(
|
||||||
HttpRequestMessage message,
|
HttpRequestMessage message,
|
||||||
Boolean readErrorContent = false,
|
|
||||||
Object userState = null,
|
Object userState = null,
|
||||||
CancellationToken cancellationToken = default(CancellationToken))
|
CancellationToken cancellationToken = default(CancellationToken))
|
||||||
{
|
{
|
||||||
@@ -148,14 +145,8 @@ namespace Sdk.WebApi.WebApi
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var errorContent = default(string);
|
|
||||||
if (readErrorContent)
|
|
||||||
{
|
|
||||||
errorContent = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
string errorMessage = $"Error: {response.ReasonPhrase}";
|
string errorMessage = $"Error: {response.ReasonPhrase}";
|
||||||
return RawHttpClientResult<T>.Fail(errorMessage, response.StatusCode, errorContent);
|
return RawHttpClientResult<T>.Fail(errorMessage, response.StatusCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,27 +5,15 @@ namespace Sdk.WebApi.WebApi
|
|||||||
public class RawHttpClientResult
|
public class RawHttpClientResult
|
||||||
{
|
{
|
||||||
public bool IsSuccess { get; protected set; }
|
public bool IsSuccess { get; protected set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// A description of the HTTP status code, like "Error: Unprocessable Entity"
|
|
||||||
/// </summary>
|
|
||||||
public string Error { get; protected set; }
|
public string Error { get; protected set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The raw of the HTTP response, for unsuccessful HTTP status codes
|
|
||||||
/// </summary>
|
|
||||||
public string ErrorContent { get; protected set; }
|
|
||||||
|
|
||||||
public HttpStatusCode StatusCode { get; protected set; }
|
public HttpStatusCode StatusCode { get; protected set; }
|
||||||
|
|
||||||
public bool IsFailure => !IsSuccess;
|
public bool IsFailure => !IsSuccess;
|
||||||
|
|
||||||
protected RawHttpClientResult(bool isSuccess, string error, HttpStatusCode statusCode, string errorContent = null)
|
protected RawHttpClientResult(bool isSuccess, string error, HttpStatusCode statusCode)
|
||||||
{
|
{
|
||||||
IsSuccess = isSuccess;
|
IsSuccess = isSuccess;
|
||||||
Error = error;
|
Error = error;
|
||||||
StatusCode = statusCode;
|
StatusCode = statusCode;
|
||||||
ErrorContent = errorContent;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -33,13 +21,13 @@ namespace Sdk.WebApi.WebApi
|
|||||||
{
|
{
|
||||||
public T Value { get; private set; }
|
public T Value { get; private set; }
|
||||||
|
|
||||||
protected internal RawHttpClientResult(T value, bool isSuccess, string error, HttpStatusCode statusCode, string errorContent)
|
protected internal RawHttpClientResult(T value, bool isSuccess, string error, HttpStatusCode statusCode)
|
||||||
: base(isSuccess, error, statusCode, errorContent)
|
: base(isSuccess, error, statusCode)
|
||||||
{
|
{
|
||||||
Value = value;
|
Value = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static RawHttpClientResult<T> Fail(string message, HttpStatusCode statusCode, string errorContent) => new RawHttpClientResult<T>(default(T), false, message, statusCode, errorContent);
|
public static RawHttpClientResult<T> Fail(string message, HttpStatusCode statusCode) => new RawHttpClientResult<T>(default(T), false, message, statusCode);
|
||||||
public static RawHttpClientResult<T> Ok(T value) => new RawHttpClientResult<T>(value, true, string.Empty, HttpStatusCode.OK, null);
|
public static RawHttpClientResult<T> Ok(T value) => new RawHttpClientResult<T>(value, true, string.Empty, HttpStatusCode.OK);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
trace.Info("Parsed");
|
trace.Info("Parsed");
|
||||||
|
|
||||||
trace.Info("Commands: {0}", clp.Commands.Count);
|
trace.Info("Commands: {0}", clp.Commands.Count);
|
||||||
Assert.Equal(2, clp.Commands.Count);
|
Assert.True(clp.Commands.Count == 2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
trace.Info("Parsed");
|
trace.Info("Parsed");
|
||||||
|
|
||||||
trace.Info("Args: {0}", clp.Args.Count);
|
trace.Info("Args: {0}", clp.Args.Count);
|
||||||
Assert.Equal(2, clp.Args.Count);
|
Assert.True(clp.Args.Count == 2);
|
||||||
Assert.True(clp.Args.ContainsKey("arg1"));
|
Assert.True(clp.Args.ContainsKey("arg1"));
|
||||||
Assert.Equal("arg1val", clp.Args["arg1"]);
|
Assert.Equal("arg1val", clp.Args["arg1"]);
|
||||||
Assert.True(clp.Args.ContainsKey("arg2"));
|
Assert.True(clp.Args.ContainsKey("arg2"));
|
||||||
@@ -112,7 +112,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
trace.Info("Parsed");
|
trace.Info("Parsed");
|
||||||
|
|
||||||
trace.Info("Args: {0}", clp.Flags.Count);
|
trace.Info("Args: {0}", clp.Flags.Count);
|
||||||
Assert.Equal(2, clp.Flags.Count);
|
Assert.True(clp.Flags.Count == 2);
|
||||||
Assert.Contains("flag1", clp.Flags);
|
Assert.Contains("flag1", clp.Flags);
|
||||||
Assert.Contains("flag2", clp.Flags);
|
Assert.Contains("flag2", clp.Flags);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
"osx-arm64"
|
"osx-arm64"
|
||||||
};
|
};
|
||||||
|
|
||||||
Assert.Equal(40, BuildConstants.Source.CommitHash.Length);
|
Assert.True(BuildConstants.Source.CommitHash.Length == 40, $"CommitHash should be SHA-1 hash {BuildConstants.Source.CommitHash}");
|
||||||
Assert.True(validPackageNames.Contains(BuildConstants.RunnerPackage.PackageName), $"PackageName should be one of the following '{string.Join(", ", validPackageNames)}', current PackageName is '{BuildConstants.RunnerPackage.PackageName}'");
|
Assert.True(validPackageNames.Contains(BuildConstants.RunnerPackage.PackageName), $"PackageName should be one of the following '{string.Join(", ", validPackageNames)}', current PackageName is '{BuildConstants.RunnerPackage.PackageName}'");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -806,7 +806,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
"test runner" });
|
"test runner" });
|
||||||
|
|
||||||
// Assert.
|
// Assert.
|
||||||
Assert.Equal(0, command.Validate().Count);
|
Assert.True(command.Validate().Count == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -844,7 +844,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
var command = new CommandSettings(hc, args: new string[] { validCommand, $"--{flag}" });
|
var command = new CommandSettings(hc, args: new string[] { validCommand, $"--{flag}" });
|
||||||
|
|
||||||
// Assert.
|
// Assert.
|
||||||
Assert.Equal(0, command.Validate().Count);
|
Assert.True(command.Validate().Count == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -874,7 +874,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
var command = new CommandSettings(hc, args: new string[] { validCommand, $"--{arg}", argValue });
|
var command = new CommandSettings(hc, args: new string[] { validCommand, $"--{arg}", argValue });
|
||||||
|
|
||||||
// Assert.
|
// Assert.
|
||||||
Assert.Equal(0, command.Validate().Count);
|
Assert.True(command.Validate().Count == 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -190,11 +190,11 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
trace.Info("Configured, verifying all the parameter value");
|
trace.Info("Configured, verifying all the parameter value");
|
||||||
var s = configManager.LoadSettings();
|
var s = configManager.LoadSettings();
|
||||||
Assert.NotNull(s);
|
Assert.NotNull(s);
|
||||||
Assert.Equal(_expectedServerUrl, s.ServerUrl);
|
Assert.True(s.ServerUrl.Equals(_expectedServerUrl));
|
||||||
Assert.Equal(_expectedAgentName, s.AgentName);
|
Assert.True(s.AgentName.Equals(_expectedAgentName));
|
||||||
Assert.Equal(_secondRunnerGroupId, s.PoolId);
|
Assert.True(s.PoolId.Equals(_secondRunnerGroupId));
|
||||||
Assert.Equal(_expectedWorkFolder, s.WorkFolder);
|
Assert.True(s.WorkFolder.Equals(_expectedWorkFolder));
|
||||||
Assert.True(s.Ephemeral);
|
Assert.True(s.Ephemeral.Equals(true));
|
||||||
|
|
||||||
// validate GetAgentPoolsAsync gets called twice with automation pool type
|
// validate GetAgentPoolsAsync gets called twice with automation pool type
|
||||||
_runnerServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Exactly(2));
|
_runnerServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Exactly(2));
|
||||||
@@ -292,11 +292,11 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
trace.Info("Configured, verifying all the parameter value");
|
trace.Info("Configured, verifying all the parameter value");
|
||||||
var s = configManager.LoadSettings();
|
var s = configManager.LoadSettings();
|
||||||
Assert.NotNull(s);
|
Assert.NotNull(s);
|
||||||
Assert.Equal(_expectedServerUrl, s.ServerUrl);
|
Assert.True(s.ServerUrl.Equals(_expectedServerUrl));
|
||||||
Assert.Equal(_expectedAgentName, s.AgentName);
|
Assert.True(s.AgentName.Equals(_expectedAgentName));
|
||||||
Assert.Equal(_secondRunnerGroupId, s.PoolId);
|
Assert.True(s.PoolId.Equals(_secondRunnerGroupId));
|
||||||
Assert.Equal(_expectedWorkFolder, s.WorkFolder);
|
Assert.True(s.WorkFolder.Equals(_expectedWorkFolder));
|
||||||
Assert.True(s.Ephemeral);
|
Assert.True(s.Ephemeral.Equals(true));
|
||||||
|
|
||||||
// validate GetAgentPoolsAsync gets called twice with automation pool type
|
// validate GetAgentPoolsAsync gets called twice with automation pool type
|
||||||
_runnerServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Exactly(2));
|
_runnerServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Exactly(2));
|
||||||
|
|||||||
@@ -734,10 +734,7 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
await jobDispatcher.WaitAsync(CancellationToken.None);
|
await jobDispatcher.WaitAsync(CancellationToken.None);
|
||||||
|
|
||||||
Assert.True(jobDispatcher.RunOnceJobCompleted.Task.IsCompleted, "JobDispatcher should set task complete token for one time agent.");
|
Assert.True(jobDispatcher.RunOnceJobCompleted.Task.IsCompleted, "JobDispatcher should set task complete token for one time agent.");
|
||||||
if (jobDispatcher.RunOnceJobCompleted.Task.IsCompleted)
|
Assert.True(jobDispatcher.RunOnceJobCompleted.Task.Result, "JobDispatcher should set task complete token to 'TRUE' for one time agent.");
|
||||||
{
|
|
||||||
Assert.True(await jobDispatcher.RunOnceJobCompleted.Task, "JobDispatcher should set task complete token to 'TRUE' for one time agent.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
//wait for the runner to run one job
|
//wait for the runner to run one job
|
||||||
if (!await signalWorkerComplete.WaitAsync(2000))
|
if (!await signalWorkerComplete.WaitAsync(2000))
|
||||||
{
|
{
|
||||||
Assert.Fail($"{nameof(_messageListener.Object.GetNextMessageAsync)} was not invoked.");
|
Assert.True(false, $"{nameof(_messageListener.Object.GetNextMessageAsync)} was not invoked.");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -305,11 +305,8 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
await Task.WhenAny(runnerTask, Task.Delay(30000));
|
await Task.WhenAny(runnerTask, Task.Delay(30000));
|
||||||
|
|
||||||
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
||||||
Assert.False(runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
Assert.True(!runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
||||||
if (runnerTask.IsCompleted)
|
Assert.True(runnerTask.Result == Constants.Runner.ReturnCode.Success);
|
||||||
{
|
|
||||||
Assert.Equal(Constants.Runner.ReturnCode.Success, await runnerTask);
|
|
||||||
}
|
|
||||||
|
|
||||||
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Once(),
|
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Once(),
|
||||||
$"{nameof(_jobDispatcher.Object.Run)} was not invoked.");
|
$"{nameof(_jobDispatcher.Object.Run)} was not invoked.");
|
||||||
@@ -409,10 +406,7 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
|
|
||||||
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
||||||
Assert.True(!runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
Assert.True(!runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
||||||
if (runnerTask.IsCompleted)
|
Assert.True(runnerTask.Result == Constants.Runner.ReturnCode.Success);
|
||||||
{
|
|
||||||
Assert.Equal(Constants.Runner.ReturnCode.Success, await runnerTask);
|
|
||||||
}
|
|
||||||
|
|
||||||
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Once(),
|
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Once(),
|
||||||
$"{nameof(_jobDispatcher.Object.Run)} was not invoked.");
|
$"{nameof(_jobDispatcher.Object.Run)} was not invoked.");
|
||||||
@@ -498,10 +492,7 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
|
|
||||||
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
Assert.True(runnerTask.IsCompleted, $"{nameof(runner.ExecuteCommand)} timed out.");
|
||||||
Assert.True(!runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
Assert.True(!runnerTask.IsFaulted, runnerTask.Exception?.ToString());
|
||||||
if (runnerTask.IsCompleted)
|
Assert.True(runnerTask.Result == Constants.Runner.ReturnCode.RunOnceRunnerUpdating);
|
||||||
{
|
|
||||||
Assert.Equal(Constants.Runner.ReturnCode.RunOnceRunnerUpdating, await runnerTask);
|
|
||||||
}
|
|
||||||
|
|
||||||
_updater.Verify(x => x.SelfUpdate(It.IsAny<AgentRefreshMessage>(), It.IsAny<IJobDispatcher>(), false, It.IsAny<CancellationToken>()), Times.Once);
|
_updater.Verify(x => x.SelfUpdate(It.IsAny<AgentRefreshMessage>(), It.IsAny<IJobDispatcher>(), false, It.IsAny<CancellationToken>()), Times.Once);
|
||||||
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Never());
|
_jobDispatcher.Verify(x => x.Run(It.IsAny<Pipelines.AgentJobRequestMessage>(), true), Times.Never());
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
trace.Error(ex);
|
trace.Error(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert.Fail("Failed to retrieve process environment variable.");
|
Assert.True(false, "Fail to retrive process environment variable.");
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -65,14 +65,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (badCode.Count > 0)
|
Assert.True(badCode.Count == 0, $"The following code is using Raw HttpClientHandler() which will not follow the proxy setting agent have. Please use HostContext.CreateHttpClientHandler() instead.\n {string.Join("\n", badCode)}");
|
||||||
{
|
|
||||||
Assert.Fail($"The following code is using Raw HttpClientHandler() which will not follow the proxy setting agent have. Please use HostContext.CreateHttpClientHandler() instead.\n {string.Join("\n", badCode)}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Assert.True(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@@ -119,14 +112,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (badCode.Count > 0)
|
Assert.True(badCode.Count == 0, $"The following code is using Raw HttpClient() which will not follow the proxy setting agent have. Please use New HttpClient(HostContext.CreateHttpClientHandler()) instead.\n {string.Join("\n", badCode)}");
|
||||||
{
|
|
||||||
Assert.Fail($"The following code is using Raw HttpClient() which will not follow the proxy setting agent have. Please use New HttpClient(HostContext.CreateHttpClientHandler()) instead.\n {string.Join("\n", badCode)}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Assert.True(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|||||||
@@ -460,7 +460,7 @@ runs:
|
|||||||
//Act
|
//Act
|
||||||
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
||||||
|
|
||||||
Assert.Equal(0, steps.Count);
|
Assert.True(steps.Count == 0);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -915,7 +915,7 @@ runs:
|
|||||||
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
||||||
|
|
||||||
// node.js based action doesn't need any extra steps to build/pull containers.
|
// node.js based action doesn't need any extra steps to build/pull containers.
|
||||||
Assert.Equal(0, steps.Count);
|
Assert.True(steps.Count == 0);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
@@ -1051,7 +1051,7 @@ runs:
|
|||||||
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
var steps = (await _actionManager.PrepareActionsAsync(_ec.Object, actions)).ContainerSetupSteps;
|
||||||
|
|
||||||
// node.js based action doesn't need any extra steps to build/pull containers.
|
// node.js based action doesn't need any extra steps to build/pull containers.
|
||||||
Assert.Equal(0, steps.Count);
|
Assert.True(steps.Count == 0);
|
||||||
var watermarkFile = Path.Combine(_hc.GetDirectory(WellKnownDirectory.Actions), "TingluoHuang/runner_L0", "CompositeBasic.completed");
|
var watermarkFile = Path.Combine(_hc.GetDirectory(WellKnownDirectory.Actions), "TingluoHuang/runner_L0", "CompositeBasic.completed");
|
||||||
Assert.True(File.Exists(watermarkFile));
|
Assert.True(File.Exists(watermarkFile));
|
||||||
// Comes from the composite action
|
// Comes from the composite action
|
||||||
@@ -1245,7 +1245,7 @@ runs:
|
|||||||
// Assert.
|
// Assert.
|
||||||
Assert.NotNull(definition);
|
Assert.NotNull(definition);
|
||||||
Assert.NotNull(definition.Data);
|
Assert.NotNull(definition.Data);
|
||||||
Assert.Equal(ActionExecutionType.Script, definition.Data.Execution.ExecutionType);
|
Assert.True(definition.Data.Execution.ExecutionType == ActionExecutionType.Script);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||||
<PackageReference Include="xunit" Version="2.7.1" />
|
<PackageReference Include="xunit" Version="2.4.1" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.1" />
|
||||||
<PackageReference Include="System.Buffers" Version="4.5.1" />
|
<PackageReference Include="System.Buffers" Version="4.5.1" />
|
||||||
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" />
|
<PackageReference Include="System.Reflection.TypeExtensions" Version="4.4.0" />
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ LAYOUT_DIR="$SCRIPT_DIR/../_layout"
|
|||||||
DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x"
|
DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x"
|
||||||
PACKAGE_DIR="$SCRIPT_DIR/../_package"
|
PACKAGE_DIR="$SCRIPT_DIR/../_package"
|
||||||
DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk"
|
DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk"
|
||||||
DOTNETSDK_VERSION="6.0.421"
|
DOTNETSDK_VERSION="6.0.422"
|
||||||
DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION"
|
DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION"
|
||||||
RUNNER_VERSION=$(cat runnerversion)
|
RUNNER_VERSION=$(cat runnerversion)
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "6.0.421"
|
"version": "6.0.422"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.317.0
|
2.316.1
|
||||||
|
|||||||
Reference in New Issue
Block a user