From a5eb8cb5c44e52a2a760db12c16c65c893cb4f0d Mon Sep 17 00:00:00 2001 From: Tingluo Huang Date: Tue, 17 Mar 2020 19:58:12 -0400 Subject: [PATCH] set CI=true when launch process in actions runner. (#374) --- src/Runner.Sdk/ProcessInvoker.cs | 8 +++ src/Test/L0/ProcessInvokerL0.cs | 97 ++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) diff --git a/src/Runner.Sdk/ProcessInvoker.cs b/src/Runner.Sdk/ProcessInvoker.cs index 584146914..a56b1475a 100644 --- a/src/Runner.Sdk/ProcessInvoker.cs +++ b/src/Runner.Sdk/ProcessInvoker.cs @@ -271,6 +271,14 @@ namespace GitHub.Runner.Sdk // Indicate GitHub Actions process. _proc.StartInfo.Environment["GITHUB_ACTIONS"] = "true"; + // Set CI=true when no one else already set it. + // CI=true is common set in most CI provider in GitHub + if (!_proc.StartInfo.Environment.ContainsKey("CI") && + Environment.GetEnvironmentVariable("CI") == null) + { + _proc.StartInfo.Environment["CI"] = "true"; + } + // Hook up the events. _proc.EnableRaisingEvents = true; _proc.Exited += ProcessExitedHandler; diff --git a/src/Test/L0/ProcessInvokerL0.cs b/src/Test/L0/ProcessInvokerL0.cs index 0679349ce..1aca0bba2 100644 --- a/src/Test/L0/ProcessInvokerL0.cs +++ b/src/Test/L0/ProcessInvokerL0.cs @@ -8,6 +8,7 @@ using Xunit; using GitHub.Runner.Common.Util; using System.Threading.Channels; using GitHub.Runner.Sdk; +using System.Linq; namespace GitHub.Runner.Common.Tests { @@ -81,6 +82,102 @@ namespace GitHub.Runner.Common.Tests } } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task SetCIEnv() + { + using (TestHostContext hc = new TestHostContext(this)) + { + var existingCI = Environment.GetEnvironmentVariable("CI"); + try + { + // Clear out CI and make sure process invoker sets it. + Environment.SetEnvironmentVariable("CI", null); + + Tracing trace = hc.GetTrace(); + + Int32 exitCode = -1; + var processInvoker = new ProcessInvokerWrapper(); + processInvoker.Initialize(hc); + var stdout = new List(); + var stderr = new List(); + processInvoker.OutputDataReceived += (object sender, ProcessDataReceivedEventArgs e) => + { + trace.Info(e.Data); + stdout.Add(e.Data); + }; + processInvoker.ErrorDataReceived += (object sender, ProcessDataReceivedEventArgs e) => + { + trace.Info(e.Data); + stderr.Add(e.Data); + }; +#if OS_WINDOWS + exitCode = await processInvoker.ExecuteAsync("", "cmd.exe", "/c \"echo %CI%\"", null, CancellationToken.None); +#else + exitCode = await processInvoker.ExecuteAsync("", "bash", "-c \"echo $CI\"", null, CancellationToken.None); +#endif + + trace.Info("Exit Code: {0}", exitCode); + Assert.Equal(0, exitCode); + + Assert.Equal("true", stdout.First(x => !string.IsNullOrWhiteSpace(x))); + } + finally + { + Environment.SetEnvironmentVariable("CI", existingCI); + } + } + } + + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Common")] + public async Task KeepExistingCIEnv() + { + using (TestHostContext hc = new TestHostContext(this)) + { + var existingCI = Environment.GetEnvironmentVariable("CI"); + try + { + // Clear out CI and make sure process invoker sets it. + Environment.SetEnvironmentVariable("CI", null); + + Tracing trace = hc.GetTrace(); + + Int32 exitCode = -1; + var processInvoker = new ProcessInvokerWrapper(); + processInvoker.Initialize(hc); + var stdout = new List(); + var stderr = new List(); + processInvoker.OutputDataReceived += (object sender, ProcessDataReceivedEventArgs e) => + { + trace.Info(e.Data); + stdout.Add(e.Data); + }; + processInvoker.ErrorDataReceived += (object sender, ProcessDataReceivedEventArgs e) => + { + trace.Info(e.Data); + stderr.Add(e.Data); + }; +#if OS_WINDOWS + exitCode = await processInvoker.ExecuteAsync("", "cmd.exe", "/c \"echo %CI%\"", new Dictionary() { { "CI", "false" } }, CancellationToken.None); +#else + exitCode = await processInvoker.ExecuteAsync("", "bash", "-c \"echo $CI\"", new Dictionary() { { "CI", "false" } }, CancellationToken.None); +#endif + + trace.Info("Exit Code: {0}", exitCode); + Assert.Equal(0, exitCode); + + Assert.Equal("false", stdout.First(x => !string.IsNullOrWhiteSpace(x))); + } + finally + { + Environment.SetEnvironmentVariable("CI", existingCI); + } + } + } + #if !OS_WINDOWS //Run a process that normally takes 20sec to finish and cancel it. [Fact]