如何在Gitlab CI shell runner中使构建失败

53

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

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 runner应该使构建失败而不是继续执行下一步?

输出:

...
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..."
...

今天我遇到了和你一样的问题,我发表了一个对我有效的答案。希望它能帮助你和其他人。 - Ala Eddine JEBALI
2个回答

91
如果流水线作业以除0之外的代码退出,则该作业失败,导致流水线中所有后续作业被跳过。可以使用allow_failure作业关键字在每个作业上更改此行为。要强制使作业失败,您需要人为地以除0之外的代码退出作业。以下是一个gitlab-ci.yml作业示例:
some-example-job:
  script:
    - # ....
    - exit 1

enter image description here

请查看GitLab CI界面截图示例。第三个作业已失败。

enter image description here

在相反的情况下,删除exit 0,如果其余的script部分命令没有退出代码不是0,则您的作业将成功。
现在查看所有作业和整个管道已成功完成。enter image description here

enter image description here


1
这是正确的,除了after_script作业部分,其中exit 1不会使作业失败。 - Nicolas Pepinster
2
这是因为 after_script 中的错误不会导致作业失败;这就是 after_script 的目的之一。 - Jonathan
1
有没有办法在某些情况下“跳过构建”? - Ankur Loriya
如果执行脚本返回退出码1,它仍然会使作业失败吗? - Henadzi Rabkin

2
您的 StatusTest.exe 必须返回一个信号1、0或-1作为状态码,并在您的应用程序中实现。否则,运行程序将无法通知您的应用程序是否失败。几乎每种编程语言都有返回状态码的方法。
C#: 参考链接 Java: System.exit(exitCode) # exitCode = 1 or 0 or -1 等等。
也许尝试不要抛出异常,只返回一个状态码。

OP提到他们已经尝试过退出代码和异常。 - Guney Ozsan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接