gitlab ci 脚本在哪个 $?允许为非零
gitlab ci scripts during which $? is allowed to be non-zero
在我们的项目中,我们有一个 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
但是 运行ner 决定在 $?
非零的那一刻停止之前的脚本,即当 if 语句决定添加到 $LD_LIBRARY_PATH
的路径时。
现在很高兴 gitlab 运行ner 在我的脚本的每一行之后检查 $?
,但是如果 .gitlab-ci.yml
中的行被认为是原子的,那就太好了。
有没有办法避免在 .gitlab-ci.yml
中的脚本中对 $?
进行中间检查?
使用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
我使用的另一个技巧是一种特殊的“|| 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 ];
这会导致语法错误。
在我们的项目中,我们有一个 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
但是 运行ner 决定在 $?
非零的那一刻停止之前的脚本,即当 if 语句决定添加到 $LD_LIBRARY_PATH
的路径时。
现在很高兴 gitlab 运行ner 在我的脚本的每一行之后检查 $?
,但是如果 .gitlab-ci.yml
中的行被认为是原子的,那就太好了。
有没有办法避免在 .gitlab-ci.yml
中的脚本中对 $?
进行中间检查?
使用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
我使用的另一个技巧是一种特殊的“|| 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 ];
这会导致语法错误。