如何在 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 运行器启用 Maven 工件缓存?