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

时间:2016-09-13 09:38:27

标签: 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

即。它检查库的路径是否已经在$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进行中间检查?

2 个答案:

答案 0 :(得分:22)

使用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禁用{/ 1}}:

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

未来阅读:Why double quotes matterPitfalls with set -e

答案 1 :(得分:2)

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

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

$exit_code=$?始终评估为“true”,因此您会收到一个不会失败的命令,但您也会收到 exit_code,您可以用它做任何想做的事情。

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

if [ -ne 0 ];

代替

if [ 0 -ne 0 ];

导致语法错误。