mirror of
https://github.com/actions/runner.git
synced 2025-12-10 12:36:23 +00:00
Runner register labels during configuration (#130)
* Runners will add os and architecture labels during registration * support github.localhost for dev.
This commit is contained in:
committed by
Christopher Johnson
parent
2f261f2c31
commit
f5f14d4811
@@ -1,73 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using GitHub.Runner.Common.Util;
|
|
||||||
using GitHub.Runner.Sdk;
|
|
||||||
|
|
||||||
namespace GitHub.Runner.Common.Capabilities
|
|
||||||
{
|
|
||||||
[ServiceLocator(Default = typeof(CapabilitiesManager))]
|
|
||||||
public interface ICapabilitiesManager : IRunnerService
|
|
||||||
{
|
|
||||||
Task<Dictionary<string, string>> GetCapabilitiesAsync(RunnerSettings settings, CancellationToken token);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class CapabilitiesManager : RunnerService, ICapabilitiesManager
|
|
||||||
{
|
|
||||||
public async Task<Dictionary<string, string>> GetCapabilitiesAsync(RunnerSettings settings, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
Trace.Entering();
|
|
||||||
ArgUtil.NotNull(settings, nameof(settings));
|
|
||||||
|
|
||||||
// Initialize a dictionary of capabilities.
|
|
||||||
var capabilities = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
if (settings.SkipCapabilitiesScan)
|
|
||||||
{
|
|
||||||
Trace.Info("Skip capabilities scan.");
|
|
||||||
return capabilities;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the providers.
|
|
||||||
var extensionManager = HostContext.GetService<IExtensionManager>();
|
|
||||||
IEnumerable<ICapabilitiesProvider> providers =
|
|
||||||
extensionManager
|
|
||||||
.GetExtensions<ICapabilitiesProvider>()
|
|
||||||
?.OrderBy(x => x.Order);
|
|
||||||
|
|
||||||
// Add each capability returned from each provider.
|
|
||||||
foreach (ICapabilitiesProvider provider in providers ?? new ICapabilitiesProvider[0])
|
|
||||||
{
|
|
||||||
foreach (Capability capability in await provider.GetCapabilitiesAsync(settings, cancellationToken) ?? new List<Capability>())
|
|
||||||
{
|
|
||||||
// Make sure we mask secrets in capabilities values.
|
|
||||||
capabilities[capability.Name] = HostContext.SecretMasker.MaskSecrets(capability.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return capabilities;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface ICapabilitiesProvider : IExtension
|
|
||||||
{
|
|
||||||
int Order { get; }
|
|
||||||
|
|
||||||
Task<List<Capability>> GetCapabilitiesAsync(RunnerSettings settings, CancellationToken cancellationToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class Capability
|
|
||||||
{
|
|
||||||
public string Name { get; }
|
|
||||||
public string Value { get; }
|
|
||||||
|
|
||||||
public Capability(string name, string value)
|
|
||||||
{
|
|
||||||
ArgUtil.NotNullOrEmpty(name, nameof(name));
|
|
||||||
Name = name;
|
|
||||||
Value = value ?? string.Empty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
using GitHub.Runner.Common.Util;
|
|
||||||
using GitHub.Runner.Sdk;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace GitHub.Runner.Common.Capabilities
|
|
||||||
{
|
|
||||||
public sealed class RunnerCapabilitiesProvider : RunnerService, ICapabilitiesProvider
|
|
||||||
{
|
|
||||||
public Type ExtensionType => typeof(ICapabilitiesProvider);
|
|
||||||
|
|
||||||
public int Order => 99; // Process last to override prior.
|
|
||||||
|
|
||||||
public Task<List<Capability>> GetCapabilitiesAsync(RunnerSettings settings, CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
ArgUtil.NotNull(settings, nameof(settings));
|
|
||||||
var capabilities = new List<Capability>();
|
|
||||||
Add(capabilities, "Runner.Name", settings.AgentName ?? string.Empty);
|
|
||||||
Add(capabilities, "Runner.OS", VarUtil.OS);
|
|
||||||
Add(capabilities, "Runner.OSArchitecture", VarUtil.OSArchitecture);
|
|
||||||
#if OS_WINDOWS
|
|
||||||
Add(capabilities, "Runner.OSVersion", GetOSVersionString());
|
|
||||||
#endif
|
|
||||||
Add(capabilities, "InteractiveSession", (HostContext.StartupType != StartupType.Service).ToString());
|
|
||||||
Add(capabilities, "Runner.Version", BuildConstants.RunnerPackage.Version);
|
|
||||||
Add(capabilities, "Runner.ComputerName", Environment.MachineName ?? string.Empty);
|
|
||||||
Add(capabilities, "Runner.HomeDirectory", HostContext.GetDirectory(WellKnownDirectory.Root));
|
|
||||||
return Task.FromResult(capabilities);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void Add(List<Capability> capabilities, string name, string value)
|
|
||||||
{
|
|
||||||
Trace.Info($"Adding '{name}': '{value}'");
|
|
||||||
capabilities.Add(new Capability(name, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
private object GetHklmValue(string keyName, string valueName)
|
|
||||||
{
|
|
||||||
keyName = $@"HKEY_LOCAL_MACHINE\{keyName}";
|
|
||||||
object value = Registry.GetValue(keyName, valueName, defaultValue: null);
|
|
||||||
if (object.ReferenceEquals(value, null))
|
|
||||||
{
|
|
||||||
Trace.Info($"Key name '{keyName}', value name '{valueName}' is null.");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
Trace.Info($"Key name '{keyName}', value name '{valueName}': '{value}'");
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetOSVersionString()
|
|
||||||
{
|
|
||||||
// Do not use System.Environment.OSVersion.Version to resolve the OS version number.
|
|
||||||
// It leverages the GetVersionEx function which may report an incorrect version
|
|
||||||
// depending on the app's manifest. For details, see:
|
|
||||||
// https://msdn.microsoft.com/library/windows/desktop/ms724451(v=vs.85).aspx
|
|
||||||
|
|
||||||
// Attempt to retrieve the major/minor version from the new registry values added in
|
|
||||||
// in Windows 10.
|
|
||||||
//
|
|
||||||
// The registry value "CurrentVersion" is unreliable in Windows 10. It contains the
|
|
||||||
// value "6.3" instead of "10.0".
|
|
||||||
object major = GetHklmValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMajorVersionNumber");
|
|
||||||
object minor = GetHklmValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentMinorVersionNumber");
|
|
||||||
string majorMinorString;
|
|
||||||
if (major != null && minor != null)
|
|
||||||
{
|
|
||||||
majorMinorString = StringUtil.Format("{0}.{1}", major, minor);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Fallback to the registry value "CurrentVersion".
|
|
||||||
majorMinorString = GetHklmValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentVersion") as string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Opted to use the registry value "CurrentBuildNumber" over "CurrentBuild". Based on brief
|
|
||||||
// internet investigation, the only difference appears to be that on Windows XP "CurrentBuild"
|
|
||||||
// was unreliable and "CurrentBuildNumber" was the correct choice.
|
|
||||||
string build = GetHklmValue(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion", "CurrentBuildNumber") as string;
|
|
||||||
return StringUtil.Format("{0}.{1}", majorMinorString, build);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -39,10 +39,6 @@ namespace GitHub.Runner.Common
|
|||||||
var extensions = new List<IExtension>();
|
var extensions = new List<IExtension>();
|
||||||
switch (typeof(T).FullName)
|
switch (typeof(T).FullName)
|
||||||
{
|
{
|
||||||
// Listener capabilities providers.
|
|
||||||
case "GitHub.Runner.Common.Capabilities.ICapabilitiesProvider":
|
|
||||||
Add<T>(extensions, "GitHub.Runner.Common.Capabilities.RunnerCapabilitiesProvider, Runner.Common");
|
|
||||||
break;
|
|
||||||
// Action command extensions.
|
// Action command extensions.
|
||||||
case "GitHub.Runner.Worker.IActionCommandExtension":
|
case "GitHub.Runner.Worker.IActionCommandExtension":
|
||||||
Add<T>(extensions, "GitHub.Runner.Worker.InternalPluginSetRepoPathCommandExtension, Runner.Worker");
|
Add<T>(extensions, "GitHub.Runner.Worker.InternalPluginSetRepoPathCommandExtension, Runner.Worker");
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace GitHub.Runner.Common
|
|||||||
Task DeleteAgentAsync(int agentPoolId, int agentId);
|
Task DeleteAgentAsync(int agentPoolId, int agentId);
|
||||||
Task<List<TaskAgentPool>> GetAgentPoolsAsync(string agentPoolName = null, TaskAgentPoolType poolType = TaskAgentPoolType.Automation);
|
Task<List<TaskAgentPool>> GetAgentPoolsAsync(string agentPoolName = null, TaskAgentPoolType poolType = TaskAgentPoolType.Automation);
|
||||||
Task<List<TaskAgent>> GetAgentsAsync(int agentPoolId, string agentName = null);
|
Task<List<TaskAgent>> GetAgentsAsync(int agentPoolId, string agentName = null);
|
||||||
Task<TaskAgent> UpdateAgentAsync(int agentPoolId, TaskAgent agent);
|
Task<TaskAgent> ReplaceAgentAsync(int agentPoolId, TaskAgent agent);
|
||||||
|
|
||||||
// messagequeue
|
// messagequeue
|
||||||
Task<TaskAgentSession> CreateAgentSessionAsync(Int32 poolId, TaskAgentSession session, CancellationToken cancellationToken);
|
Task<TaskAgentSession> CreateAgentSessionAsync(Int32 poolId, TaskAgentSession session, CancellationToken cancellationToken);
|
||||||
@@ -257,7 +257,7 @@ namespace GitHub.Runner.Common
|
|||||||
return _genericTaskAgentClient.GetAgentsAsync(agentPoolId, agentName, false);
|
return _genericTaskAgentClient.GetAgentsAsync(agentPoolId, agentName, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<TaskAgent> UpdateAgentAsync(int agentPoolId, TaskAgent agent)
|
public Task<TaskAgent> ReplaceAgentAsync(int agentPoolId, TaskAgent agent)
|
||||||
{
|
{
|
||||||
CheckConnection(RunnerConnectionType.Generic);
|
CheckConnection(RunnerConnectionType.Generic);
|
||||||
return _genericTaskAgentClient.ReplaceAgentAsync(agentPoolId, agent);
|
return _genericTaskAgentClient.ReplaceAgentAsync(agentPoolId, agent);
|
||||||
|
|||||||
@@ -1,24 +1,19 @@
|
|||||||
using GitHub.DistributedTask.WebApi;
|
using GitHub.DistributedTask.WebApi;
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Common.Util;
|
using GitHub.Runner.Common.Util;
|
||||||
using GitHub.Services.Common;
|
using GitHub.Services.Common;
|
||||||
using GitHub.Services.OAuth;
|
using GitHub.Services.OAuth;
|
||||||
using GitHub.Services.WebApi;
|
using GitHub.Services.WebApi;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Security.Principal;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using GitHub.Runner.Common;
|
using GitHub.Runner.Common;
|
||||||
using GitHub.Runner.Sdk;
|
using GitHub.Runner.Sdk;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Net.Http.Headers;
|
using System.Net.Http.Headers;
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace GitHub.Runner.Listener.Configuration
|
namespace GitHub.Runner.Listener.Configuration
|
||||||
{
|
{
|
||||||
@@ -168,7 +163,8 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
{
|
{
|
||||||
// Get the URL
|
// Get the URL
|
||||||
var inputUrl = command.GetUrl();
|
var inputUrl = command.GetUrl();
|
||||||
if (!inputUrl.Contains("github.com", StringComparison.OrdinalIgnoreCase))
|
if (!inputUrl.Contains("github.com", StringComparison.OrdinalIgnoreCase) &&
|
||||||
|
!inputUrl.Contains("github.localhost", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
runnerSettings.ServerUrl = inputUrl;
|
runnerSettings.ServerUrl = inputUrl;
|
||||||
// Get the credentials
|
// Get the credentials
|
||||||
@@ -238,11 +234,8 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
{
|
{
|
||||||
runnerSettings.AgentName = command.GetAgentName();
|
runnerSettings.AgentName = command.GetAgentName();
|
||||||
|
|
||||||
// Get the system capabilities.
|
|
||||||
Dictionary<string, string> systemCapabilities = await HostContext.GetService<ICapabilitiesManager>().GetCapabilitiesAsync(runnerSettings, CancellationToken.None);
|
|
||||||
|
|
||||||
_term.WriteLine();
|
_term.WriteLine();
|
||||||
|
|
||||||
var agents = await _runnerServer.GetAgentsAsync(runnerSettings.PoolId, runnerSettings.AgentName);
|
var agents = await _runnerServer.GetAgentsAsync(runnerSettings.PoolId, runnerSettings.AgentName);
|
||||||
Trace.Verbose("Returns {0} agents", agents.Count);
|
Trace.Verbose("Returns {0} agents", agents.Count);
|
||||||
agent = agents.FirstOrDefault();
|
agent = agents.FirstOrDefault();
|
||||||
@@ -251,12 +244,12 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
_term.WriteLine("A runner exists with the same name", ConsoleColor.Yellow);
|
_term.WriteLine("A runner exists with the same name", ConsoleColor.Yellow);
|
||||||
if (command.GetReplace())
|
if (command.GetReplace())
|
||||||
{
|
{
|
||||||
// Update existing agent with new PublicKey, agent version and SystemCapabilities.
|
// Update existing agent with new PublicKey, agent version.
|
||||||
agent = UpdateExistingAgent(agent, publicKey, systemCapabilities);
|
agent = UpdateExistingAgent(agent, publicKey);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
agent = await _runnerServer.UpdateAgentAsync(runnerSettings.PoolId, agent);
|
agent = await _runnerServer.ReplaceAgentAsync(runnerSettings.PoolId, agent);
|
||||||
_term.WriteSuccessMessage("Successfully replaced the runner");
|
_term.WriteSuccessMessage("Successfully replaced the runner");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -275,7 +268,7 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Create a new agent.
|
// Create a new agent.
|
||||||
agent = CreateNewAgent(runnerSettings.AgentName, publicKey, systemCapabilities);
|
agent = CreateNewAgent(runnerSettings.AgentName, publicKey);
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -435,7 +428,7 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
{
|
{
|
||||||
ArgUtil.Equal(RunMode.Normal, HostContext.RunMode, nameof(HostContext.RunMode));
|
ArgUtil.Equal(RunMode.Normal, HostContext.RunMode, nameof(HostContext.RunMode));
|
||||||
string currentAction = string.Empty;
|
string currentAction = string.Empty;
|
||||||
|
|
||||||
_term.WriteSection("Runner removal");
|
_term.WriteSection("Runner removal");
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -499,7 +492,7 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
await _runnerServer.DeleteAgentAsync(settings.PoolId, settings.AgentId);
|
await _runnerServer.DeleteAgentAsync(settings.PoolId, settings.AgentId);
|
||||||
|
|
||||||
_term.WriteLine();
|
_term.WriteLine();
|
||||||
_term.WriteSuccessMessage("Runner removed successfully");
|
_term.WriteSuccessMessage("Runner removed successfully");
|
||||||
}
|
}
|
||||||
@@ -573,7 +566,7 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private TaskAgent UpdateExistingAgent(TaskAgent agent, RSAParameters publicKey, Dictionary<string, string> systemCapabilities)
|
private TaskAgent UpdateExistingAgent(TaskAgent agent, RSAParameters publicKey)
|
||||||
{
|
{
|
||||||
ArgUtil.NotNull(agent, nameof(agent));
|
ArgUtil.NotNull(agent, nameof(agent));
|
||||||
agent.Authorization = new TaskAgentAuthorization
|
agent.Authorization = new TaskAgentAuthorization
|
||||||
@@ -585,15 +578,14 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
agent.Version = BuildConstants.RunnerPackage.Version;
|
agent.Version = BuildConstants.RunnerPackage.Version;
|
||||||
agent.OSDescription = RuntimeInformation.OSDescription;
|
agent.OSDescription = RuntimeInformation.OSDescription;
|
||||||
|
|
||||||
foreach (KeyValuePair<string, string> capability in systemCapabilities)
|
agent.Labels.Add("self-hosted");
|
||||||
{
|
agent.Labels.Add(VarUtil.OS);
|
||||||
agent.SystemCapabilities[capability.Key] = capability.Value ?? string.Empty;
|
agent.Labels.Add(VarUtil.OSArchitecture);
|
||||||
}
|
|
||||||
|
|
||||||
return agent;
|
return agent;
|
||||||
}
|
}
|
||||||
|
|
||||||
private TaskAgent CreateNewAgent(string agentName, RSAParameters publicKey, Dictionary<string, string> systemCapabilities)
|
private TaskAgent CreateNewAgent(string agentName, RSAParameters publicKey)
|
||||||
{
|
{
|
||||||
TaskAgent agent = new TaskAgent(agentName)
|
TaskAgent agent = new TaskAgent(agentName)
|
||||||
{
|
{
|
||||||
@@ -606,10 +598,9 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
OSDescription = RuntimeInformation.OSDescription,
|
OSDescription = RuntimeInformation.OSDescription,
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (KeyValuePair<string, string> capability in systemCapabilities)
|
agent.Labels.Add("self-hosted");
|
||||||
{
|
agent.Labels.Add(VarUtil.OS);
|
||||||
agent.SystemCapabilities[capability.Key] = capability.Value ?? string.Empty;
|
agent.Labels.Add(VarUtil.OSArchitecture);
|
||||||
}
|
|
||||||
|
|
||||||
return agent;
|
return agent;
|
||||||
}
|
}
|
||||||
@@ -638,7 +629,7 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
private async Task<GitHubAuthResult> GetTenantCredential(string githubUrl, string githubToken)
|
private async Task<GitHubAuthResult> GetTenantCredential(string githubUrl, string githubToken)
|
||||||
{
|
{
|
||||||
var gitHubUrl = new UriBuilder(githubUrl);
|
var gitHubUrl = new UriBuilder(githubUrl);
|
||||||
var githubApiUrl = $"https://api.github.com/repos/{gitHubUrl.Path.Trim('/')}/actions-runners/registration";
|
var githubApiUrl = $"https://api.{gitHubUrl.Host}/repos/{gitHubUrl.Path.Trim('/')}/actions-runners/registration";
|
||||||
using (var httpClientHandler = HostContext.CreateHttpClientHandler())
|
using (var httpClientHandler = HostContext.CreateHttpClientHandler())
|
||||||
using (var httpClient = new HttpClient(httpClientHandler))
|
using (var httpClient = new HttpClient(httpClientHandler))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
using GitHub.DistributedTask.WebApi;
|
using GitHub.DistributedTask.WebApi;
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Listener.Configuration;
|
using GitHub.Runner.Listener.Configuration;
|
||||||
using GitHub.Runner.Common.Util;
|
|
||||||
using GitHub.Services.Common;
|
using GitHub.Services.Common;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -10,7 +8,6 @@ using System.Threading.Tasks;
|
|||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using GitHub.Services.WebApi;
|
|
||||||
using GitHub.Services.OAuth;
|
using GitHub.Services.OAuth;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
@@ -59,9 +56,6 @@ namespace GitHub.Runner.Listener
|
|||||||
var serverUrl = _settings.ServerUrl;
|
var serverUrl = _settings.ServerUrl;
|
||||||
Trace.Info(_settings);
|
Trace.Info(_settings);
|
||||||
|
|
||||||
// Capabilities.
|
|
||||||
Dictionary<string, string> systemCapabilities = await HostContext.GetService<ICapabilitiesManager>().GetCapabilitiesAsync(_settings, token);
|
|
||||||
|
|
||||||
// Create connection.
|
// Create connection.
|
||||||
Trace.Info("Loading Credentials");
|
Trace.Info("Loading Credentials");
|
||||||
var credMgr = HostContext.GetService<ICredentialManager>();
|
var credMgr = HostContext.GetService<ICredentialManager>();
|
||||||
@@ -75,7 +69,7 @@ namespace GitHub.Runner.Listener
|
|||||||
OSDescription = RuntimeInformation.OSDescription,
|
OSDescription = RuntimeInformation.OSDescription,
|
||||||
};
|
};
|
||||||
string sessionName = $"{Environment.MachineName ?? "RUNNER"}";
|
string sessionName = $"{Environment.MachineName ?? "RUNNER"}";
|
||||||
var taskAgentSession = new TaskAgentSession(sessionName, agent, systemCapabilities);
|
var taskAgentSession = new TaskAgentSession(sessionName, agent);
|
||||||
|
|
||||||
string errorMessage = string.Empty;
|
string errorMessage = string.Empty;
|
||||||
bool encounteringError = false;
|
bool encounteringError = false;
|
||||||
|
|||||||
@@ -2,19 +2,9 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Text;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
using GitHub.DistributedTask.WebApi;
|
using GitHub.DistributedTask.WebApi;
|
||||||
using GitHub.Runner.Common.Util;
|
|
||||||
using GitHub.Runner.Worker;
|
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Services.WebApi;
|
|
||||||
using Microsoft.Win32;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Collections.ObjectModel;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Pipelines = GitHub.DistributedTask.Pipelines;
|
using Pipelines = GitHub.DistributedTask.Pipelines;
|
||||||
using GitHub.Runner.Common;
|
using GitHub.Runner.Common;
|
||||||
|
|||||||
@@ -55,14 +55,9 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
m_properties = new PropertiesCollection(agentToBeCloned.m_properties);
|
m_properties = new PropertiesCollection(agentToBeCloned.m_properties);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (agentToBeCloned.m_systemCapabilities != null && agentToBeCloned.m_systemCapabilities.Count > 0)
|
if (agentToBeCloned.m_labels != null && agentToBeCloned.m_labels.Count > 0)
|
||||||
{
|
{
|
||||||
m_systemCapabilities = new Dictionary<String, String>(agentToBeCloned.m_systemCapabilities, StringComparer.OrdinalIgnoreCase);
|
m_labels = new HashSet<string>(agentToBeCloned.m_labels, StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
|
||||||
|
|
||||||
if (agentToBeCloned.m_userCapabilities != null && agentToBeCloned.m_userCapabilities.Count > 0)
|
|
||||||
{
|
|
||||||
m_userCapabilities = new Dictionary<String, String>(agentToBeCloned.m_userCapabilities, StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (agentToBeCloned.PendingUpdate != null)
|
if (agentToBeCloned.PendingUpdate != null)
|
||||||
@@ -152,32 +147,17 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// System-defined capabilities supported by this agent's host.
|
/// The labels of the runner
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IDictionary<String, String> SystemCapabilities
|
public ISet<string> Labels
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
if (m_systemCapabilities == null)
|
if (m_labels == null)
|
||||||
{
|
{
|
||||||
m_systemCapabilities = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
|
m_labels = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
return m_systemCapabilities;
|
return m_labels;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// User-defined capabilities supported by this agent's host.
|
|
||||||
/// </summary>
|
|
||||||
public IDictionary<String, String> UserCapabilities
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (m_userCapabilities == null)
|
|
||||||
{
|
|
||||||
m_userCapabilities = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
return m_userCapabilities;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -214,10 +194,7 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "Properties")]
|
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "Properties")]
|
||||||
private PropertiesCollection m_properties;
|
private PropertiesCollection m_properties;
|
||||||
|
|
||||||
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "SystemCapabilities")]
|
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "Labels")]
|
||||||
private Dictionary<String, String> m_systemCapabilities;
|
private HashSet<string> m_labels;
|
||||||
|
|
||||||
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "UserCapabilities")]
|
|
||||||
private Dictionary<String, String> m_userCapabilities;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -246,8 +246,7 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
PlanType = hubName,
|
PlanType = hubName,
|
||||||
ScopeId = scopeIdentifier,
|
ScopeId = scopeIdentifier,
|
||||||
PlanId = planId,
|
PlanId = planId,
|
||||||
JobId = jobId,
|
JobId = jobId
|
||||||
Demands = demands,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return QueueAgentRequestByPoolAsync(poolId, request, userState, cancellationToken);
|
return QueueAgentRequestByPoolAsync(poolId, request, userState, cancellationToken);
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
this.PoolId = requestToBeCloned.PoolId;
|
this.PoolId = requestToBeCloned.PoolId;
|
||||||
this.JobId = requestToBeCloned.JobId;
|
this.JobId = requestToBeCloned.JobId;
|
||||||
this.JobName = requestToBeCloned.JobName;
|
this.JobName = requestToBeCloned.JobName;
|
||||||
this.Demands = new List<Demand>(requestToBeCloned.Demands ?? new Demand[0]);
|
|
||||||
this.LockToken = requestToBeCloned.LockToken;
|
this.LockToken = requestToBeCloned.LockToken;
|
||||||
this.ExpectedDuration = requestToBeCloned.ExpectedDuration;
|
this.ExpectedDuration = requestToBeCloned.ExpectedDuration;
|
||||||
this.OrchestrationId = requestToBeCloned.OrchestrationId;
|
this.OrchestrationId = requestToBeCloned.OrchestrationId;
|
||||||
@@ -68,6 +67,11 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
{
|
{
|
||||||
this.AgentSpecification = new JObject(requestToBeCloned.AgentSpecification);
|
this.AgentSpecification = new JObject(requestToBeCloned.AgentSpecification);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (requestToBeCloned.Labels != null)
|
||||||
|
{
|
||||||
|
this.Labels = new HashSet<string>(requestToBeCloned.Labels, StringComparer.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -229,6 +233,7 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <value></value>
|
/// <value></value>
|
||||||
[DataMember(Order = 16, EmitDefaultValue = false)]
|
[DataMember(Order = 16, EmitDefaultValue = false)]
|
||||||
|
[Obsolete("No more demands, use labels", true)]
|
||||||
public IList<Demand> Demands
|
public IList<Demand> Demands
|
||||||
{
|
{
|
||||||
get;
|
get;
|
||||||
@@ -386,6 +391,13 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[DataMember(Order = 33, EmitDefaultValue = false)]
|
||||||
|
public ISet<string> Labels
|
||||||
|
{
|
||||||
|
get;
|
||||||
|
set;
|
||||||
|
}
|
||||||
|
|
||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
internal Guid? LockToken
|
internal Guid? LockToken
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
|
|
||||||
namespace GitHub.DistributedTask.WebApi
|
namespace GitHub.DistributedTask.WebApi
|
||||||
@@ -27,29 +26,6 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
this.OwnerName = ownerName;
|
this.OwnerName = ownerName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Initializes a new <c>TaskAgentSession</c> isntance with the specified owner name, agent, and capabilities.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="ownerName">The name of the owner for this session. This should typically be the agent machine</param>
|
|
||||||
/// <param name="agent">The target agent for the session</param>
|
|
||||||
/// <param name="systemCapabilities">A collection of capabilities to publish on session creation</param>
|
|
||||||
public TaskAgentSession(
|
|
||||||
String ownerName,
|
|
||||||
TaskAgentReference agent,
|
|
||||||
IDictionary<String, String> systemCapabilities)
|
|
||||||
{
|
|
||||||
this.Agent = agent;
|
|
||||||
this.OwnerName = ownerName;
|
|
||||||
|
|
||||||
foreach (var capability in systemCapabilities)
|
|
||||||
{
|
|
||||||
if (capability.Value != null)
|
|
||||||
{
|
|
||||||
this.SystemCapabilities.Add(capability.Key, capability.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the unique identifier for this session.
|
/// Gets the unique identifier for this session.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -89,33 +65,5 @@ namespace GitHub.DistributedTask.WebApi
|
|||||||
get;
|
get;
|
||||||
set;
|
set;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets the collection of system capabilities used for this session.
|
|
||||||
/// </summary>
|
|
||||||
public IDictionary<String, String> SystemCapabilities
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (m_systemCapabilities == null)
|
|
||||||
{
|
|
||||||
m_systemCapabilities = new Dictionary<String, String>(StringComparer.OrdinalIgnoreCase);
|
|
||||||
}
|
|
||||||
return m_systemCapabilities;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[OnSerializing]
|
|
||||||
private void OnSerializing(StreamingContext context)
|
|
||||||
{
|
|
||||||
if (m_systemCapabilities?.Count == 0)
|
|
||||||
{
|
|
||||||
m_systemCapabilities = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
[DataMember(IsRequired = false, EmitDefaultValue = false, Name = "SystemCapabilities")]
|
|
||||||
private IDictionary<String, String> m_systemCapabilities;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using GitHub.Runner.Common.Capabilities;
|
using GitHub.Runner.Worker;
|
||||||
using GitHub.Runner.Worker;
|
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
@@ -21,12 +20,12 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
manager.Initialize(tc);
|
manager.Initialize(tc);
|
||||||
|
|
||||||
// Act.
|
// Act.
|
||||||
List<ICapabilitiesProvider> extensions = manager.GetExtensions<ICapabilitiesProvider>();
|
List<IActionCommandExtension> extensions = manager.GetExtensions<IActionCommandExtension>();
|
||||||
|
|
||||||
// Assert.
|
// Assert.
|
||||||
Assert.True(
|
Assert.True(
|
||||||
extensions.Any(x => x is RunnerCapabilitiesProvider),
|
extensions.Any(x => x is SetEnvCommandExtension),
|
||||||
$"Expected {nameof(RunnerCapabilitiesProvider)} extension to be returned as a job extension.");
|
$"Expected {nameof(SetEnvCommandExtension)} extension to be returned as a job extension.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,9 +41,9 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
manager.Initialize(tc);
|
manager.Initialize(tc);
|
||||||
|
|
||||||
// Act/Assert.
|
// Act/Assert.
|
||||||
AssertContains<GitHub.Runner.Common.Capabilities.ICapabilitiesProvider>(
|
AssertContains<GitHub.Runner.Worker.IActionCommandExtension>(
|
||||||
manager,
|
manager,
|
||||||
concreteType: typeof(GitHub.Runner.Common.Capabilities.RunnerCapabilitiesProvider));
|
concreteType: typeof(GitHub.Runner.Worker.SetEnvCommandExtension));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Listener.Configuration;
|
|
||||||
using Moq;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Xunit;
|
|
||||||
|
|
||||||
namespace GitHub.Runner.Common.Tests.Listener
|
|
||||||
{
|
|
||||||
public sealed class AgentCapabilitiesProviderTestL0
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
[Trait("Level", "L0")]
|
|
||||||
[Trait("Category", "Agent")]
|
|
||||||
public async void TestGetCapabilities()
|
|
||||||
{
|
|
||||||
using (var hc = new TestHostContext(this))
|
|
||||||
using (var tokenSource = new CancellationTokenSource())
|
|
||||||
{
|
|
||||||
Mock<IConfigurationManager> configurationManager = new Mock<IConfigurationManager>();
|
|
||||||
hc.SetSingleton<IConfigurationManager>(configurationManager.Object);
|
|
||||||
|
|
||||||
// Arrange
|
|
||||||
var provider = new RunnerCapabilitiesProvider();
|
|
||||||
provider.Initialize(hc);
|
|
||||||
var settings = new RunnerSettings() { AgentName = "IAmAgent007" };
|
|
||||||
|
|
||||||
// Act
|
|
||||||
List<Capability> capabilities = await provider.GetCapabilitiesAsync(settings, tokenSource.Token);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(capabilities);
|
|
||||||
Capability runnerNameCapability = capabilities.SingleOrDefault(x => string.Equals(x.Name, "Runner.Name", StringComparison.Ordinal));
|
|
||||||
Assert.NotNull(runnerNameCapability);
|
|
||||||
Assert.Equal("IAmAgent007", runnerNameCapability.Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
[Trait("Level", "L0")]
|
|
||||||
[Trait("Category", "Agent")]
|
|
||||||
public async void TestInteractiveSessionCapability()
|
|
||||||
{
|
|
||||||
using (var hc = new TestHostContext(this))
|
|
||||||
using (var tokenSource = new CancellationTokenSource())
|
|
||||||
{
|
|
||||||
hc.StartupType = StartupType.AutoStartup;
|
|
||||||
await VerifyInteractiveSessionCapability(hc, tokenSource.Token, true);
|
|
||||||
|
|
||||||
hc.StartupType = StartupType.Service;
|
|
||||||
await VerifyInteractiveSessionCapability(hc, tokenSource.Token, false);
|
|
||||||
|
|
||||||
hc.StartupType = StartupType.Manual;
|
|
||||||
await VerifyInteractiveSessionCapability(hc, tokenSource.Token, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async Task VerifyInteractiveSessionCapability(IHostContext hc, CancellationToken token, bool expectedValue)
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var provider = new RunnerCapabilitiesProvider();
|
|
||||||
provider.Initialize(hc);
|
|
||||||
var settings = new RunnerSettings() { AgentName = "IAmAgent007" };
|
|
||||||
|
|
||||||
// Act
|
|
||||||
List<Capability> capabilities = await provider.GetCapabilitiesAsync(settings, token);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(capabilities);
|
|
||||||
Capability iSessionCapability = capabilities.SingleOrDefault(x => string.Equals(x.Name, "InteractiveSession", StringComparison.Ordinal));
|
|
||||||
Assert.NotNull(iSessionCapability);
|
|
||||||
bool.TryParse(iSessionCapability.Value, out bool isInteractive);
|
|
||||||
Assert.Equal(expectedValue, isInteractive);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
using GitHub.DistributedTask.WebApi;
|
using GitHub.DistributedTask.WebApi;
|
||||||
using GitHub.Runner.Listener;
|
using GitHub.Runner.Listener;
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Listener.Configuration;
|
using GitHub.Runner.Listener.Configuration;
|
||||||
using GitHub.Runner.Common.Util;
|
using GitHub.Runner.Common.Util;
|
||||||
using GitHub.Services.WebApi;
|
using GitHub.Services.WebApi;
|
||||||
@@ -40,8 +39,6 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
private Mock<IRSAKeyManager> _rsaKeyManager;
|
private Mock<IRSAKeyManager> _rsaKeyManager;
|
||||||
private ICapabilitiesManager _capabilitiesManager;
|
|
||||||
// private DeploymentGroupAgentConfigProvider _deploymentGroupAgentConfigProvider;
|
|
||||||
private string _expectedToken = "expectedToken";
|
private string _expectedToken = "expectedToken";
|
||||||
private string _expectedServerUrl = "https://localhost";
|
private string _expectedServerUrl = "https://localhost";
|
||||||
private string _expectedAgentName = "expectedAgentName";
|
private string _expectedAgentName = "expectedAgentName";
|
||||||
@@ -78,8 +75,6 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
_serviceControlManager = new Mock<ILinuxServiceControlManager>();
|
_serviceControlManager = new Mock<ILinuxServiceControlManager>();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_capabilitiesManager = new CapabilitiesManager();
|
|
||||||
|
|
||||||
var expectedAgent = new TaskAgent(_expectedAgentName) { Id = 1 };
|
var expectedAgent = new TaskAgent(_expectedAgentName) { Id = 1 };
|
||||||
var expectedDeploymentMachine = new DeploymentMachine() { Agent = expectedAgent, Id = _expectedDeploymentMachineId };
|
var expectedDeploymentMachine = new DeploymentMachine() { Agent = expectedAgent, Id = _expectedDeploymentMachineId };
|
||||||
expectedAgent.Authorization = new TaskAgentAuthorization
|
expectedAgent.Authorization = new TaskAgentAuthorization
|
||||||
@@ -127,7 +122,7 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
_agentServer.Setup(x => x.GetAgentsAsync(It.IsAny<int>(), It.IsAny<string>())).Returns(Task.FromResult(expectedAgents));
|
_agentServer.Setup(x => x.GetAgentsAsync(It.IsAny<int>(), It.IsAny<string>())).Returns(Task.FromResult(expectedAgents));
|
||||||
|
|
||||||
_agentServer.Setup(x => x.AddAgentAsync(It.IsAny<int>(), It.IsAny<TaskAgent>())).Returns(Task.FromResult(expectedAgent));
|
_agentServer.Setup(x => x.AddAgentAsync(It.IsAny<int>(), It.IsAny<TaskAgent>())).Returns(Task.FromResult(expectedAgent));
|
||||||
_agentServer.Setup(x => x.UpdateAgentAsync(It.IsAny<int>(), It.IsAny<TaskAgent>())).Returns(Task.FromResult(expectedAgent));
|
_agentServer.Setup(x => x.ReplaceAgentAsync(It.IsAny<int>(), It.IsAny<TaskAgent>())).Returns(Task.FromResult(expectedAgent));
|
||||||
|
|
||||||
rsa = new RSACryptoServiceProvider(2048);
|
rsa = new RSACryptoServiceProvider(2048);
|
||||||
|
|
||||||
@@ -143,8 +138,6 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
tc.SetSingleton<IExtensionManager>(_extnMgr.Object);
|
tc.SetSingleton<IExtensionManager>(_extnMgr.Object);
|
||||||
tc.SetSingleton<IRunnerServer>(_agentServer.Object);
|
tc.SetSingleton<IRunnerServer>(_agentServer.Object);
|
||||||
tc.SetSingleton<ILocationServer>(_locationServer.Object);
|
tc.SetSingleton<ILocationServer>(_locationServer.Object);
|
||||||
// tc.SetSingleton<IDeploymentGroupServer>(_machineGroupServer.Object);
|
|
||||||
tc.SetSingleton<ICapabilitiesManager>(_capabilitiesManager);
|
|
||||||
tc.SetSingleton<IRunnerWebProxy>(_runnerWebProxy.Object);
|
tc.SetSingleton<IRunnerWebProxy>(_runnerWebProxy.Object);
|
||||||
tc.SetSingleton<IRunnerCertificateManager>(_cert.Object);
|
tc.SetSingleton<IRunnerCertificateManager>(_cert.Object);
|
||||||
|
|
||||||
@@ -208,12 +201,7 @@ namespace GitHub.Runner.Common.Tests.Listener.Configuration
|
|||||||
// validate GetAgentPoolsAsync gets called once with automation pool type
|
// validate GetAgentPoolsAsync gets called once with automation pool type
|
||||||
_agentServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Once);
|
_agentServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Automation)), Times.Once);
|
||||||
|
|
||||||
// validate GetAgentPoolsAsync not called with deployment pool type
|
_agentServer.Verify(x => x.AddAgentAsync(It.IsAny<int>(), It.Is<TaskAgent>(a => a.Labels.Contains("self-hosted") && a.Labels.Contains(VarUtil.OS) && a.Labels.Contains(VarUtil.OSArchitecture))), Times.Once);
|
||||||
_agentServer.Verify(x => x.GetAgentPoolsAsync(It.IsAny<string>(), It.Is<TaskAgentPoolType>(p => p == TaskAgentPoolType.Deployment)), Times.Never);
|
|
||||||
|
|
||||||
// For build and release agent / deployment pool, tags logic should not get trigger;
|
|
||||||
// _machineGroupServer.Verify(x =>
|
|
||||||
// x.UpdateDeploymentTargetsAsync(It.IsAny<Guid>(), It.IsAny<int>(), It.IsAny<List<DeploymentMachine>>()), Times.Never);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@
|
|||||||
using GitHub.Services.Common;
|
using GitHub.Services.Common;
|
||||||
using GitHub.Services.WebApi;
|
using GitHub.Services.WebApi;
|
||||||
using GitHub.Runner.Listener;
|
using GitHub.Runner.Listener;
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Listener.Configuration;
|
using GitHub.Runner.Listener.Configuration;
|
||||||
using Moq;
|
using Moq;
|
||||||
using System;
|
using System;
|
||||||
@@ -21,7 +20,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
private Mock<IConfigurationManager> _config;
|
private Mock<IConfigurationManager> _config;
|
||||||
private Mock<IRunnerServer> _agentServer;
|
private Mock<IRunnerServer> _agentServer;
|
||||||
private Mock<ICredentialManager> _credMgr;
|
private Mock<ICredentialManager> _credMgr;
|
||||||
private Mock<ICapabilitiesManager> _capabilitiesManager;
|
|
||||||
|
|
||||||
public MessageListenerL0()
|
public MessageListenerL0()
|
||||||
{
|
{
|
||||||
@@ -30,7 +28,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
_config.Setup(x => x.LoadSettings()).Returns(_settings);
|
_config.Setup(x => x.LoadSettings()).Returns(_settings);
|
||||||
_agentServer = new Mock<IRunnerServer>();
|
_agentServer = new Mock<IRunnerServer>();
|
||||||
_credMgr = new Mock<ICredentialManager>();
|
_credMgr = new Mock<ICredentialManager>();
|
||||||
_capabilitiesManager = new Mock<ICapabilitiesManager>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private TestHostContext CreateTestContext([CallerMemberName] String testName = "")
|
private TestHostContext CreateTestContext([CallerMemberName] String testName = "")
|
||||||
@@ -39,7 +36,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
tc.SetSingleton<IConfigurationManager>(_config.Object);
|
tc.SetSingleton<IConfigurationManager>(_config.Object);
|
||||||
tc.SetSingleton<IRunnerServer>(_agentServer.Object);
|
tc.SetSingleton<IRunnerServer>(_agentServer.Object);
|
||||||
tc.SetSingleton<ICredentialManager>(_credMgr.Object);
|
tc.SetSingleton<ICredentialManager>(_credMgr.Object);
|
||||||
tc.SetSingleton<ICapabilitiesManager>(_capabilitiesManager.Object);
|
|
||||||
return tc;
|
return tc;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,8 +58,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
tokenSource.Token))
|
tokenSource.Token))
|
||||||
.Returns(Task.FromResult(expectedSession));
|
.Returns(Task.FromResult(expectedSession));
|
||||||
|
|
||||||
_capabilitiesManager.Setup(x => x.GetCapabilitiesAsync(_settings, It.IsAny<CancellationToken>())).Returns(Task.FromResult(new Dictionary<string, string>()));
|
|
||||||
|
|
||||||
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
||||||
|
|
||||||
// Act.
|
// Act.
|
||||||
@@ -106,8 +100,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
tokenSource.Token))
|
tokenSource.Token))
|
||||||
.Returns(Task.FromResult(expectedSession));
|
.Returns(Task.FromResult(expectedSession));
|
||||||
|
|
||||||
_capabilitiesManager.Setup(x => x.GetCapabilitiesAsync(_settings, It.IsAny<CancellationToken>())).Returns(Task.FromResult(new Dictionary<string, string>()));
|
|
||||||
|
|
||||||
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
||||||
|
|
||||||
// Act.
|
// Act.
|
||||||
@@ -153,8 +145,6 @@ namespace GitHub.Runner.Common.Tests.Listener
|
|||||||
tokenSource.Token))
|
tokenSource.Token))
|
||||||
.Returns(Task.FromResult(expectedSession));
|
.Returns(Task.FromResult(expectedSession));
|
||||||
|
|
||||||
_capabilitiesManager.Setup(x => x.GetCapabilitiesAsync(_settings, It.IsAny<CancellationToken>())).Returns(Task.FromResult(new Dictionary<string, string>()));
|
|
||||||
|
|
||||||
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
_credMgr.Setup(x => x.LoadCredentials()).Returns(new VssCredentials());
|
||||||
|
|
||||||
// Act.
|
// Act.
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
using GitHub.Runner.Listener;
|
using GitHub.Runner.Listener;
|
||||||
using GitHub.Runner.Common.Capabilities;
|
|
||||||
using GitHub.Runner.Listener.Configuration;
|
using GitHub.Runner.Listener.Configuration;
|
||||||
using GitHub.Runner.Worker;
|
using GitHub.Runner.Worker;
|
||||||
using GitHub.Runner.Worker.Handlers;
|
using GitHub.Runner.Worker.Handlers;
|
||||||
@@ -44,7 +43,6 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
typeof(IHostContext),
|
typeof(IHostContext),
|
||||||
typeof(ITraceManager),
|
typeof(ITraceManager),
|
||||||
typeof(IThrottlingReporter),
|
typeof(IThrottlingReporter),
|
||||||
typeof(ICapabilitiesProvider)
|
|
||||||
};
|
};
|
||||||
Validate(
|
Validate(
|
||||||
assembly: typeof(IHostContext).GetTypeInfo().Assembly,
|
assembly: typeof(IHostContext).GetTypeInfo().Assembly,
|
||||||
|
|||||||
Reference in New Issue
Block a user