From c05e6748c390b0b746d2f4305e4e9870f7f24927 Mon Sep 17 00:00:00 2001 From: Nikola Jokic Date: Thu, 29 Jun 2023 12:12:23 +0200 Subject: [PATCH] Extend github context with host-workspace (#2517) * hash files translation works with host context translated * Change file encoding to utf8 for PipelineTemplateConstants.cs * infer the feature flag on hash files based on the existence of the context * encoded utf8 with bom * rename host-workspace to host-work-directory and feature flag the new context var * Added comment to explain ignore host work directory resolution Co-authored-by: fhammerl * trigger pipeline * Move to the github host-workspace context instead of the runner host-work-directory * remove unused imports --------- Co-authored-by: fhammerl --- src/Runner.Worker/ExecutionContext.cs | 6 ++++++ src/Runner.Worker/Expressions/HashFilesFunction.cs | 9 ++++++++- src/Runner.Worker/JobExtension.cs | 9 ++++++++- .../ObjectTemplating/PipelineTemplateConstants.cs | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Runner.Worker/ExecutionContext.cs b/src/Runner.Worker/ExecutionContext.cs index fcab25a8d..a366dd5c1 100644 --- a/src/Runner.Worker/ExecutionContext.cs +++ b/src/Runner.Worker/ExecutionContext.cs @@ -1355,6 +1355,12 @@ namespace GitHub.Runner.Worker { foreach (var key in dict.Keys.ToList()) { + if (key == PipelineTemplateConstants.HostWorkspace) + { + // The HostWorkspace context var is excluded so that there is a var that always points to the host path. + // This var can be used to translate back from container paths, e.g. in HashFilesFunction, which always runs on the host machine + continue; + } if (dict[key] is StringContextData) { var value = dict[key].ToString(); diff --git a/src/Runner.Worker/Expressions/HashFilesFunction.cs b/src/Runner.Worker/Expressions/HashFilesFunction.cs index 2610c9f11..5ad0d1209 100644 --- a/src/Runner.Worker/Expressions/HashFilesFunction.cs +++ b/src/Runner.Worker/Expressions/HashFilesFunction.cs @@ -26,11 +26,18 @@ namespace GitHub.Runner.Worker.Expressions ArgUtil.NotNull(githubContextData, nameof(githubContextData)); var githubContext = githubContextData as DictionaryContextData; ArgUtil.NotNull(githubContext, nameof(githubContext)); - githubContext.TryGetValue(PipelineTemplateConstants.Workspace, out var workspace); + + if (!githubContext.TryGetValue(PipelineTemplateConstants.HostWorkspace, out var workspace)) + { + githubContext.TryGetValue(PipelineTemplateConstants.Workspace, out workspace); + } + ArgUtil.NotNull(workspace, nameof(workspace)); + var workspaceData = workspace as StringContextData; ArgUtil.NotNull(workspaceData, nameof(workspaceData)); string githubWorkspace = workspaceData.Value; + bool followSymlink = false; List patterns = new(); var firstParameter = true; diff --git a/src/Runner.Worker/JobExtension.cs b/src/Runner.Worker/JobExtension.cs index 5e6646953..180e33e19 100644 --- a/src/Runner.Worker/JobExtension.cs +++ b/src/Runner.Worker/JobExtension.cs @@ -175,7 +175,14 @@ namespace GitHub.Runner.Worker context.Debug("Update context data"); string _workDirectory = HostContext.GetDirectory(WellKnownDirectory.Work); context.SetRunnerContext("workspace", Path.Combine(_workDirectory, trackingConfig.PipelineDirectory)); - context.SetGitHubContext("workspace", Path.Combine(_workDirectory, trackingConfig.WorkspaceDirectory)); + + var githubWorkspace = Path.Combine(_workDirectory, trackingConfig.WorkspaceDirectory); + if (jobContext.Global.Variables.GetBoolean(Constants.Runner.Features.UseContainerPathForTemplate) ?? false) + { + // This value is used to translate paths from the container path back to the host path. + context.SetGitHubContext("host-workspace", githubWorkspace); + } + context.SetGitHubContext("workspace", githubWorkspace); // Temporary hack for GHES alpha var configurationStore = HostContext.GetService(); diff --git a/src/Sdk/DTPipelines/Pipelines/ObjectTemplating/PipelineTemplateConstants.cs b/src/Sdk/DTPipelines/Pipelines/ObjectTemplating/PipelineTemplateConstants.cs index d2d925350..e9fb75dfa 100644 --- a/src/Sdk/DTPipelines/Pipelines/ObjectTemplating/PipelineTemplateConstants.cs +++ b/src/Sdk/DTPipelines/Pipelines/ObjectTemplating/PipelineTemplateConstants.cs @@ -82,5 +82,6 @@ namespace GitHub.DistributedTask.Pipelines.ObjectTemplating public const String WorkflowRoot = "workflow-root"; public const String WorkingDirectory = "working-directory"; public const String Workspace = "workspace"; + public const String HostWorkspace = "host-workspace"; } }