为什么同一命令在GitLab CI中失败? [英] Why same command fails in GitLab CI?
本文介绍了为什么同一命令在GitLab CI中失败?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
以下命令在终端上运行正常,但同一命令在GitLab CI中失败。
echo Hello >> foo.txt; cat foo.txt | grep "test"; [[ $? -eq 0 ]] && echo fail || echo success
返回为success
但GitLab配置项中的相同命令
$ echo Hello >> foo.txt; cat foo.txt | grep "test"; [[ $? -eq 0 ]] && echo fail || echo success
Cleaning up file based variables
ERROR: Job failed: command terminated with exit code 1
简直是失败了。我不知道为什么。
echo $SHELL
同时返回/bin/bash
。
推荐答案
问题来源
考虑到CI上下文中隐含的";set -e
,您观察到的行为非常标准。
更准确地说,您的代码包含三个复合命令:
echo Hello >> foo.txt
cat foo.txt | grep "test"
[[ $? -eq 0 ]] && echo fail || echo success
,grep "test"
命令返回非零退出代码(即1
)。因此,脚本将立即退出,并且不会执行最后一行。
请注意,此功能在配置项上下文中是典型的,因为如果某个中间命令在复杂脚本中失败,我们通常会希望获得失败,并避免运行下一个命令(如果出现错误,这些命令可能会偏离主题&q;)。
您也可以在本地复制它,例如,通过编写以下代码:
bash -e -c "
echo Hello >> foo.txt
cat foo.txt | grep "test"
[[ $? -eq 0 ]] && echo fail || echo success
"
,主要相当于:
bash -c "
set -e
echo Hello >> foo.txt
cat foo.txt | grep "test"
[[ $? -eq 0 ]] && echo fail || echo success
"
相关手册页
了解更多信息:
- 在
set -e
上,请参阅man 1 set
- 在
bash -e
上,请参阅man 1 bash
如何解决此问题?
您应该采用另一种措辞,避免[[ $? -eq 0 ]]
后验测试。因此,可能返回非零退出代码但不意味着失败的命令应该受到if
:的保护
echo Hello >> foo.txt
if cat foo.txt | grep "test"; then
echo fail
false # if ever you want to "trigger a failure manually" at some point.
else
echo success
fi
还要注意,grep "test" foo.txt
要比cat foo.txt | grep "test"
−更习惯用,后者恰恰是UUOC的一个实例(CAT的无用用法)。
这篇关于为什么同一命令在GitLab CI中失败?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文