mirror of
https://github.com/actions/runner.git
synced 2025-12-12 15:13:30 +00:00
Compare commits
1 Commits
feature/do
...
users/tihu
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec9bdfc1b9 |
@@ -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.427"
|
"version": "6.0.421"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version": "16"
|
"version": "16"
|
||||||
|
|||||||
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
@@ -75,7 +75,7 @@ jobs:
|
|||||||
# Upload runner package tar.gz/zip as artifact
|
# Upload runner package tar.gz/zip as artifact
|
||||||
- name: Publish Artifact
|
- name: Publish Artifact
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: runner-package-${{ matrix.runtime }}
|
name: runner-package-${{ matrix.runtime }}
|
||||||
path: |
|
path: |
|
||||||
|
|||||||
41
.github/workflows/release.yml
vendored
41
.github/workflows/release.yml
vendored
@@ -117,11 +117,12 @@ jobs:
|
|||||||
working-directory: _package
|
working-directory: _package
|
||||||
|
|
||||||
# Upload runner package tar.gz/zip as artifact.
|
# Upload runner package tar.gz/zip as artifact.
|
||||||
|
# Since each package name is unique, so we don't need to put ${{matrix}} info into artifact name
|
||||||
- name: Publish Artifact
|
- name: Publish Artifact
|
||||||
if: github.event_name != 'pull_request'
|
if: github.event_name != 'pull_request'
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
name: runner-packages-${{ matrix.runtime }}
|
name: runner-packages
|
||||||
path: |
|
path: |
|
||||||
_package
|
_package
|
||||||
|
|
||||||
@@ -133,40 +134,10 @@ jobs:
|
|||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
|
||||||
# Download runner package tar.gz/zip produced by 'build' job
|
# Download runner package tar.gz/zip produced by 'build' job
|
||||||
- name: Download Artifact (win-x64)
|
- name: Download Artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v1
|
||||||
with:
|
with:
|
||||||
name: runner-packages-win-x64
|
name: runner-packages
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (win-arm64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-win-arm64
|
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (osx-x64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-osx-x64
|
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (osx-arm64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-osx-arm64
|
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (linux-x64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-linux-x64
|
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (linux-arm)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-linux-arm
|
|
||||||
path: ./
|
|
||||||
- name: Download Artifact (linux-arm64)
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: runner-packages-linux-arm64
|
|
||||||
path: ./
|
path: ./
|
||||||
|
|
||||||
# Create ReleaseNote file
|
# Create ReleaseNote file
|
||||||
|
|||||||
@@ -1,17 +1,10 @@
|
|||||||
## What's Changed
|
## What's Changed
|
||||||
|
|
||||||
- Adding Snapshot additional mapping tokens https://github.com/actions/runner/pull/3468
|
- .NET 8 OS compatibility test https://github.com/actions/runner/pull/3422
|
||||||
- Create launch httpclient using the right handler and setting https://github.com/actions/runner/pull/3476
|
- Ignore ssl cert on websocket client https://github.com/actions/runner/pull/3423
|
||||||
- Fix missing default user-agent for jitconfig runner https://github.com/actions/runner/pull/3473
|
- Revert "Bump runner to dotnet 8" https://github.com/actions/runner/pull/3412
|
||||||
- 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.319.1...v2.320.0
|
**Full Changelog**: https://github.com/actions/runner/compare/v2.318.0...v2.319.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.
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
public bool ShouldRetryException(Exception ex)
|
public bool ShouldRetryException(Exception ex)
|
||||||
{
|
{
|
||||||
if (ex is AccessDeniedException ade)
|
if (ex is AccessDeniedException ade && ade.ErrorCode == 1)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ namespace GitHub.Runner.Common
|
|||||||
event EventHandler Unloading;
|
event EventHandler Unloading;
|
||||||
void ShutdownRunner(ShutdownReason reason);
|
void ShutdownRunner(ShutdownReason reason);
|
||||||
void WritePerfCounter(string counter);
|
void WritePerfCounter(string counter);
|
||||||
void LoadDefaultUserAgents();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum StartupType
|
public enum StartupType
|
||||||
@@ -68,7 +67,6 @@ namespace GitHub.Runner.Common
|
|||||||
private StartupType _startupType;
|
private StartupType _startupType;
|
||||||
private string _perfFile;
|
private string _perfFile;
|
||||||
private RunnerWebProxy _webProxy = new();
|
private RunnerWebProxy _webProxy = new();
|
||||||
private string _hostType = string.Empty;
|
|
||||||
|
|
||||||
public event EventHandler Unloading;
|
public event EventHandler Unloading;
|
||||||
public CancellationToken RunnerShutdownToken => _runnerShutdownTokenSource.Token;
|
public CancellationToken RunnerShutdownToken => _runnerShutdownTokenSource.Token;
|
||||||
@@ -80,7 +78,6 @@ namespace GitHub.Runner.Common
|
|||||||
{
|
{
|
||||||
// Validate args.
|
// Validate args.
|
||||||
ArgUtil.NotNullOrEmpty(hostType, nameof(hostType));
|
ArgUtil.NotNullOrEmpty(hostType, nameof(hostType));
|
||||||
_hostType = hostType;
|
|
||||||
|
|
||||||
_loadContext = AssemblyLoadContext.GetLoadContext(typeof(HostContext).GetTypeInfo().Assembly);
|
_loadContext = AssemblyLoadContext.GetLoadContext(typeof(HostContext).GetTypeInfo().Assembly);
|
||||||
_loadContext.Unloading += LoadContext_Unloading;
|
_loadContext.Unloading += LoadContext_Unloading;
|
||||||
@@ -199,16 +196,6 @@ namespace GitHub.Runner.Common
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_TLS_NO_VERIFY")))
|
|
||||||
{
|
|
||||||
_trace.Warning($"Runner is running under insecure mode: HTTPS server certificate validation has been turned off by GITHUB_ACTIONS_RUNNER_TLS_NO_VERIFY environment variable.");
|
|
||||||
}
|
|
||||||
|
|
||||||
LoadDefaultUserAgents();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadDefaultUserAgents()
|
|
||||||
{
|
|
||||||
if (string.IsNullOrEmpty(WebProxy.HttpProxyAddress) && string.IsNullOrEmpty(WebProxy.HttpsProxyAddress))
|
if (string.IsNullOrEmpty(WebProxy.HttpProxyAddress) && string.IsNullOrEmpty(WebProxy.HttpsProxyAddress))
|
||||||
{
|
{
|
||||||
_trace.Info($"No proxy settings were found based on environmental variables (http_proxy/https_proxy/HTTP_PROXY/HTTPS_PROXY)");
|
_trace.Info($"No proxy settings were found based on environmental variables (http_proxy/https_proxy/HTTP_PROXY/HTTPS_PROXY)");
|
||||||
@@ -218,6 +205,11 @@ namespace GitHub.Runner.Common
|
|||||||
_userAgents.Add(new ProductInfoHeaderValue("HttpProxyConfigured", bool.TrueString));
|
_userAgents.Add(new ProductInfoHeaderValue("HttpProxyConfigured", bool.TrueString));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (StringUtil.ConvertToBoolean(Environment.GetEnvironmentVariable("GITHUB_ACTIONS_RUNNER_TLS_NO_VERIFY")))
|
||||||
|
{
|
||||||
|
_trace.Warning($"Runner is running under insecure mode: HTTPS server certificate validation has been turned off by GITHUB_ACTIONS_RUNNER_TLS_NO_VERIFY environment variable.");
|
||||||
|
}
|
||||||
|
|
||||||
var credFile = GetConfigFile(WellKnownConfigFile.Credentials);
|
var credFile = GetConfigFile(WellKnownConfigFile.Credentials);
|
||||||
if (File.Exists(credFile))
|
if (File.Exists(credFile))
|
||||||
{
|
{
|
||||||
@@ -256,7 +248,6 @@ namespace GitHub.Runner.Common
|
|||||||
var currentProcess = Process.GetCurrentProcess();
|
var currentProcess = Process.GetCurrentProcess();
|
||||||
_userAgents.Add(new ProductInfoHeaderValue("Pid", currentProcess.Id.ToString()));
|
_userAgents.Add(new ProductInfoHeaderValue("Pid", currentProcess.Id.ToString()));
|
||||||
_userAgents.Add(new ProductInfoHeaderValue("CreationTime", Uri.EscapeDataString(DateTime.UtcNow.ToString("O"))));
|
_userAgents.Add(new ProductInfoHeaderValue("CreationTime", Uri.EscapeDataString(DateTime.UtcNow.ToString("O"))));
|
||||||
_userAgents.Add(new ProductInfoHeaderValue($"({_hostType})"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetDirectory(WellKnownDirectory directory)
|
public string GetDirectory(WellKnownDirectory directory)
|
||||||
|
|||||||
@@ -77,6 +77,7 @@ namespace GitHub.Runner.Common
|
|||||||
private int _resultsServiceExceptionsCount = 0;
|
private int _resultsServiceExceptionsCount = 0;
|
||||||
private Stopwatch _resultsUploadTimer = new();
|
private Stopwatch _resultsUploadTimer = new();
|
||||||
private Stopwatch _actionsUploadTimer = new();
|
private Stopwatch _actionsUploadTimer = new();
|
||||||
|
private Stopwatch _jobRecordUpdatedTimer = new();
|
||||||
|
|
||||||
public TaskCompletionSource<int> JobRecordUpdated => _jobRecordUpdated;
|
public TaskCompletionSource<int> JobRecordUpdated => _jobRecordUpdated;
|
||||||
|
|
||||||
@@ -96,6 +97,8 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
private bool _resultsClientInitiated = false;
|
private bool _resultsClientInitiated = false;
|
||||||
private bool _enableTelemetry = false;
|
private bool _enableTelemetry = false;
|
||||||
|
private bool _enableJobRecordUpdatedTelemetry = false;
|
||||||
|
private bool _enableAutoRetry = false;
|
||||||
private delegate Task ResultsFileUploadHandler(ResultsUploadFileInfo file);
|
private delegate Task ResultsFileUploadHandler(ResultsUploadFileInfo file);
|
||||||
|
|
||||||
public override void Initialize(IHostContext hostContext)
|
public override void Initialize(IHostContext hostContext)
|
||||||
@@ -180,6 +183,23 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
_allDequeueTasks = new Task[] { _webConsoleLineDequeueTask, _fileUploadDequeueTask, _timelineUpdateDequeueTask, _resultsUploadDequeueTask };
|
_allDequeueTasks = new Task[] { _webConsoleLineDequeueTask, _fileUploadDequeueTask, _timelineUpdateDequeueTask, _resultsUploadDequeueTask };
|
||||||
_queueInProcess = true;
|
_queueInProcess = true;
|
||||||
|
|
||||||
|
|
||||||
|
if (jobRequest.Variables.TryGetValue("DistributedTask.EnableJobRecordUpdatedTelemetry", out VariableValue enableTelemetry))
|
||||||
|
{
|
||||||
|
_enableJobRecordUpdatedTelemetry = StringUtil.ConvertToBoolean(enableTelemetry?.Value);
|
||||||
|
if (_enableJobRecordUpdatedTelemetry)
|
||||||
|
{
|
||||||
|
Trace.Info("Enable telemetry for first job record update.");
|
||||||
|
_jobRecordUpdatedTimer.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jobRequest.Variables.TryGetValue("DistributedTask.EnableRecordUpdateAutoRetry", out VariableValue enableAutoRetry))
|
||||||
|
{
|
||||||
|
Trace.Info("Enable auto retry for timeline record update.");
|
||||||
|
_enableAutoRetry = StringUtil.ConvertToBoolean(enableAutoRetry?.Value);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// WebConsoleLine queue and FileUpload queue are always best effort
|
// WebConsoleLine queue and FileUpload queue are always best effort
|
||||||
@@ -232,6 +252,11 @@ namespace GitHub.Runner.Common
|
|||||||
Trace.Info(uploadTimeComparison);
|
Trace.Info(uploadTimeComparison);
|
||||||
_jobTelemetries.Add(new JobTelemetry() { Type = JobTelemetryType.General, Message = uploadTimeComparison });
|
_jobTelemetries.Add(new JobTelemetry() { Type = JobTelemetryType.General, Message = uploadTimeComparison });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_enableJobRecordUpdatedTelemetry)
|
||||||
|
{
|
||||||
|
_jobTelemetries.Add(new JobTelemetry() { Type = JobTelemetryType.General, Message = $"First job record updated time after: {_jobRecordUpdatedTimer.ElapsedMilliseconds} ms" });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void QueueWebConsoleLine(Guid stepRecordId, string line, long? lineNumber)
|
public void QueueWebConsoleLine(Guid stepRecordId, string line, long? lineNumber)
|
||||||
@@ -729,6 +754,11 @@ namespace GitHub.Runner.Common
|
|||||||
// We have changed the state of the job
|
// We have changed the state of the job
|
||||||
Trace.Info("Job timeline record has been updated for the first time.");
|
Trace.Info("Job timeline record has been updated for the first time.");
|
||||||
_jobRecordUpdated.TrySetResult(0);
|
_jobRecordUpdated.TrySetResult(0);
|
||||||
|
|
||||||
|
if (_enableJobRecordUpdatedTelemetry)
|
||||||
|
{
|
||||||
|
_jobRecordUpdatedTimer.Stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -740,6 +770,15 @@ namespace GitHub.Runner.Common
|
|||||||
{
|
{
|
||||||
mainTimelineRecordsUpdateErrors.Add(ex);
|
mainTimelineRecordsUpdateErrors.Add(ex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!runOnce && _enableAutoRetry)
|
||||||
|
{
|
||||||
|
foreach (var retryRecordId in update.PendingRecords.DistinctBy(x => x.Id).Select(r => r.Id))
|
||||||
|
{
|
||||||
|
Trace.Verbose("Enqueue timeline record {0} update for retry.", retryRecordId);
|
||||||
|
_timelineUpdateQueue[update.TimelineId].Enqueue(new TimelineRecord() { Id = retryRecordId });
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,11 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using GitHub.DistributedTask.WebApi;
|
using GitHub.DistributedTask.WebApi;
|
||||||
using GitHub.Runner.Sdk;
|
|
||||||
using GitHub.Services.Common;
|
|
||||||
using GitHub.Services.Launch.Client;
|
using GitHub.Services.Launch.Client;
|
||||||
|
using GitHub.Services.WebApi;
|
||||||
|
|
||||||
namespace GitHub.Runner.Common
|
namespace GitHub.Runner.Common
|
||||||
{
|
{
|
||||||
@@ -24,21 +23,8 @@ namespace GitHub.Runner.Common
|
|||||||
|
|
||||||
public void InitializeLaunchClient(Uri uri, string token)
|
public void InitializeLaunchClient(Uri uri, string token)
|
||||||
{
|
{
|
||||||
// Using default 100 timeout
|
var httpMessageHandler = HostContext.CreateHttpClientHandler();
|
||||||
RawClientHttpRequestSettings settings = VssUtil.GetHttpRequestSettings(null);
|
this._launchClient = new LaunchHttpClient(uri, httpMessageHandler, token, disposeHandler: true);
|
||||||
|
|
||||||
// Create retry handler
|
|
||||||
IEnumerable<DelegatingHandler> delegatingHandlers = new List<DelegatingHandler>();
|
|
||||||
if (settings.MaxRetryRequest > 0)
|
|
||||||
{
|
|
||||||
delegatingHandlers = new DelegatingHandler[] { new VssHttpRetryMessageHandler(settings.MaxRetryRequest) };
|
|
||||||
}
|
|
||||||
|
|
||||||
// Setup RawHttpMessageHandler without credentials
|
|
||||||
var httpMessageHandler = new RawHttpMessageHandler(new NoOpCredentials(null), settings);
|
|
||||||
var pipeline = HttpClientFactory.CreatePipeline(httpMessageHandler, delegatingHandlers);
|
|
||||||
|
|
||||||
this._launchClient = new LaunchHttpClient(uri, pipeline, token, disposeHandler: true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<ActionDownloadInfoCollection> ResolveActionsDownloadInfoAsync(Guid planId, Guid jobId, ActionReferenceList actionReferenceList,
|
public Task<ActionDownloadInfoCollection> ResolveActionsDownloadInfoAsync(Guid planId, Guid jobId, ActionReferenceList actionReferenceList,
|
||||||
|
|||||||
@@ -264,6 +264,8 @@ 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);
|
||||||
|
|||||||
@@ -237,10 +237,6 @@ namespace GitHub.Runner.Listener
|
|||||||
File.SetAttributes(configFile, File.GetAttributes(configFile) | FileAttributes.Hidden);
|
File.SetAttributes(configFile, File.GetAttributes(configFile) | FileAttributes.Hidden);
|
||||||
Trace.Info($"Saved {configContent.Length} bytes to '{configFile}'.");
|
Trace.Info($"Saved {configContent.Length} bytes to '{configFile}'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure we have the right user agent data added from the jitconfig
|
|
||||||
HostContext.LoadDefaultUserAgents();
|
|
||||||
VssUtil.InitializeVssClientSettings(HostContext.UserAgents, HostContext.WebProxy);
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -508,8 +508,6 @@ 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>()
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ namespace GitHub.Runner.Worker.Handlers
|
|||||||
ExecutionContext.StepTelemetry.HasPreStep = Data.HasPre;
|
ExecutionContext.StepTelemetry.HasPreStep = Data.HasPre;
|
||||||
ExecutionContext.StepTelemetry.HasPostStep = Data.HasPost;
|
ExecutionContext.StepTelemetry.HasPostStep = Data.HasPost;
|
||||||
}
|
}
|
||||||
|
ExecutionContext.StepTelemetry.Type = Data.NodeVersion;
|
||||||
|
|
||||||
ArgUtil.NotNullOrEmpty(target, nameof(target));
|
ArgUtil.NotNullOrEmpty(target, nameof(target));
|
||||||
target = Path.Combine(ActionDirectory, target);
|
target = Path.Combine(ActionDirectory, target);
|
||||||
@@ -123,7 +124,6 @@ namespace GitHub.Runner.Worker.Handlers
|
|||||||
Data.NodeVersion = "node20";
|
Data.NodeVersion = "node20";
|
||||||
}
|
}
|
||||||
var nodeRuntimeVersion = await StepHost.DetermineNodeRuntimeVersion(ExecutionContext, Data.NodeVersion);
|
var nodeRuntimeVersion = await StepHost.DetermineNodeRuntimeVersion(ExecutionContext, Data.NodeVersion);
|
||||||
ExecutionContext.StepTelemetry.Type = nodeRuntimeVersion;
|
|
||||||
string file = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Externals), nodeRuntimeVersion, "bin", $"node{IOUtil.ExeExtension}");
|
string file = Path.Combine(HostContext.GetDirectory(WellKnownDirectory.Externals), nodeRuntimeVersion, "bin", $"node{IOUtil.ExeExtension}");
|
||||||
|
|
||||||
// Format the arguments passed to node.
|
// Format the arguments passed to node.
|
||||||
|
|||||||
@@ -403,7 +403,7 @@ namespace GitHub.Runner.Worker
|
|||||||
var snapshotOperationProvider = HostContext.GetService<ISnapshotOperationProvider>();
|
var snapshotOperationProvider = HostContext.GetService<ISnapshotOperationProvider>();
|
||||||
jobContext.RegisterPostJobStep(new JobExtensionRunner(
|
jobContext.RegisterPostJobStep(new JobExtensionRunner(
|
||||||
runAsync: (executionContext, _) => snapshotOperationProvider.CreateSnapshotRequestAsync(executionContext, snapshotRequest),
|
runAsync: (executionContext, _) => snapshotOperationProvider.CreateSnapshotRequestAsync(executionContext, snapshotRequest),
|
||||||
condition: snapshotRequest.Condition,
|
condition: $"{PipelineTemplateConstants.Success}()",
|
||||||
displayName: $"Create custom image",
|
displayName: $"Create custom image",
|
||||||
data: null));
|
data: null));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -210,8 +210,14 @@ namespace GitHub.Runner.Worker
|
|||||||
// Server won't issue ID_TOKEN for non-inprogress job.
|
// Server won't issue ID_TOKEN for non-inprogress job.
|
||||||
// If the job is trying to use OIDC feature, we want the job to be marked as in-progress before running any customer's steps as much as we can.
|
// If the job is trying to use OIDC feature, we want the job to be marked as in-progress before running any customer's steps as much as we can.
|
||||||
// Timeline record update background process runs every 500ms, so delay 1000ms is enough for most of the cases
|
// Timeline record update background process runs every 500ms, so delay 1000ms is enough for most of the cases
|
||||||
Trace.Info($"Waiting for job to be marked as started.");
|
var maxWaitTimeInSeconds = jobContext.Global.Variables.GetInt("DistributedTask.FirstJobRecordUpdateWaitTimeInSeconds");
|
||||||
await Task.WhenAny(_jobServerQueue.JobRecordUpdated.Task, Task.Delay(1000));
|
if (maxWaitTimeInSeconds == null)
|
||||||
|
{
|
||||||
|
maxWaitTimeInSeconds = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Trace.Info($"Waiting {maxWaitTimeInSeconds.Value} seconds for job to be marked as started.");
|
||||||
|
await Task.WhenAny(_jobServerQueue.JobRecordUpdated.Task, Task.Delay(maxWaitTimeInSeconds.Value * 1000));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Run all job steps
|
// Run all job steps
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ namespace GitHub.DistributedTask.Pipelines.ObjectTemplating
|
|||||||
public const String If = "if";
|
public const String If = "if";
|
||||||
public const String Image = "image";
|
public const String Image = "image";
|
||||||
public const String ImageName = "image-name";
|
public const String ImageName = "image-name";
|
||||||
public const String CustomImageVersion = "version";
|
|
||||||
public const String Include = "include";
|
public const String Include = "include";
|
||||||
public const String Inputs = "inputs";
|
public const String Inputs = "inputs";
|
||||||
public const String Job = "job";
|
public const String Job = "job";
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using GitHub.DistributedTask.Expressions2;
|
using GitHub.DistributedTask.Expressions2;
|
||||||
using GitHub.DistributedTask.Expressions2.Sdk;
|
using GitHub.DistributedTask.Expressions2.Sdk;
|
||||||
@@ -350,10 +349,6 @@ namespace GitHub.DistributedTask.Pipelines.ObjectTemplating
|
|||||||
internal static Snapshot ConvertToJobSnapshotRequest(TemplateContext context, TemplateToken token)
|
internal static Snapshot ConvertToJobSnapshotRequest(TemplateContext context, TemplateToken token)
|
||||||
{
|
{
|
||||||
string imageName = null;
|
string imageName = null;
|
||||||
string version = "1.*";
|
|
||||||
string versionString = string.Empty;
|
|
||||||
var condition = $"{PipelineTemplateConstants.Success}()";
|
|
||||||
|
|
||||||
if (token is StringToken snapshotStringLiteral)
|
if (token is StringToken snapshotStringLiteral)
|
||||||
{
|
{
|
||||||
imageName = snapshotStringLiteral.Value;
|
imageName = snapshotStringLiteral.Value;
|
||||||
@@ -364,19 +359,11 @@ namespace GitHub.DistributedTask.Pipelines.ObjectTemplating
|
|||||||
foreach (var snapshotPropertyPair in snapshotMapping)
|
foreach (var snapshotPropertyPair in snapshotMapping)
|
||||||
{
|
{
|
||||||
var propertyName = snapshotPropertyPair.Key.AssertString($"{PipelineTemplateConstants.Snapshot} key");
|
var propertyName = snapshotPropertyPair.Key.AssertString($"{PipelineTemplateConstants.Snapshot} key");
|
||||||
var propertyValue = snapshotPropertyPair.Value;
|
|
||||||
switch (propertyName.Value)
|
switch (propertyName.Value)
|
||||||
{
|
{
|
||||||
case PipelineTemplateConstants.ImageName:
|
case PipelineTemplateConstants.ImageName:
|
||||||
imageName = snapshotPropertyPair.Value.AssertString($"{PipelineTemplateConstants.Snapshot} {propertyName}").Value;
|
imageName = snapshotPropertyPair.Value.AssertString($"{PipelineTemplateConstants.Snapshot} {propertyName}").Value;
|
||||||
break;
|
break;
|
||||||
case PipelineTemplateConstants.If:
|
|
||||||
condition = ConvertToIfCondition(context, propertyValue, false);
|
|
||||||
break;
|
|
||||||
case PipelineTemplateConstants.CustomImageVersion:
|
|
||||||
versionString = propertyValue.AssertString($"job {PipelineTemplateConstants.Snapshot} {PipelineTemplateConstants.CustomImageVersion}").Value;
|
|
||||||
version = IsSnapshotImageVersionValid(versionString) ? versionString : null;
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
propertyName.AssertUnexpectedValue($"{PipelineTemplateConstants.Snapshot} key");
|
propertyName.AssertUnexpectedValue($"{PipelineTemplateConstants.Snapshot} key");
|
||||||
break;
|
break;
|
||||||
@@ -389,26 +376,7 @@ namespace GitHub.DistributedTask.Pipelines.ObjectTemplating
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new Snapshot(imageName)
|
return new Snapshot(imageName);
|
||||||
{
|
|
||||||
Condition = condition,
|
|
||||||
Version = version
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static bool IsSnapshotImageVersionValid(string versionString)
|
|
||||||
{
|
|
||||||
var versionSegments = versionString.Split(".");
|
|
||||||
|
|
||||||
if (versionSegments.Length != 2 ||
|
|
||||||
!versionSegments[1].Equals("*") ||
|
|
||||||
!Int32.TryParse(versionSegments[0], NumberStyles.None, CultureInfo.InvariantCulture, result: out int parsedMajor) ||
|
|
||||||
parsedMajor < 0)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ActionStep ConvertToStep(
|
private static ActionStep ConvertToStep(
|
||||||
|
|||||||
@@ -1,27 +1,17 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using GitHub.DistributedTask.ObjectTemplating.Tokens;
|
|
||||||
using GitHub.DistributedTask.Pipelines.ObjectTemplating;
|
|
||||||
|
|
||||||
namespace GitHub.DistributedTask.Pipelines
|
namespace GitHub.DistributedTask.Pipelines
|
||||||
{
|
{
|
||||||
[DataContract]
|
[DataContract]
|
||||||
public class Snapshot
|
public class Snapshot
|
||||||
{
|
{
|
||||||
public Snapshot(string imageName, string condition = null, string version = null)
|
public Snapshot(string imageName)
|
||||||
{
|
{
|
||||||
ImageName = imageName;
|
ImageName = imageName;
|
||||||
Condition = condition ?? $"{PipelineTemplateConstants.Success}()";
|
|
||||||
Version = version ?? "1.*";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
[DataMember(EmitDefaultValue = false)]
|
[DataMember(EmitDefaultValue = false)]
|
||||||
public String ImageName { get; set; }
|
public String ImageName { get; set; }
|
||||||
|
|
||||||
[DataMember(EmitDefaultValue = false)]
|
|
||||||
public String Condition { get; set; }
|
|
||||||
|
|
||||||
[DataMember(EmitDefaultValue = false)]
|
|
||||||
public String Version { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -169,28 +169,11 @@
|
|||||||
"image-name": {
|
"image-name": {
|
||||||
"type": "non-empty-string",
|
"type": "non-empty-string",
|
||||||
"required": true
|
"required": true
|
||||||
},
|
|
||||||
"if": "snapshot-if",
|
|
||||||
"version": {
|
|
||||||
"type": "non-empty-string",
|
|
||||||
"required": false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
"snapshot-if": {
|
|
||||||
"context": [
|
|
||||||
"github",
|
|
||||||
"inputs",
|
|
||||||
"vars",
|
|
||||||
"needs",
|
|
||||||
"strategy",
|
|
||||||
"matrix"
|
|
||||||
],
|
|
||||||
"string": {}
|
|
||||||
},
|
|
||||||
|
|
||||||
"runs-on": {
|
"runs-on": {
|
||||||
"context": [
|
"context": [
|
||||||
"github",
|
"github",
|
||||||
|
|||||||
@@ -1,20 +0,0 @@
|
|||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace GitHub.Actions.RunService.WebApi
|
|
||||||
{
|
|
||||||
[DataContract]
|
|
||||||
public class BrokerError
|
|
||||||
{
|
|
||||||
[DataMember(Name = "source", EmitDefaultValue = false)]
|
|
||||||
public string Source { get; set; }
|
|
||||||
|
|
||||||
[DataMember(Name = "errorKind", EmitDefaultValue = false)]
|
|
||||||
public string ErrorKind { get; set; }
|
|
||||||
|
|
||||||
[DataMember(Name = "statusCode", EmitDefaultValue = false)]
|
|
||||||
public int StatusCode { get; set; }
|
|
||||||
|
|
||||||
[DataMember(Name = "errorMessage", EmitDefaultValue = false)]
|
|
||||||
public string Message { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
using System.Runtime.Serialization;
|
|
||||||
|
|
||||||
namespace GitHub.Actions.RunService.WebApi
|
|
||||||
{
|
|
||||||
[DataContract]
|
|
||||||
public class BrokerErrorKind
|
|
||||||
{
|
|
||||||
public const string RunnerVersionTooOld = "RunnerVersionTooOld";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -19,12 +19,6 @@ 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; }
|
||||||
|
|
||||||
|
|||||||
@@ -107,6 +107,15 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Temporary back compat
|
||||||
|
switch (result.StatusCode)
|
||||||
|
{
|
||||||
|
case HttpStatusCode.NotFound:
|
||||||
|
throw new TaskOrchestrationJobNotFoundException($"Job message not found: {messageId}");
|
||||||
|
case HttpStatusCode.Conflict:
|
||||||
|
throw new TaskOrchestrationJobAlreadyAcquiredException($"Job message already acquired: {messageId}");
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.ErrorBody))
|
if (!string.IsNullOrEmpty(result.ErrorBody))
|
||||||
{
|
{
|
||||||
throw new Exception($"Failed to get job message: {result.Error}. {Truncate(result.ErrorBody)}");
|
throw new Exception($"Failed to get job message: {result.Error}. {Truncate(result.ErrorBody)}");
|
||||||
@@ -162,6 +171,13 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Temporary back compat
|
||||||
|
switch (result.StatusCode)
|
||||||
|
{
|
||||||
|
case HttpStatusCode.NotFound:
|
||||||
|
throw new TaskOrchestrationJobNotFoundException($"Job not found: {jobId}");
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.ErrorBody))
|
if (!string.IsNullOrEmpty(result.ErrorBody))
|
||||||
{
|
{
|
||||||
throw new Exception($"Failed to complete job: {result.Error}. {Truncate(result.ErrorBody)}");
|
throw new Exception($"Failed to complete job: {result.Error}. {Truncate(result.ErrorBody)}");
|
||||||
@@ -209,6 +225,13 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Temporary back compat
|
||||||
|
switch (result.StatusCode)
|
||||||
|
{
|
||||||
|
case HttpStatusCode.NotFound:
|
||||||
|
throw new TaskOrchestrationJobNotFoundException($"Job not found: {jobId}");
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.ErrorBody))
|
if (!string.IsNullOrEmpty(result.ErrorBody))
|
||||||
{
|
{
|
||||||
throw new Exception($"Failed to renew job: {result.Error}. {Truncate(result.ErrorBody)}");
|
throw new Exception($"Failed to renew job: {result.Error}. {Truncate(result.ErrorBody)}");
|
||||||
|
|||||||
@@ -103,7 +103,6 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
new HttpMethod("GET"),
|
new HttpMethod("GET"),
|
||||||
requestUri: requestUri,
|
requestUri: requestUri,
|
||||||
queryParameters: queryParams,
|
queryParameters: queryParams,
|
||||||
readErrorBody: true,
|
|
||||||
cancellationToken: cancellationToken);
|
cancellationToken: cancellationToken);
|
||||||
|
|
||||||
if (result.IsSuccess)
|
if (result.IsSuccess)
|
||||||
@@ -111,21 +110,8 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
return result.Value;
|
return result.Value;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TryParseErrorBody(result.ErrorBody, out BrokerError brokerError))
|
// the only time we throw a `Forbidden` exception from Listener /messages is when the runner is
|
||||||
{
|
// disable_update and is too old to poll
|
||||||
switch (brokerError.ErrorKind)
|
|
||||||
{
|
|
||||||
case BrokerErrorKind.RunnerVersionTooOld:
|
|
||||||
throw new AccessDeniedException(brokerError.Message)
|
|
||||||
{
|
|
||||||
ErrorCode = 1
|
|
||||||
};
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// temporary back compat
|
|
||||||
if (result.StatusCode == HttpStatusCode.Forbidden)
|
if (result.StatusCode == HttpStatusCode.Forbidden)
|
||||||
{
|
{
|
||||||
throw new AccessDeniedException($"{result.Error} Runner version v{runnerVersion} is deprecated and cannot receive messages.")
|
throw new AccessDeniedException($"{result.Error} Runner version v{runnerVersion} is deprecated and cannot receive messages.")
|
||||||
@@ -134,7 +120,7 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Exception($"Failed to get job message. Request to {requestUri} failed with status: {result.StatusCode}. Error message {result.Error}");
|
throw new Exception($"Failed to get job message: {result.Error}");
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<TaskAgentSession> CreateSessionAsync(
|
public async Task<TaskAgentSession> CreateSessionAsync(
|
||||||
@@ -186,26 +172,5 @@ namespace GitHub.Actions.RunService.WebApi
|
|||||||
|
|
||||||
throw new Exception($"Failed to delete broker session: {result.Error}");
|
throw new Exception($"Failed to delete broker session: {result.Error}");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool TryParseErrorBody(string errorBody, out BrokerError error)
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(errorBody))
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
error = JsonUtility.FromString<BrokerError>(errorBody);
|
|
||||||
if (error?.Source == "actions-broker-listener")
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error = null;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,11 +370,6 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
Unloading(this, null);
|
Unloading(this, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void LoadDefaultUserAgents()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DelayEventArgs : EventArgs
|
public class DelayEventArgs : EventArgs
|
||||||
|
|||||||
@@ -506,27 +506,7 @@ namespace GitHub.Runner.Common.Tests.Worker
|
|||||||
return EnsureSnapshotPostJobStepForToken(mappingToken, snapshot);
|
return EnsureSnapshotPostJobStepForToken(mappingToken, snapshot);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
private async Task EnsureSnapshotPostJobStepForToken(TemplateToken snapshotToken, Pipelines.Snapshot expectedSnapshot)
|
||||||
[Trait("Level", "L0")]
|
|
||||||
[Trait("Category", "Worker")]
|
|
||||||
public Task EnsureSnapshotPostJobStepForMappingToken_WithIf_Is_False()
|
|
||||||
{
|
|
||||||
var snapshot = new Pipelines.Snapshot("TestImageNameFromMappingToken", condition: $"{PipelineTemplateConstants.Success}() && 1==0", version: "2.*");
|
|
||||||
var imageNameValueStringToken = new StringToken(null, null, null, snapshot.ImageName);
|
|
||||||
var condition = new StringToken(null, null, null, snapshot.Condition);
|
|
||||||
var version = new StringToken(null, null, null, snapshot.Version);
|
|
||||||
|
|
||||||
var mappingToken = new MappingToken(null, null, null)
|
|
||||||
{
|
|
||||||
{ new StringToken(null,null,null, PipelineTemplateConstants.ImageName), imageNameValueStringToken },
|
|
||||||
{ new StringToken(null,null,null, PipelineTemplateConstants.If), condition },
|
|
||||||
{ new StringToken(null,null,null, PipelineTemplateConstants.CustomImageVersion), version }
|
|
||||||
};
|
|
||||||
|
|
||||||
return EnsureSnapshotPostJobStepForToken(mappingToken, snapshot, skipSnapshotStep: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task EnsureSnapshotPostJobStepForToken(TemplateToken snapshotToken, Pipelines.Snapshot expectedSnapshot, bool skipSnapshotStep = false)
|
|
||||||
{
|
{
|
||||||
using (TestHostContext hc = CreateTestContext())
|
using (TestHostContext hc = CreateTestContext())
|
||||||
{
|
{
|
||||||
@@ -544,28 +524,14 @@ namespace GitHub.Runner.Common.Tests.Worker
|
|||||||
|
|
||||||
Assert.Equal(1, postJobSteps.Count);
|
Assert.Equal(1, postJobSteps.Count);
|
||||||
var snapshotStep = postJobSteps.First();
|
var snapshotStep = postJobSteps.First();
|
||||||
_jobEc.JobSteps.Enqueue(snapshotStep);
|
|
||||||
|
|
||||||
var _stepsRunner = new StepsRunner();
|
|
||||||
_stepsRunner.Initialize(hc);
|
|
||||||
await _stepsRunner.RunAsync(_jobEc);
|
|
||||||
|
|
||||||
Assert.Equal("Create custom image", snapshotStep.DisplayName);
|
Assert.Equal("Create custom image", snapshotStep.DisplayName);
|
||||||
Assert.Equal(expectedSnapshot.Condition ?? $"{PipelineTemplateConstants.Success}()", snapshotStep.Condition);
|
Assert.Equal($"{PipelineTemplateConstants.Success}()", snapshotStep.Condition);
|
||||||
|
|
||||||
// Run the mock snapshot step, so we can verify it was executed with the expected snapshot object.
|
// Run the mock snapshot step, so we can verify it was executed with the expected snapshot object.
|
||||||
// await snapshotStep.RunAsync();
|
await snapshotStep.RunAsync();
|
||||||
if (skipSnapshotStep)
|
|
||||||
{
|
|
||||||
Assert.Null(_requestedSnapshot);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Assert.NotNull(_requestedSnapshot);
|
Assert.NotNull(_requestedSnapshot);
|
||||||
Assert.Equal(expectedSnapshot.ImageName, _requestedSnapshot.ImageName);
|
Assert.Equal(expectedSnapshot.ImageName, _requestedSnapshot.ImageName);
|
||||||
Assert.Equal(expectedSnapshot.Condition ?? $"{PipelineTemplateConstants.Success}()", _requestedSnapshot.Condition);
|
|
||||||
Assert.Equal(expectedSnapshot.Version ?? "1.*", _requestedSnapshot.Version);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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.427"
|
DOTNETSDK_VERSION="6.0.421"
|
||||||
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,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"sdk": {
|
"sdk": {
|
||||||
"version": "6.0.427"
|
"version": "6.0.421"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
2.320.0
|
2.319.1
|
||||||
|
|||||||
Reference in New Issue
Block a user