GitLab流水线未捕获测试错误,如何使其在测试失败时终止?
解决GitLab流水线测试失败后不终止执行的问题
问题原因
你的feature.sh已添加set -e(命令失败时终止脚本),但测试失败后流程仍继续,核心原因是**test-all.sh中的vitest命令未正确返回非零退出码**,或是脚本内部存在捕获错误并吞掉退出信号的逻辑,导致set -e无法触发终止。
修复方案
1. 确保vitest返回正确退出码
vitest默认在测试失败时返回非零退出码,但如果test-all.sh中存在错误的命令处理逻辑(如下例),会覆盖退出码:
# 错误示例:吞掉vitest的失败信号 vitest || echo "测试执行失败"
需改为直接调用vitest,不捕获错误:
# 正确写法:让vitest的退出码直接传递 npx vitest # 若使用package.json脚本,直接调用npm run test(确保test命令指向vitest) npm run test
2. 移除test-all.sh中的错误抑制逻辑
检查test-all.sh是否存在set +e(关闭错误终止)、错误捕获语句,这类代码会导致set -e失效:
# 错误示例:关闭了错误终止机制 set +e vitest set -e
删除此类代码,保证测试失败时vitest的非零退出码能直接传递到上层脚本。
3. 本地验证退出码传递
在本地执行test-all.sh后,查看退出码确认是否正确传递:
./test-all.sh echo $? # 测试失败时应返回非零值(如1)
若返回0,说明脚本未正确传递vitest的退出码,需调整test-all.sh逻辑。
4. 备选:手动检查退出码
若不想修改test-all.sh,可在feature.sh中手动校验测试命令的退出码:
#!/bin/bash set -e ./install-dependencies-stats-all.sh # 执行测试并捕获退出码 ./test-all.sh TEST_EXIT_CODE=$? if [ $TEST_EXIT_CODE -ne 0 ]; then exit $TEST_EXIT_CODE fi ./build-all-dev.sh
验证
修改完成后,重新触发GitLab流水线,当测试失败时,流水线会在测试步骤后立即终止,不会继续执行后续的构建步骤。
内容的提问来源于stack exchange,提问作者Gleb Galkin
相关产品推荐
相关产品推荐

