From 03d31814694b64977b239666b622633e35a3df63 Mon Sep 17 00:00:00 2001 From: Jon Jensen Date: Mon, 22 Sep 2025 13:46:43 -0600 Subject: [PATCH] Add JOB_ env vars Add env vars for top-level primitives in job context job.check_run_id => JOB_CHECK_RUN_ID job.status => JOB_STATUS --- src/Runner.Worker/JobContext.cs | 28 +++++++++++++++++++++++++++- src/Test/L0/Worker/JobContextL0.cs | 17 +++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/Runner.Worker/JobContext.cs b/src/Runner.Worker/JobContext.cs index 09f3296de9c..d224608015f 100644 --- a/src/Runner.Worker/JobContext.cs +++ b/src/Runner.Worker/JobContext.cs @@ -1,10 +1,12 @@ using GitHub.DistributedTask.Pipelines.ContextData; using GitHub.Runner.Common.Util; using GitHub.Runner.Common; +using System; +using System.Collections.Generic; namespace GitHub.Runner.Worker { - public sealed class JobContext : DictionaryContextData + public sealed class JobContext : DictionaryContextData, IEnvironmentContextData { public ActionResult? Status { @@ -82,5 +84,29 @@ public double? CheckRunId } } } + + private readonly HashSet _contextEnvAllowlist = new(StringComparer.OrdinalIgnoreCase) + { + "check_run_id", + "status", + }; + + public IEnumerable> GetRuntimeEnvironmentVariables() + { + foreach (var data in this) + { + if (_contextEnvAllowlist.Contains(data.Key)) + { + if (data.Value is StringContextData value) + { + yield return new KeyValuePair($"JOB_{data.Key.ToUpperInvariant()}", value); + } + else if (data.Value is NumberContextData numberValue) + { + yield return new KeyValuePair($"JOB_{data.Key.ToUpperInvariant()}", numberValue.ToString()); + } + } + } + } } } diff --git a/src/Test/L0/Worker/JobContextL0.cs b/src/Test/L0/Worker/JobContextL0.cs index 87e33437914..95c55403b3a 100644 --- a/src/Test/L0/Worker/JobContextL0.cs +++ b/src/Test/L0/Worker/JobContextL0.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using GitHub.DistributedTask.Pipelines.ContextData; using GitHub.Runner.Worker; using Xunit; @@ -34,5 +35,21 @@ public void CheckRunId_SetNull_RemovesKey() ctx.CheckRunId = null; Assert.Null(ctx.CheckRunId); } + + [Fact] + public void GetRuntimeEnvironmentVariables_ReturnsCorrectVariables() + { + var ctx = new JobContext(); + ctx.CheckRunId = 12345; + ctx.Status = ActionResult.Success; + + var dict = new Dictionary(ctx.GetRuntimeEnvironmentVariables()); + Assert.Equal("12345", dict["JOB_CHECK_RUN_ID"]); + Assert.Equal("success", dict["JOB_STATUS"]); + + ctx.CheckRunId = null; + dict = new Dictionary(ctx.GetRuntimeEnvironmentVariables()); + Assert.False(dict.ContainsKey("JOB_CHECK_RUN_ID")); + } } }