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

pse*_*ert 12 bash gitlab-ci

在我们的项目中,我们有一个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
Run Code Online (Sandbox Code Playgroud)

即它检查库的路径是否已经存在$LD_LIBRARY_PATH,如果没有,则添加它.(公平地说,这可能是不同的写入(喜欢这里),但假设脚本应该实现的东西,这是非常难做到不调用程序,检查$?,然后要么做一件事或做另一件事).

.gitlab-ci.yml则包含

before_script:
  - yum install -y <various packages>
  - source setup.sh
Run Code Online (Sandbox Code Playgroud)

但是$?,当if-statement决定添加路径时,运行器决定停止前脚本的非零时刻$LD_LIBRARY_PATH.现在很高兴gitlab运行器检查$?我的脚本的每一行之后,但是如果这些行.gitlab-ci.yml被认为是原子的,那就太好了.

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

and*_*lrc 27

使用command_that_might_fail || true来掩盖所述命令的退出状态.

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

echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY" || true
Run Code Online (Sandbox Code Playgroud)

然而,这也会掩盖$?你可能不想要的东西.如果要检查命令是否退出正确,可以使用:

if echo "$LD_LIBRARY_PATH" | grep -q "$LIBRARY"; then
  echo "Adding $LIBRARY"
else
  ...
fi
Run Code Online (Sandbox Code Playgroud)

我怀疑你可以禁用的gitlab-ci套装:-eset +e

set +e # Disable exit on error
for library in "${LIBRARIES_WE_NEED[@]}"; do
  ...
done
set -e # Enable exit on error
Run Code Online (Sandbox Code Playgroud)

未来阅读:为什么双引号很重要陷阱set -e


Mar*_* K. 7

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

- exit_code=0
- ./myScript.sh || $exit_code=$?
- if [ ${exit_code} -ne 0 ]; then echo "It failed!" ; else echo "It worked!"; fi
Run Code Online (Sandbox Code Playgroud)

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

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

if [ -ne 0 ];
Run Code Online (Sandbox Code Playgroud)

代替

if [ 0 -ne 0 ];
Run Code Online (Sandbox Code Playgroud)

这会导致语法错误。

  • 请养成习惯,始终将参数扩展括在双引号中: `[ "$exit_status" -ne 0 ]` 如果参数为空,它将扩展为 `[` 命令的空参数,而不是消失。它还可以防止分词和路径名扩展。 (2认同)