【问题标题】:How to fail a build on Gitlab CI shell runner如何在 Gitlab CI shell 运行器上构建失败
【发布时间】:2025-12-01 05:15:01
【问题描述】:

我有一个在 Windows 10 上运行的 Gitlab CI 运行器:

before_script:
  - "echo off"
  - 'call "%VS120COMNTOOLS%\vsvars32.bat"'
  - echo.
  - set
  - echo.

stages:
  - build

build:
  stage: build
  script:
  - 'StatusTest.exe'
  #- msbuild...

我正在尝试使用 StatusText.exe 使构建失败(我尝试返回状态代码 -1,0,1;引发异常等)但 Runner 仅记录异常并继续执行以下步骤。

是什么决定了 CI shell 运行程序应该使构建失败而不继续下一步?

输出:

...
windows_tracing_logfile=C:\BVTBin\Tests\installpackage\csilogfile.log
$ echo.

$ StatusTest.exe

Unhandled Exception: System.Exception: tralala
   at StatusTest.Program.Main(String[] args)
$ echo "Restoring NuGet Packages..."
...

【问题讨论】:

  • 今天面临与您相同的问题,我发布了一个对我有用的答案。希望对您和其他人有所帮助

标签: gitlab gitlab-ci gitlab-ci-runner


【解决方案1】:

什么决定了 CI shell 运行器应该使构建失败而不是 继续下一步?

1) 什么时候应该失败

您需要在gitlab-ci.yml 中添加此行

- # ....
- exit 1

stage执行结果应该失败,不进入下一步:

然后当您查看您的舞台(在我的情况下为第三个)时,结果将失败:

2) 什么时候应该成功

您需要在gitlab-ci.yml 中添加此行

- # ....
- exit 0

阶段执行结果应该是:

然后当您查看您的阶段(在我的情况下为第三阶段)时,结果将是好的并准备好进入下一个阶段:

【讨论】:

  • 这是真的,除了在after_script 工作部分,exit 1 不会失败
  • 这是因为 after_script 中的错误不会导致作业失败;这是 after_script 的(其中之一)。
  • 由于某些情况有没有办法skip a build
  • 如果执行脚本返回exit 1,它仍然无法完成作业?
【解决方案2】:

您的StatusTest.exe 必须返回信号 1,0,-1 作为状态码。它必须在您的应用程序中实现。 否则,如果您的应用程序失败,跑步者将不会通知。 几乎每种编程语言都有返回状态码的方法。

C#

Java

System.exit(exitCode) # exitCode = 1 or 0 or -1

[...] 等等。

也许尽量不抛出异常,只返回一个状态码。

【讨论】:

  • OP 提到他们已经尝试过退出代码和异常。
最近更新 更多