Compare commits

..
Author SHA1 Message Date
Tingluo Huang 566ff8485a . 2024-10-15 17:28:32 -04:00
Luke Tomlinson 9b3b554758 Remove Broker Migration Message logging (#3493) 2024-10-09 11:07:48 -04:00
Yashwanth Anantharaju 4d8402c260 add ref and type to job completion in run service (#3492)
* add ref and type to job completion in run service

* lint
2024-10-08 15:52:48 -04:00
github-actions[bot] aa0ee2bf64 Upgrade dotnet sdk to v6.0.425 (#3433)
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
2024-10-07 10:12:31 -04:00
eric sciple dcc64fead2 Fix release workflow to use distinct artifact names (#3485) 2024-10-03 14:43:10 -05:00
14 changed files with 230 additions and 205 deletions
+1 -1
View File
@@ -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.425"
}, },
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": "16" "version": "16"
+47 -47
View File
@@ -285,54 +285,54 @@ jobs:
asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}.tar.gz asset_name: actions-runner-linux-arm64-${{ steps.releaseNote.outputs.version }}.tar.gz
asset_content_type: application/octet-stream asset_content_type: application/octet-stream
# publish-image: publish-image:
# needs: release needs: release
# runs-on: ubuntu-latest runs-on: ubuntu-latest
# permissions: permissions:
# contents: read contents: read
# packages: write packages: write
# env: env:
# REGISTRY: ghcr.io REGISTRY: ghcr.io
# IMAGE_NAME: ${{ github.repository_owner }}/actions-runner IMAGE_NAME: ${{ github.repository_owner }}/actions-runner
# steps: steps:
# - name: Checkout repository - name: Checkout repository
# uses: actions/checkout@v3 uses: actions/checkout@v3
# - name: Compute image version - name: Compute image version
# id: image id: image
# uses: actions/github-script@v6 uses: actions/github-script@v6
# with: with:
# script: | script: |
# const fs = require('fs'); const fs = require('fs');
# const runnerVersion = fs.readFileSync('${{ github.workspace }}/releaseVersion', 'utf8').replace(/\n$/g, '') const runnerVersion = fs.readFileSync('${{ github.workspace }}/releaseVersion', 'utf8').replace(/\n$/g, '')
# console.log(`Using runner version ${runnerVersion}`) console.log(`Using runner version ${runnerVersion}`)
# core.setOutput('version', runnerVersion); core.setOutput('version', runnerVersion);
# - name: Setup Docker buildx - name: Setup Docker buildx
# uses: docker/setup-buildx-action@v2 uses: docker/setup-buildx-action@v2
# - name: Log into registry ${{ env.REGISTRY }} - name: Log into registry ${{ env.REGISTRY }}
# uses: docker/login-action@v2 uses: docker/login-action@v2
# with: with:
# registry: ${{ env.REGISTRY }} registry: ${{ env.REGISTRY }}
# username: ${{ github.actor }} username: ${{ github.actor }}
# password: ${{ secrets.GITHUB_TOKEN }} password: ${{ secrets.GITHUB_TOKEN }}
# - name: Build and push Docker image - name: Build and push Docker image
# id: build-and-push id: build-and-push
# uses: docker/build-push-action@v3 uses: docker/build-push-action@v3
# with: with:
# context: ./images context: ./images
# platforms: | platforms: |
# linux/amd64 linux/amd64
# linux/arm64 linux/arm64
# tags: | tags: |
# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.image.outputs.version }} ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ steps.image.outputs.version }}
# ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
# build-args: | build-args: |
# RUNNER_VERSION=${{ steps.image.outputs.version }} RUNNER_VERSION=${{ steps.image.outputs.version }}
# push: true push: true
# labels: | labels: |
# org.opencontainers.image.source=${{github.server_url}}/${{github.repository}} org.opencontainers.image.source=${{github.server_url}}/${{github.repository}}
# org.opencontainers.image.description=https://github.com/actions/runner/releases/tag/v${{ steps.image.outputs.version }} org.opencontainers.image.description=https://github.com/actions/runner/releases/tag/v${{ steps.image.outputs.version }}
# org.opencontainers.image.licenses=MIT org.opencontainers.image.licenses=MIT
+11 -2
View File
@@ -1,8 +1,17 @@
## What's Changed ## What's Changed
- Backport: Expose ENV for cache service v2. https://github.com/actions/runner/pull/3548 - Adding Snapshot additional mapping tokens https://github.com/actions/runner/pull/3468
- Create launch httpclient using the right handler and setting https://github.com/actions/runner/pull/3476
- Fix missing default user-agent for jitconfig runner https://github.com/actions/runner/pull/3473
- Cleanup back-compat code for interpreting Run Service status codes https://github.com/actions/runner/pull/3456
- Add runner or worker to the useragent https://github.com/actions/runner/pull/3457
- Handle Error Body in Responses from Broker https://github.com/actions/runner/pull/3454
- Fix issues for composite actions (Run Service flow) https://github.com/actions/runner/pull/3446
- Trace GitHub RequestId to log https://github.com/actions/runner/pull/3442
- Add `jq`, `git`, `unzip` and `curl` to default packages installed https://github.com/actions/runner/pull/3056
- Add pid to user-agent and session owner https://github.com/actions/runner/pull/3432
**Full Changelog**: https://github.com/actions/runner/compare/v2.320.0...v2.320.1 **Full Changelog**: https://github.com/actions/runner/compare/v2.319.1...v2.320.0
_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.
+1 -1
View File
@@ -1 +1 @@
2.320.1 <Update to ./src/runnerversion when creating release>
@@ -0,0 +1 @@
{ "2.319.0": {"targetVersion":"2.320.0"}}
+10 -11
View File
@@ -248,15 +248,16 @@ namespace GitHub.Runner.Listener
_getMessagesTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token); _getMessagesTokenSource = CancellationTokenSource.CreateLinkedTokenSource(token);
try try
{ {
message = await _runnerServer.GetAgentMessageAsync(_settings.PoolId, await Task.Delay(5000);
_session.SessionId, // message = await _runnerServer.GetAgentMessageAsync(_settings.PoolId,
_lastMessageId, // _session.SessionId,
runnerStatus, // _lastMessageId,
BuildConstants.RunnerPackage.Version, // runnerStatus,
VarUtil.OS, // BuildConstants.RunnerPackage.Version,
VarUtil.OSArchitecture, // VarUtil.OS,
_settings.DisableUpdate, // VarUtil.OSArchitecture,
_getMessagesTokenSource.Token); // _settings.DisableUpdate,
// _getMessagesTokenSource.Token);
// Decrypt the message body if the session is using encryption // Decrypt the message body if the session is using encryption
message = DecryptMessage(message); message = DecryptMessage(message);
@@ -264,8 +265,6 @@ namespace GitHub.Runner.Listener
if (message != null && message.MessageType == BrokerMigrationMessage.MessageType) if (message != null && message.MessageType == BrokerMigrationMessage.MessageType)
{ {
Trace.Info("BrokerMigration message received. Polling Broker for messages...");
var migrationMessage = JsonUtility.FromString<BrokerMigrationMessage>(message.Body); var migrationMessage = JsonUtility.FromString<BrokerMigrationMessage>(message.Body);
await _brokerServer.UpdateConnectionIfNeeded(migrationMessage.BrokerBaseUrl, _creds); await _brokerServer.UpdateConnectionIfNeeded(migrationMessage.BrokerBaseUrl, _creds);
+121 -121
View File
@@ -479,14 +479,14 @@ namespace GitHub.Runner.Listener
} }
} }
message = await getNextMessage; //get next message // message = await getNextMessage; //get next message
HostContext.WritePerfCounter($"MessageReceived_{message.MessageType}"); // HostContext.WritePerfCounter($"MessageReceived_{message.MessageType}");
if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) // if (string.Equals(message.MessageType, AgentRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase))
{ {
if (autoUpdateInProgress == false) if (autoUpdateInProgress == false)
{ {
autoUpdateInProgress = true; autoUpdateInProgress = true;
AgentRefreshMessage runnerUpdateMessage = JsonUtility.FromString<AgentRefreshMessage>(message.Body); AgentRefreshMessage runnerUpdateMessage = null;
#if DEBUG #if DEBUG
// Can mock the update for testing // Can mock the update for testing
@@ -502,9 +502,9 @@ namespace GitHub.Runner.Listener
if (mockUpdateMessages.ContainsKey(BuildConstants.RunnerPackage.Version)) if (mockUpdateMessages.ContainsKey(BuildConstants.RunnerPackage.Version))
{ {
var mockTargetVersion = mockUpdateMessages[BuildConstants.RunnerPackage.Version].TargetVersion; var mockTargetVersion = mockUpdateMessages[BuildConstants.RunnerPackage.Version].TargetVersion;
_term.WriteLine($"Mocking update, using version {mockTargetVersion} instead of {runnerUpdateMessage.TargetVersion}"); _term.WriteLine($"Mocking update, using version {mockTargetVersion}");
Trace.Info($"Mocking update, using version {mockTargetVersion} instead of {runnerUpdateMessage.TargetVersion}"); Trace.Info($"Mocking update, using version {mockTargetVersion}");
runnerUpdateMessage = new AgentRefreshMessage(runnerUpdateMessage.AgentId, mockTargetVersion, runnerUpdateMessage.Timeout); runnerUpdateMessage = new AgentRefreshMessage(settings.AgentId, mockTargetVersion, TimeSpan.FromSeconds(100));
} }
} }
} }
@@ -518,125 +518,125 @@ namespace GitHub.Runner.Listener
Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running."); Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running.");
} }
} }
else if (string.Equals(message.MessageType, RunnerRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase)) // else if (string.Equals(message.MessageType, RunnerRefreshMessage.MessageType, StringComparison.OrdinalIgnoreCase))
{ // {
if (autoUpdateInProgress == false) // if (autoUpdateInProgress == false)
{ // {
autoUpdateInProgress = true; // autoUpdateInProgress = true;
RunnerRefreshMessage brokerRunnerUpdateMessage = JsonUtility.FromString<RunnerRefreshMessage>(message.Body); // RunnerRefreshMessage brokerRunnerUpdateMessage = JsonUtility.FromString<RunnerRefreshMessage>(message.Body);
var selfUpdater = HostContext.GetService<ISelfUpdaterV2>(); // var selfUpdater = HostContext.GetService<ISelfUpdaterV2>();
selfUpdateTask = selfUpdater.SelfUpdate(brokerRunnerUpdateMessage, jobDispatcher, false, HostContext.RunnerShutdownToken); // selfUpdateTask = selfUpdater.SelfUpdate(brokerRunnerUpdateMessage, jobDispatcher, false, HostContext.RunnerShutdownToken);
Trace.Info("Refresh message received, kick-off selfupdate background process."); // Trace.Info("Refresh message received, kick-off selfupdate background process.");
} // }
else // else
{ // {
Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running."); // Trace.Info("Refresh message received, skip autoupdate since a previous autoupdate is already running.");
} // }
} // }
else if (string.Equals(message.MessageType, JobRequestMessageTypes.PipelineAgentJobRequest, StringComparison.OrdinalIgnoreCase)) // else if (string.Equals(message.MessageType, JobRequestMessageTypes.PipelineAgentJobRequest, StringComparison.OrdinalIgnoreCase))
{ // {
if (autoUpdateInProgress || runOnceJobReceived) // if (autoUpdateInProgress || runOnceJobReceived)
{ // {
skipMessageDeletion = true; // skipMessageDeletion = true;
Trace.Info($"Skip message deletion for job request message '{message.MessageId}'."); // Trace.Info($"Skip message deletion for job request message '{message.MessageId}'.");
} // }
else // else
{ // {
Trace.Info($"Received job message of length {message.Body.Length} from service, with hash '{IOUtil.GetSha256Hash(message.Body)}'"); // Trace.Info($"Received job message of length {message.Body.Length} from service, with hash '{IOUtil.GetSha256Hash(message.Body)}'");
var jobMessage = StringUtil.ConvertFromJson<Pipelines.AgentJobRequestMessage>(message.Body); // var jobMessage = StringUtil.ConvertFromJson<Pipelines.AgentJobRequestMessage>(message.Body);
jobDispatcher.Run(jobMessage, runOnce); // jobDispatcher.Run(jobMessage, runOnce);
if (runOnce) // if (runOnce)
{ // {
Trace.Info("One time used runner received job message."); // Trace.Info("One time used runner received job message.");
runOnceJobReceived = true; // runOnceJobReceived = true;
} // }
} // }
} // }
// Broker flow // // Broker flow
else if (MessageUtil.IsRunServiceJob(message.MessageType)) // else if (MessageUtil.IsRunServiceJob(message.MessageType))
{ // {
if (autoUpdateInProgress || runOnceJobReceived) // if (autoUpdateInProgress || runOnceJobReceived)
{ // {
skipMessageDeletion = true; // skipMessageDeletion = true;
Trace.Info($"Skip message deletion for job request message '{message.MessageId}'."); // Trace.Info($"Skip message deletion for job request message '{message.MessageId}'.");
} // }
else // else
{ // {
var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body); // var messageRef = StringUtil.ConvertFromJson<RunnerJobRequestRef>(message.Body);
Pipelines.AgentJobRequestMessage jobRequestMessage = null; // Pipelines.AgentJobRequestMessage jobRequestMessage = null;
// Create connection // // Create connection
var credMgr = HostContext.GetService<ICredentialManager>(); // var credMgr = HostContext.GetService<ICredentialManager>();
var creds = credMgr.LoadCredentials(); // var creds = credMgr.LoadCredentials();
if (string.IsNullOrEmpty(messageRef.RunServiceUrl)) // if (string.IsNullOrEmpty(messageRef.RunServiceUrl))
{ // {
var actionsRunServer = HostContext.CreateService<IActionsRunServer>(); // var actionsRunServer = HostContext.CreateService<IActionsRunServer>();
await actionsRunServer.ConnectAsync(new Uri(settings.ServerUrl), creds); // await actionsRunServer.ConnectAsync(new Uri(settings.ServerUrl), creds);
jobRequestMessage = await actionsRunServer.GetJobMessageAsync(messageRef.RunnerRequestId, messageQueueLoopTokenSource.Token); // jobRequestMessage = await actionsRunServer.GetJobMessageAsync(messageRef.RunnerRequestId, messageQueueLoopTokenSource.Token);
} // }
else // else
{ // {
var runServer = HostContext.CreateService<IRunServer>(); // var runServer = HostContext.CreateService<IRunServer>();
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);
_acquireJobThrottler.Reset(); // _acquireJobThrottler.Reset();
} // }
catch (Exception ex) when ( // catch (Exception ex) when (
ex is TaskOrchestrationJobNotFoundException || // HTTP status 404 // ex is TaskOrchestrationJobNotFoundException || // HTTP status 404
ex is TaskOrchestrationJobAlreadyAcquiredException || // HTTP status 409 // ex is TaskOrchestrationJobAlreadyAcquiredException || // HTTP status 409
ex is TaskOrchestrationJobUnprocessableException) // HTTP status 422 // ex is TaskOrchestrationJobUnprocessableException) // HTTP status 422
{ // {
Trace.Info($"Skipping message Job. {ex.Message}"); // Trace.Info($"Skipping message Job. {ex.Message}");
await _acquireJobThrottler.IncrementAndWaitAsync(messageQueueLoopTokenSource.Token); // await _acquireJobThrottler.IncrementAndWaitAsync(messageQueueLoopTokenSource.Token);
continue; // continue;
} // }
catch (Exception ex) // catch (Exception ex)
{ // {
Trace.Error($"Caught exception from acquiring job message: {ex}"); // Trace.Error($"Caught exception from acquiring job message: {ex}");
continue; // continue;
} // }
} // }
jobDispatcher.Run(jobRequestMessage, runOnce); // jobDispatcher.Run(jobRequestMessage, runOnce);
if (runOnce) // if (runOnce)
{ // {
Trace.Info("One time used runner received job message."); // Trace.Info("One time used runner received job message.");
runOnceJobReceived = true; // runOnceJobReceived = true;
} // }
} // }
} // }
else if (string.Equals(message.MessageType, JobCancelMessage.MessageType, StringComparison.OrdinalIgnoreCase)) // else if (string.Equals(message.MessageType, JobCancelMessage.MessageType, StringComparison.OrdinalIgnoreCase))
{ // {
var cancelJobMessage = JsonUtility.FromString<JobCancelMessage>(message.Body); // var cancelJobMessage = JsonUtility.FromString<JobCancelMessage>(message.Body);
bool jobCancelled = jobDispatcher.Cancel(cancelJobMessage); // bool jobCancelled = jobDispatcher.Cancel(cancelJobMessage);
skipMessageDeletion = (autoUpdateInProgress || runOnceJobReceived) && !jobCancelled; // skipMessageDeletion = (autoUpdateInProgress || runOnceJobReceived) && !jobCancelled;
if (skipMessageDeletion) // if (skipMessageDeletion)
{ // {
Trace.Info($"Skip message deletion for cancellation message '{message.MessageId}'."); // Trace.Info($"Skip message deletion for cancellation message '{message.MessageId}'.");
} // }
} // }
else if (string.Equals(message.MessageType, Pipelines.HostedRunnerShutdownMessage.MessageType, StringComparison.OrdinalIgnoreCase)) // else if (string.Equals(message.MessageType, Pipelines.HostedRunnerShutdownMessage.MessageType, StringComparison.OrdinalIgnoreCase))
{ // {
var HostedRunnerShutdownMessage = JsonUtility.FromString<Pipelines.HostedRunnerShutdownMessage>(message.Body); // var HostedRunnerShutdownMessage = JsonUtility.FromString<Pipelines.HostedRunnerShutdownMessage>(message.Body);
skipMessageDeletion = true; // skipMessageDeletion = true;
skipSessionDeletion = true; // skipSessionDeletion = true;
Trace.Info($"Service requests the hosted runner to shutdown. Reason: '{HostedRunnerShutdownMessage.Reason}'."); // Trace.Info($"Service requests the hosted runner to shutdown. Reason: '{HostedRunnerShutdownMessage.Reason}'.");
return Constants.Runner.ReturnCode.Success; // return Constants.Runner.ReturnCode.Success;
} // }
else if (string.Equals(message.MessageType, TaskAgentMessageTypes.ForceTokenRefresh)) // else if (string.Equals(message.MessageType, TaskAgentMessageTypes.ForceTokenRefresh))
{ // {
Trace.Info("Received ForceTokenRefreshMessage"); // Trace.Info("Received ForceTokenRefreshMessage");
await _listener.RefreshListenerTokenAsync(messageQueueLoopTokenSource.Token); // await _listener.RefreshListenerTokenAsync(messageQueueLoopTokenSource.Token);
} // }
else // else
{ // {
Trace.Error($"Received message {message.MessageId} with unsupported message type {message.MessageType}."); // Trace.Error($"Received message {message.MessageId} with unsupported message type {message.MessageType}.");
} // }
} }
finally finally
{ {
+13
View File
@@ -132,6 +132,18 @@ namespace GitHub.Runner.Listener
private async Task<bool> UpdateNeeded(string targetVersion, CancellationToken token) private async Task<bool> UpdateNeeded(string targetVersion, CancellationToken token)
{ {
if (StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_IS_MOCK_UPDATE")))
{
_targetPackage = new PackageMetadata()
{
Type = "agent",
Platform = BuildConstants.RunnerPackage.PackageName,
Version = new PackageVersion(targetVersion),
};
}
else
{
// when talk to old version server, always prefer latest package. // when talk to old version server, always prefer latest package.
// old server won't send target version as part of update message. // old server won't send target version as part of update message.
if (string.IsNullOrEmpty(targetVersion)) if (string.IsNullOrEmpty(targetVersion))
@@ -154,6 +166,7 @@ namespace GitHub.Runner.Listener
return false; return false;
} }
} }
}
Trace.Info($"Version '{_targetPackage.Version}' of '{_targetPackage.Type}' package available in server."); Trace.Info($"Version '{_targetPackage.Version}' of '{_targetPackage.Type}' package available in server.");
PackageVersion serverVersion = new(_targetPackage.Version); PackageVersion serverVersion = new(_targetPackage.Version);
+2
View File
@@ -508,6 +508,8 @@ namespace GitHub.Runner.Worker
Status = _record.State, Status = _record.State,
Number = _record.Order, Number = _record.Order,
Name = _record.Name, Name = _record.Name,
Ref = StepTelemetry?.Ref,
Type = StepTelemetry?.Type,
StartedAt = _record.StartTime, StartedAt = _record.StartTime,
CompletedAt = _record.FinishTime, CompletedAt = _record.FinishTime,
Annotations = new List<Annotation>() Annotations = new List<Annotation>()
@@ -72,11 +72,6 @@ namespace GitHub.Runner.Worker.Handlers
Environment["ACTIONS_RESULTS_URL"] = resultsUrl; Environment["ACTIONS_RESULTS_URL"] = resultsUrl;
} }
if (ExecutionContext.Global.Variables.GetBoolean("actions_uses_cache_service_v2") ?? false)
{
Environment["ACTIONS_CACHE_SERVICE_V2"] = bool.TrueString;
}
// Resolve the target script. // Resolve the target script.
string target = null; string target = null;
if (stage == ActionRunStage.Main) if (stage == ActionRunStage.Main)
+6
View File
@@ -19,6 +19,12 @@ namespace GitHub.Actions.RunService.WebApi
[DataMember(Name = "name", EmitDefaultValue = false)] [DataMember(Name = "name", EmitDefaultValue = false)]
public string Name { get; set; } public string Name { get; set; }
[DataMember(Name = "ref", EmitDefaultValue = false)]
public string Ref { get; set; }
[DataMember(Name = "type", EmitDefaultValue = false)]
public string Type { get; set; }
[DataMember(Name = "status")] [DataMember(Name = "status")]
public TimelineRecordState? Status { get; set; } public TimelineRecordState? Status { get; set; }
+1 -1
View File
@@ -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.425"
DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION" DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION"
DOTNET8SDK_VERSION="8.0.303" DOTNET8SDK_VERSION="8.0.303"
DOTNET8SDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNET8SDK_VERSION" DOTNET8SDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNET8SDK_VERSION"
+1 -1
View File
@@ -1,5 +1,5 @@
{ {
"sdk": { "sdk": {
"version": "6.0.421" "version": "6.0.425"
} }
} }
+1 -1
View File
@@ -1 +1 @@
2.320.1 2.319.0