mirror of
https://github.com/actions/runner.git
synced 2025-12-12 15:13:30 +00:00
Lets allow up to 150 characters for services on linux/mac (#1710)
* Lets allow up to 150 characters on linux/mac, just to avoid some issues with runner naming * Add 4 randomized digits on mac/linux * fix pragma issue * fix test * Address pr feedback * reduce complexity * lets make it cleaner! * fix test * fix logic
This commit is contained in:
@@ -48,13 +48,12 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
string repoOrOrgName = regex.Replace(settings.RepoOrOrgName, "-");
|
string repoOrOrgName = regex.Replace(settings.RepoOrOrgName, "-");
|
||||||
|
|
||||||
serviceName = StringUtil.Format(serviceNamePattern, repoOrOrgName, settings.AgentName);
|
serviceName = StringUtil.Format(serviceNamePattern, repoOrOrgName, settings.AgentName);
|
||||||
|
if (serviceName.Length > MaxServiceNameLength)
|
||||||
if (serviceName.Length > 80)
|
|
||||||
{
|
{
|
||||||
Trace.Verbose($"Calculated service name is too long (> 80 chars). Trying again by calculating a shorter name.");
|
Trace.Verbose($"Calculated service name is too long (> {MaxServiceNameLength} chars). Trying again by calculating a shorter name.");
|
||||||
|
// Add 5 to add -xxxx random number on the end
|
||||||
int exceededCharLength = serviceName.Length - 80;
|
int exceededCharLength = serviceName.Length - MaxServiceNameLength + 5;
|
||||||
string repoOrOrgNameSubstring = StringUtil.SubstringPrefix(repoOrOrgName, 45);
|
string repoOrOrgNameSubstring = StringUtil.SubstringPrefix(repoOrOrgName, MaxRepoOrgCharacters);
|
||||||
|
|
||||||
exceededCharLength -= repoOrOrgName.Length - repoOrOrgNameSubstring.Length;
|
exceededCharLength -= repoOrOrgName.Length - repoOrOrgNameSubstring.Length;
|
||||||
|
|
||||||
@@ -66,6 +65,10 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
runnerNameSubstring = StringUtil.SubstringPrefix(settings.AgentName, settings.AgentName.Length - exceededCharLength);
|
runnerNameSubstring = StringUtil.SubstringPrefix(settings.AgentName, settings.AgentName.Length - exceededCharLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lets add a suffix with a random number to reduce the chance of collisions between runner names once we truncate
|
||||||
|
var random = new Random();
|
||||||
|
var num = random.Next(1000, 9999).ToString();
|
||||||
|
runnerNameSubstring +=$"-{num}";
|
||||||
serviceName = StringUtil.Format(serviceNamePattern, repoOrOrgNameSubstring, runnerNameSubstring);
|
serviceName = StringUtil.Format(serviceNamePattern, repoOrOrgNameSubstring, runnerNameSubstring);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,5 +76,12 @@ namespace GitHub.Runner.Listener.Configuration
|
|||||||
|
|
||||||
Trace.Info($"Service name '{serviceName}' display name '{serviceDisplayName}' will be used for service configuration.");
|
Trace.Info($"Service name '{serviceName}' display name '{serviceDisplayName}' will be used for service configuration.");
|
||||||
}
|
}
|
||||||
|
#if (OS_LINUX || OS_OSX)
|
||||||
|
const int MaxServiceNameLength = 150;
|
||||||
|
const int MaxRepoOrgCharacters = 70;
|
||||||
|
#elif OS_WINDOWS
|
||||||
|
const int MaxServiceNameLength = 80;
|
||||||
|
const int MaxRepoOrgCharacters = 45;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using GitHub.Runner.Common;
|
using GitHub.Runner.Common;
|
||||||
using GitHub.Runner.Listener.Configuration;
|
using GitHub.Runner.Listener.Configuration;
|
||||||
using Xunit;
|
using Xunit;
|
||||||
@@ -15,7 +16,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
{
|
{
|
||||||
RunnerSettings settings = new RunnerSettings();
|
RunnerSettings settings = new RunnerSettings();
|
||||||
|
|
||||||
settings.AgentName = "thisiskindofalongrunnername1";
|
settings.AgentName = "thisiskindofalongrunnerabcde";
|
||||||
settings.ServerUrl = "https://example.githubusercontent.com/12345678901234567890123456789012345678901234567890";
|
settings.ServerUrl = "https://example.githubusercontent.com/12345678901234567890123456789012345678901234567890";
|
||||||
settings.GitHubUrl = "https://github.com/myorganizationexample/myrepoexample";
|
settings.GitHubUrl = "https://github.com/myorganizationexample/myrepoexample";
|
||||||
|
|
||||||
@@ -43,7 +44,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
Assert.Equal("actions", serviceNameParts[0]);
|
Assert.Equal("actions", serviceNameParts[0]);
|
||||||
Assert.Equal("runner", serviceNameParts[1]);
|
Assert.Equal("runner", serviceNameParts[1]);
|
||||||
Assert.Equal("myorganizationexample-myrepoexample", serviceNameParts[2]); // '/' has been replaced with '-'
|
Assert.Equal("myorganizationexample-myrepoexample", serviceNameParts[2]); // '/' has been replaced with '-'
|
||||||
Assert.Equal("thisiskindofalongrunnername1", serviceNameParts[3]);
|
Assert.Equal("thisiskindofalongrunnerabcde", serviceNameParts[3]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,7 +55,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
{
|
{
|
||||||
RunnerSettings settings = new RunnerSettings();
|
RunnerSettings settings = new RunnerSettings();
|
||||||
|
|
||||||
settings.AgentName = "thisiskindofalongrunnername12";
|
settings.AgentName = "thisiskindofalongrunnernabcde";
|
||||||
settings.ServerUrl = "https://example.githubusercontent.com/12345678901234567890123456789012345678901234567890";
|
settings.ServerUrl = "https://example.githubusercontent.com/12345678901234567890123456789012345678901234567890";
|
||||||
settings.GitHubUrl = "https://github.com/myorganizationexample/myrepoexample";
|
settings.GitHubUrl = "https://github.com/myorganizationexample/myrepoexample";
|
||||||
|
|
||||||
@@ -82,10 +83,11 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
Assert.Equal("actions", serviceNameParts[0]);
|
Assert.Equal("actions", serviceNameParts[0]);
|
||||||
Assert.Equal("runner", serviceNameParts[1]);
|
Assert.Equal("runner", serviceNameParts[1]);
|
||||||
Assert.Equal("myorganizationexample-myrepoexample", serviceNameParts[2]); // '/' has been replaced with '-'
|
Assert.Equal("myorganizationexample-myrepoexample", serviceNameParts[2]); // '/' has been replaced with '-'
|
||||||
Assert.Equal("thisiskindofalongrunnername12", serviceNameParts[3]);
|
Assert.Equal("thisiskindofalongrunnernabcde", serviceNameParts[3]); // should not have random numbers unless we exceed 80
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if OS_WINDOWS
|
||||||
[Fact]
|
[Fact]
|
||||||
[Trait("Level", "L0")]
|
[Trait("Level", "L0")]
|
||||||
[Trait("Category", "Service")]
|
[Trait("Category", "Service")]
|
||||||
@@ -121,7 +123,7 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
Assert.Equal("actions", serviceNameParts[0]); // Never shortened
|
Assert.Equal("actions", serviceNameParts[0]); // Never shortened
|
||||||
Assert.Equal("runner", serviceNameParts[1]); // Never shortened
|
Assert.Equal("runner", serviceNameParts[1]); // Never shortened
|
||||||
Assert.Equal("myreallylongorganizationexample-myreallylongr", serviceNameParts[2]); // First 45 chars, '/' has been replaced with '-'
|
Assert.Equal("myreallylongorganizationexample-myreallylongr", serviceNameParts[2]); // First 45 chars, '/' has been replaced with '-'
|
||||||
Assert.Equal("thisisareallyreally", serviceNameParts[3]); // Remainder of unused chars
|
Assert.Matches(@"^(thisisareallyr-[0-9]{4})$", serviceNameParts[3]); // Remainder of unused chars, 4 random numbers added at the end
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,6 +166,46 @@ namespace GitHub.Runner.Common.Tests
|
|||||||
Assert.Equal("name", serviceNameParts[3]);
|
Assert.Equal("name", serviceNameParts[3]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
[Fact]
|
||||||
|
[Trait("Level", "L0")]
|
||||||
|
[Trait("Category", "Service")]
|
||||||
|
public void CalculateServiceNameLimitsServiceNameTo150Chars()
|
||||||
|
{
|
||||||
|
RunnerSettings settings = new RunnerSettings();
|
||||||
|
|
||||||
|
settings.AgentName = "thisisareallyreallylongbutstillvalidagentnameiamusingforthisexampletotestverylongnamelimits";
|
||||||
|
settings.ServerUrl = "https://example.githubusercontent.com/12345678901234567890123456789012345678901234567890";
|
||||||
|
settings.GitHubUrl = "https://github.com/myreallylongorganizationexampleonlinux/myreallylongrepoexampleonlinux1234";
|
||||||
|
|
||||||
|
string serviceNamePattern = "actions.runner.{0}.{1}";
|
||||||
|
string serviceDisplayNamePattern = "GitHub Actions Runner ({0}.{1})";
|
||||||
|
|
||||||
|
using (TestHostContext hc = CreateTestContext())
|
||||||
|
{
|
||||||
|
ServiceControlManager scm = new ServiceControlManager();
|
||||||
|
|
||||||
|
scm.Initialize(hc);
|
||||||
|
scm.CalculateServiceName(
|
||||||
|
settings,
|
||||||
|
serviceNamePattern,
|
||||||
|
serviceDisplayNamePattern,
|
||||||
|
out string serviceName,
|
||||||
|
out string serviceDisplayName);
|
||||||
|
|
||||||
|
// Verify name has been shortened to 150
|
||||||
|
Assert.Equal(150, serviceName.Length);
|
||||||
|
|
||||||
|
var serviceNameParts = serviceName.Split('.');
|
||||||
|
|
||||||
|
// Verify that each component has been shortened to a sensible length
|
||||||
|
Assert.Equal("actions", serviceNameParts[0]); // Never shortened
|
||||||
|
Assert.Equal("runner", serviceNameParts[1]); // Never shortened
|
||||||
|
Assert.Equal("myreallylongorganizationexampleonlinux-myreallylongrepoexampleonlinux1", serviceNameParts[2]); // First 70 chars, '/' has been replaced with '-'
|
||||||
|
Assert.Matches(@"^(thisisareallyreallylongbutstillvalidagentnameiamusingforthi-[0-9]{4})$", serviceNameParts[3]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
private TestHostContext CreateTestContext([CallerMemberName] string testName = "")
|
private TestHostContext CreateTestContext([CallerMemberName] string testName = "")
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user