diff --git a/src/Runner.Listener/Runner.cs b/src/Runner.Listener/Runner.cs index e20eb6256e5..961e8c69f26 100644 --- a/src/Runner.Listener/Runner.cs +++ b/src/Runner.Listener/Runner.cs @@ -113,6 +113,7 @@ public async Task ExecuteCommand(CommandSettings command) var pat = command.GetGitHubPersonalAccessToken(required: true); var checkExtensions = HostContext.GetService().GetExtensions(); var sortedChecks = checkExtensions.OrderBy(x => x.Order); + var hasFailure = false; foreach (var check in sortedChecks) { _term.WriteLine($"**********************************************************************************************************************"); @@ -122,6 +123,7 @@ public async Task ExecuteCommand(CommandSettings command) var result = await check.RunCheck(url, pat); if (!result) { + hasFailure = true; _term.WriteLine($"** **"); _term.WriteLine($"** F A I L **"); _term.WriteLine($"** **"); @@ -144,7 +146,7 @@ public async Task ExecuteCommand(CommandSettings command) _term.WriteLine(); } - return Constants.Runner.ReturnCode.Success; + return hasFailure ? Constants.Runner.ReturnCode.TerminatedError : Constants.Runner.ReturnCode.Success; } // Configure runner prompt for args if not supplied diff --git a/src/Test/L0/Listener/RunnerL0.cs b/src/Test/L0/Listener/RunnerL0.cs index b9aa4c88017..09ba003ac31 100644 --- a/src/Test/L0/Listener/RunnerL0.cs +++ b/src/Test/L0/Listener/RunnerL0.cs @@ -5,6 +5,7 @@ using System.Threading.Tasks; using GitHub.DistributedTask.WebApi; using GitHub.Runner.Listener; +using GitHub.Runner.Listener.Check; using GitHub.Runner.Listener.Configuration; using GitHub.Services.Common; using GitHub.Services.WebApi; @@ -216,6 +217,44 @@ public async Task TestExecuteCommandForRunAsService(string[] args, bool configur } } + [Theory] + [InlineData(true, Constants.Runner.ReturnCode.Success)] + [InlineData(false, Constants.Runner.ReturnCode.TerminatedError)] + [Trait("Level", "L0")] + [Trait("Category", "Runner")] + public async Task TestCheckCommandReturnsNonZeroWhenCheckFails(bool checkResult, int expectedReturnCode) + { + using (var hc = new TestHostContext(this)) + { + var extensionManager = new Mock(); + var check = new Mock(); + check.Setup(x => x.Order).Returns(1); + check.Setup(x => x.CheckName).Returns("test check"); + check.Setup(x => x.CheckDescription).Returns("test description"); + check.Setup(x => x.CheckLog).Returns("test log"); + check.Setup(x => x.HelpLink).Returns("test help"); + check.Setup(x => x.RunCheck("https://github.com/actions/runner", "token")) + .ReturnsAsync(checkResult); + + extensionManager.Setup(x => x.GetExtensions()) + .Returns(new List { check.Object }); + + hc.SetSingleton(_configurationManager.Object); + hc.SetSingleton(_promptManager.Object); + hc.SetSingleton(extensionManager.Object); + hc.SetSingleton(_runnerServer.Object); + hc.EnqueueInstance(_acquireJobThrottler.Object); + + var command = new CommandSettings(hc, new[] { "--check", "--url", "https://github.com/actions/runner", "--pat", "token" }); + + var runner = new Runner.Listener.Runner(); + runner.Initialize(hc); + var result = await runner.ExecuteCommand(command); + + Assert.Equal(expectedReturnCode, result); + } + } + [Fact] [Trait("Level", "L0")] [Trait("Category", "Runner")]