From 16ecb5f5856b2d1181c17dc3d3de8d333da64936 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Wed, 31 Aug 2022 12:24:14 +0200 Subject: [PATCH 1/2] docker: escape key-value pair as -e KEY and VALUE being environment var --- .../Container/DockerCommandManager.cs | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/src/Runner.Worker/Container/DockerCommandManager.cs b/src/Runner.Worker/Container/DockerCommandManager.cs index a0c158bdf68..2b8fb102af1 100644 --- a/src/Runner.Worker/Container/DockerCommandManager.cs +++ b/src/Runner.Worker/Container/DockerCommandManager.cs @@ -107,6 +107,7 @@ public async Task DockerBuild(IExecutionContext context, string workingDire public async Task DockerCreate(IExecutionContext context, ContainerInfo container) { IList dockerOptions = new List(); + IDictionary environment = new Dictionary(); // OPTIONS dockerOptions.Add($"--name {container.ContainerDisplayName}"); dockerOptions.Add($"--label {DockerInstanceLabel}"); @@ -135,7 +136,8 @@ public async Task DockerCreate(IExecutionContext context, ContainerInfo } else { - dockerOptions.Add(DockerUtil.CreateEscapedOption("-e", env.Key, env.Value)); + environment.Add(env.Key, env.Value); + dockerOptions.Add(DockerUtil.CreateEscapedOption("-e", env.Key)); } } @@ -183,7 +185,7 @@ public async Task DockerCreate(IExecutionContext context, ContainerInfo dockerOptions.Add($"{container.ContainerEntryPointArgs}"); var optionsString = string.Join(" ", dockerOptions); - List outputStrings = await ExecuteDockerCommandAsync(context, "create", optionsString); + List outputStrings = await ExecuteDockerCommandAsync(context, "create", optionsString, environment); return outputStrings.FirstOrDefault(); } @@ -477,5 +479,41 @@ await processInvoker.ExecuteAsync( return output; } + + private async Task> ExecuteDockerCommandAsync(IExecutionContext context, string command, string options, IDictionary environment) + { + string arg = $"{command} {options}".Trim(); + context.Command($"{DockerPath} {arg}"); + + List output = new List(); + var processInvoker = HostContext.CreateService(); + processInvoker.OutputDataReceived += delegate (object sender, ProcessDataReceivedEventArgs message) + { + if (!string.IsNullOrEmpty(message.Data)) + { + output.Add(message.Data); + context.Output(message.Data); + } + }; + + processInvoker.ErrorDataReceived += delegate (object sender, ProcessDataReceivedEventArgs message) + { + if (!string.IsNullOrEmpty(message.Data)) + { + context.Output(message.Data); + } + }; + + await processInvoker.ExecuteAsync( + workingDirectory: context.GetGitHubContext("workspace"), + fileName: DockerPath, + arguments: arg, + environment: environment, + requireExitCodeZero: true, + outputEncoding: null, + cancellationToken: CancellationToken.None); + + return output; + } } } From 95e6dc546b6621d3ee6a9f551bab5ec9b3af1cf9 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Wed, 31 Aug 2022 15:37:19 +0200 Subject: [PATCH 2/2] removed code duplication, removed unused method and test --- .../Container/DockerCommandManager.cs | 33 +------------------ src/Runner.Worker/Container/DockerUtil.cs | 9 ----- src/Test/L0/Container/DockerUtilL0.cs | 27 --------------- 3 files changed, 1 insertion(+), 68 deletions(-) diff --git a/src/Runner.Worker/Container/DockerCommandManager.cs b/src/Runner.Worker/Container/DockerCommandManager.cs index 2b8fb102af1..4d4940c9752 100644 --- a/src/Runner.Worker/Container/DockerCommandManager.cs +++ b/src/Runner.Worker/Container/DockerCommandManager.cs @@ -446,38 +446,7 @@ public Task DockerLogin(IExecutionContext context, string configFileDirecto private async Task> ExecuteDockerCommandAsync(IExecutionContext context, string command, string options) { - string arg = $"{command} {options}".Trim(); - context.Command($"{DockerPath} {arg}"); - - List output = new List(); - var processInvoker = HostContext.CreateService(); - processInvoker.OutputDataReceived += delegate (object sender, ProcessDataReceivedEventArgs message) - { - if (!string.IsNullOrEmpty(message.Data)) - { - output.Add(message.Data); - context.Output(message.Data); - } - }; - - processInvoker.ErrorDataReceived += delegate (object sender, ProcessDataReceivedEventArgs message) - { - if (!string.IsNullOrEmpty(message.Data)) - { - context.Output(message.Data); - } - }; - - await processInvoker.ExecuteAsync( - workingDirectory: context.GetGitHubContext("workspace"), - fileName: DockerPath, - arguments: arg, - environment: null, - requireExitCodeZero: true, - outputEncoding: null, - cancellationToken: CancellationToken.None); - - return output; + return await ExecuteDockerCommandAsync(context, command, options, null); } private async Task> ExecuteDockerCommandAsync(IExecutionContext context, string command, string options, IDictionary environment) diff --git a/src/Runner.Worker/Container/DockerUtil.cs b/src/Runner.Worker/Container/DockerUtil.cs index bde59f5b641..e1ae6d3eeb4 100644 --- a/src/Runner.Worker/Container/DockerUtil.cs +++ b/src/Runner.Worker/Container/DockerUtil.cs @@ -71,15 +71,6 @@ public static string CreateEscapedOption(string flag, string key) return $"{flag} \"{EscapeString(key)}\""; } - public static string CreateEscapedOption(string flag, string key, string value) - { - if (String.IsNullOrEmpty(key)) - { - return ""; - } - return $"{flag} \"{EscapeString(key)}={EscapeString(value)}\""; - } - private static string EscapeString(string value) { return value.Replace("\\", "\\\\").Replace("\"", "\\\""); diff --git a/src/Test/L0/Container/DockerUtilL0.cs b/src/Test/L0/Container/DockerUtilL0.cs index e5ae05fda72..843aaf5efd1 100644 --- a/src/Test/L0/Container/DockerUtilL0.cs +++ b/src/Test/L0/Container/DockerUtilL0.cs @@ -171,32 +171,5 @@ public void CreateEscapedOption_keyOnly(string input, string escaped) } Assert.Equal(expected, actual); } - - [Theory] - [Trait("Level", "L0")] - [Trait("Category", "Worker")] - [InlineData("HOME", "", "HOME", "")] - [InlineData("HOME alpine:3.8 sh -c id #", "HOME alpine:3.8 sh -c id #", "HOME alpine:3.8 sh -c id #", "HOME alpine:3.8 sh -c id #")] - [InlineData("HOME \"alpine:3.8 sh -c id #", "HOME \"alpine:3.8 sh -c id #", "HOME \\\"alpine:3.8 sh -c id #", "HOME \\\"alpine:3.8 sh -c id #")] - [InlineData("HOME \\\"alpine:3.8 sh -c id #", "HOME \\\"alpine:3.8 sh -c id #", "HOME \\\\\\\"alpine:3.8 sh -c id #", "HOME \\\\\\\"alpine:3.8 sh -c id #")] - [InlineData("HOME \\\\\"alpine:3.8 sh -c id #", "HOME \\\\\"alpine:3.8 sh -c id #", "HOME \\\\\\\\\\\"alpine:3.8 sh -c id #", "HOME \\\\\\\\\\\"alpine:3.8 sh -c id #")] - [InlineData("HOME \"\"alpine:3.8 sh -c id #", "HOME \"\"alpine:3.8 sh -c id #", "HOME \\\"\\\"alpine:3.8 sh -c id #", "HOME \\\"\\\"alpine:3.8 sh -c id #")] - [InlineData("HOME \\\"\"alpine:3.8 sh -c id #", "HOME \\\"\"alpine:3.8 sh -c id #", "HOME \\\\\\\"\\\"alpine:3.8 sh -c id #", "HOME \\\\\\\"\\\"alpine:3.8 sh -c id #")] - [InlineData("HOME \"\\\"alpine:3.8 sh -c id #", "HOME \"\\\"alpine:3.8 sh -c id #", "HOME \\\"\\\\\\\"alpine:3.8 sh -c id #", "HOME \\\"\\\\\\\"alpine:3.8 sh -c id #")] - public void CreateEscapedOption_keyValue(string keyInput, string valueInput, string escapedKey, string escapedValue) - { - var flag = "--example"; - var actual = DockerUtil.CreateEscapedOption(flag, keyInput, valueInput); - string expected; - if (String.IsNullOrEmpty(keyInput)) - { - expected = ""; - } - else - { - expected = $"{flag} \"{escapedKey}={escapedValue}\""; - } - Assert.Equal(expected, actual); - } } }