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"; } }