Jenkins中需要多次执行某条报错指令的解决方案
问题描述: 最近使用arm官方提供的arm-ostl-linux-gnueabi-gcc
编译cmake工程时,发现需要执行三次cmake
才能编译成功,但将其部署到Jenkins中项目(使用pipeline)总是编译失败。
原因分析: Jenkins在执行shell脚本时加了-xe
参数
-x
:打印每一行执行到的命令-e
:当任何命令以非零值(当任何命令失败时)退出代码时,终止执行shell脚本
也就是说,只要指令执行报错,会返回一个非零值,检测到这个非零值,脚本就exit了
解决方案:
在需要报错继续执行的位置加入set +e
指令,之后为了能正常报错,再恢复原有错误退出机制,即使用set -e
指令。
-
set -e
: 执行的时候如果出现了返回值为非零,整个脚本 就会立即退出, 经常用于脚本的开头使用,在脚本开始的时候如果不能执行,那么脚本下面的就会退出 -
set +e
: 执行的时候如果出现了返回值为非零将会继续执行下面的脚本 , 在脚本会出现错的时候, 执行set +e , 当脚本出现有错的时候,继续执行下面的代码。
案例如下:
set +e #
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake ..
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake ..
set -e
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake ..
cmake --build .
但是我不想看前两条的报错信息,那么可以将终端输出流向一个文件:
set +e #
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake .. >NULL 2>&1
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake .. >NULL 2>&1
set -e
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE=../cmake/arm_linux_controller_debug.cmake ..
cmake --build .
嗯舒服了~
参考链接:
- https://blog.csdn.net/qq_28686911/article/details/115732506
- https://www.cnblogs.com/edgar-xie/p/13890883.html