gitlab ci 脚本在哪个 $?允许为非零

Posted

技术标签:

【中文标题】gitlab ci 脚本在哪个 $?允许为非零【英文标题】:gitlab ci scripts during which $? is allowed to be non-zero 【发布时间】:2017-01-20 20:42:15 【问题描述】:

在我们的项目中,我们有一个 shell 脚本,用于为后续构建过程设置环境变量或运行构建的应用程序。

它包含一个检查已设置变量并进行一些调整的块。

# part of setup.sh
for LIBRARY in "$LIBRARIES_WE_NEED[@]"
do
  echo $LD_LIBRARY_PATH | \grep $LIBRARY > /dev/null
  if [ $? -ne 0 ]
  then
   echo Adding $LIBRARY
   LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIBRARY
  else
   echo Not adding $LIBRARY
  fi
done

即它检查库的路径是否已经在$LD_LIBRARY_PATH 中,如果没有,则添加它。 (公平地说,这可以写成不同的(like here),但假设脚本应该实现在不调用程序、检查$? 然后做一件事或做另一件事的情况下很难做到的事情)。

.gitlab-ci.yml 然后包含

before_script:
  - yum install -y <various packages>
  - source setup.sh

但是跑步者决定在 $? 非零的那一刻停止之前的脚本,即当 if 语句决定添加到 $LD_LIBRARY_PATH 的路径时。 现在很高兴 gitlab 运行程序在我脚本的每一行之后检查 $?,但是如果 .gitlab-ci.yml 中的行被认为是原子的,那就太好了。

有没有办法避免在源自.gitlab-ci.yml 的脚本中对$? 进行中间检查?

【问题讨论】:

如果您在没有任何其他线索的情况下获得ERROR: Job failed: Process exited with status 1,则此问题是相关的。为将来的搜索添加了评论。 【参考方案1】:

我使用的另一个技巧是一种特殊的“|| true”,结合访问之前的退出代码。

- exit_code=0
- ./myScript.sh || exit_code=$?
- if [ $exit_code -ne 0 ]; then echo "It failed!" ; else echo "It worked!"; fi

$exit_code=$?总是评估为“真”,所以你得到一个非失败的命令,但你也会收到 exit_code,你可以用它做任何你想做的事情。

请注意,您不应该跳过第一行,否则 exit_code 将未初始化(因为脚本成功运行后,or'ed 部分永远不会执行并且 if 最终会被执行)

if [ -ne 0 ];

而不是

if [ 0 -ne 0 ];

这会导致语法错误。

【讨论】:

【参考方案2】:

使用command_that_might_fail || true 屏蔽该命令的退出状态。

另外请注意,您可以使用grep -q 来阻止输出:

echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY" || true

不过,这也会掩盖您可能不想要的 $?。如果您想检查命令是否正确退出,您可以使用:

if echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY"; then
  echo "Adding $LIBRARY"
else
  ...
fi

我怀疑gitlab-ci 设置了-e,您可以使用set +e 禁用它:

set +e # Disable exit on error
for library in "$LIBRARIES_WE_NEED[@]"; do
  ...
done
set -e # Enable exit on error

未来阅读:Why double quotes matter 和 Pitfalls with set -e

【讨论】:

以上是关于gitlab ci 脚本在哪个 $?允许为非零的主要内容,如果未能解决你的问题,请参考以下文章

命令阶段脚本执行失败,退出代码为非零,反应原生 IOS

在 GitLab-ci Docker build 中执行外部 bash 脚本

将脚本附加到一个阶段 .gitlab-ci.yml

Gitlab-CI自动化打包之Runner配置和CI脚本说明

gitlab ci 不能在脚本中使用变量

GitLab CI/CD 脚本改进