diff --git a/src/Runner.Worker/ActionManager.cs b/src/Runner.Worker/ActionManager.cs index 6fe22e6fb..04112b533 100644 --- a/src/Runner.Worker/ActionManager.cs +++ b/src/Runner.Worker/ActionManager.cs @@ -1042,7 +1042,7 @@ namespace GitHub.Runner.Worker if (actionDefinitionData.Execution.ExecutionType == ActionExecutionType.Container) { var containerAction = actionDefinitionData.Execution as ContainerActionExecutionData; - if (containerAction.Image.EndsWith("Dockerfile") || containerAction.Image.EndsWith("dockerfile")) + if (DockerUtil.IsDockerfile(containerAction.Image)) { var dockerFileFullPath = Path.Combine(actionEntryDirectory, containerAction.Image); executionContext.Debug($"Dockerfile for action: '{dockerFileFullPath}'."); diff --git a/src/Runner.Worker/Container/DockerUtil.cs b/src/Runner.Worker/Container/DockerUtil.cs index b1aa5c6c6..8eb922493 100644 --- a/src/Runner.Worker/Container/DockerUtil.cs +++ b/src/Runner.Worker/Container/DockerUtil.cs @@ -1,5 +1,6 @@ -using System; +using System; using System.Collections.Generic; +using System.Linq; using System.Text.RegularExpressions; namespace GitHub.Runner.Worker.Container @@ -65,6 +66,16 @@ namespace GitHub.Runner.Worker.Container return ""; } + public static bool IsDockerfile(string image) + { + if (image.StartsWith("docker://", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + var imageWithoutPath = image.Split('/').Last(); + return imageWithoutPath.StartsWith("Dockerfile.", StringComparison.OrdinalIgnoreCase) || imageWithoutPath.EndsWith("Dockerfile", StringComparison.OrdinalIgnoreCase); + } + public static string CreateEscapedOption(string flag, string key) { if (String.IsNullOrEmpty(key)) diff --git a/src/Runner.Worker/Handlers/ContainerActionHandler.cs b/src/Runner.Worker/Handlers/ContainerActionHandler.cs index c1d57de11..9d9d20f17 100644 --- a/src/Runner.Worker/Handlers/ContainerActionHandler.cs +++ b/src/Runner.Worker/Handlers/ContainerActionHandler.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -56,7 +56,7 @@ namespace GitHub.Runner.Worker.Handlers { Data.Image = Data.Image.Substring("docker://".Length); } - else if (Data.Image.EndsWith("Dockerfile") || Data.Image.EndsWith("dockerfile")) + else if (DockerUtil.IsDockerfile(Data.Image)) { // ensure docker file exist dockerFile = Path.Combine(ActionDirectory, Data.Image); diff --git a/src/Test/L0/Container/DockerUtilL0.cs b/src/Test/L0/Container/DockerUtilL0.cs index 92d353198..a872f8de7 100644 --- a/src/Test/L0/Container/DockerUtilL0.cs +++ b/src/Test/L0/Container/DockerUtilL0.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using GitHub.Runner.Worker.Container; using Xunit; @@ -145,6 +145,49 @@ namespace GitHub.Runner.Common.Tests.Worker.Container Assert.Equal(expected, actual); } + [Theory] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + [InlineData("dockerhub/repo", false)] + [InlineData("debian:latest", false)] + [InlineData("something/dockerfileimage", false)] + [InlineData("ghcr.io/docker/dockerfile", true)] // should be false but might break the current workflows + [InlineData("Dockerfile", true)] + [InlineData("Dockerfile.", true)] + [InlineData(".Dockerfile", true)] + [InlineData(".Dockerfile.", false)] + [InlineData("dockerfile", true)] + [InlineData("dockerfile.", true)] + [InlineData(".dockerfile", true)] + [InlineData(".dockerfile.", false)] + [InlineData("Dockerfile.test", true)] + [InlineData("test.Dockerfile", true)] + [InlineData("docker/dockerfile:latest", false)] + [InlineData("/some/path/dockerfile:latest", false)] + [InlineData("dockerfile:latest", false)] + [InlineData("Dockerfile:latest", false)] + [InlineData("dockerfile-latest", false)] + [InlineData("Dockerfile-latest", false)] + [InlineData("dockerfile.latest", true)] + [InlineData("Dockerfile.latest", true)] + [InlineData("../dockerfile/dockerfileone", false)] + [InlineData("../Dockerfile/dockerfileone", false)] + [InlineData("../dockerfile.test", true)] + [InlineData("../Dockerfile.test", true)] + [InlineData("./dockerfile/image", false)] + [InlineData("./Dockerfile/image", false)] + [InlineData("example/Dockerfile.test", true)] + [InlineData("./example/Dockerfile.test", true)] + [InlineData("example/test.dockerfile", true)] + [InlineData("./example/test.dockerfile", true)] + [InlineData("docker://Dockerfile", false)] + [InlineData("docker://ubuntu:latest", false)] + public void IsDockerfile(string input, bool expected) + { + var actual = DockerUtil.IsDockerfile(input); + Assert.Equal(expected, actual); + } + [Theory] [Trait("Level", "L0")] [Trait("Category", "Worker")]