为什么同一命令在GitLab CI中失败? [英] Why same command fails in GitLab CI?

查看:52
本文介绍了为什么同一命令在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 
"

相关手册页

了解更多信息:

如何解决此问题?

您应该采用另一种措辞,避免[[ $? -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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆