![Jenkins 执行 shell 返回值 命令 vs 文件](https://linux22.com/image/709073/Jenkins%20%E6%89%A7%E8%A1%8C%20shell%20%E8%BF%94%E5%9B%9E%E5%80%BC%20%E5%91%BD%E4%BB%A4%20vs%20%E6%96%87%E4%BB%B6.png)
我在 Jenkins 中使用了Execute shell
一组不同的命令(调用newman
测试应用程序)。当其中一个测试用例失败时newman
,我的构建被标记为失败。
以前的Execute shell
newman run ./test/postman_collection_1.json --environment ./test/postman_environment.json --bail
newman run ./test/postman_collection_2.json --environment ./test/postman_environment.json --bail
由于我将所有这些命令移至一个脚本文件,并使用“执行 shell”来执行该脚本文件(它们是之前直接在“执行 shell”中的命令的副本),所以当其中一个 newman 测试用例失败时,我的构建不再标记为失败。
新的Execute shell
:
chmod +x ./docs/ci_tests.sh
./docs/ci_tests.sh
内容ci_tests.sh
:
#!/bin/bash
newman run ./test/postman_collection_1.json --environment ./test/postman_environment.json --bail
newman run ./test/postman_collection_2.json --environment ./test/postman_environment.json --bail
当我通过文件使用命令时,命令的返回值(newman
)没有触发 Jenkins 失败,原因是什么?
答案1
您必须将 shell 环境设置为在测试失败时退出set -e
-e 当此选项处于打开状态时,当任何命令失败时(由于 Shell 错误后果中列出的任何原因或返回大于零的退出状态),shell 将立即退出,就像通过执行不带参数的 exit 特殊内置实用程序一样,但以下情况除外:多命令管道中任何单个命令的失败不会导致 shell 退出。只应考虑管道本身的失败。
执行 while、until、if 或 elif 保留字之后的复合列表、以 ! 保留字开头的管道或除最后一个之外的任何 AND-OR 列表的命令时,应忽略 -e 设置。
如果除子 shell 命令之外的复合命令的退出状态是由于 -e 被忽略时发生故障而导致的,则 -e 不适用于此命令。
您可以在以下位置找到有关 bash 选项的更多信息set - 设置或取消设置选项和位置参数
所以你的 bash 脚本应该变成
#!/bin/bash
set -e
newman run ./test/postman_collection_1.json --environment ./test/postman_environment.json --bail
newman run ./test/postman_collection_2.json --environment ./test/postman_environment.json --bail