如何在 Gitlab CI shell 运行器上构建失败

Posted

技术标签:

【中文标题】如何在 Gitlab CI shell 运行器上构建失败【英文标题】:How to fail a build on Gitlab CI shell runner 【发布时间】:2016-08-05 18:39:49 【问题描述】:

我有一个在 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..."
...

【问题讨论】:

今天面临与您相同的问题,我发布了一个对我有用的答案。希望对您和其他人有所帮助 【参考方案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 提到他们已经尝试过退出代码和异常。

以上是关于如何在 Gitlab CI shell 运行器上构建失败的主要内容,如果未能解决你的问题,请参考以下文章

gitlab-ci 注册运行器 x509

gitlab-ci 运行器中具有不同到期时间的多条路径

Gitlab CI/CD 运行器:找不到 mvn 命令

如何为 GitLab CI 运行器启用 Maven 工件缓存?

以 shell 执行器和 docker 镜像为基础的 Gitlab CI

GitLab 多个运行器,交换工件