Jenkins中dotnet build失败不触发脚本报错及语法问题排查
解决Jenkins中dotnet build失败但构建仍标记成功的问题
原脚本的问题分析
1. 错误获取命令退出状态码
原脚本中用STATUS=$(dotnet build $SOLUTION -v m -o $BUILD_TARGET/${branch})试图获取构建状态,但$(...)捕获的是命令的输出内容,而非命令执行的退出状态码。即使dotnet build失败,STATUS变量存储的是错误日志文本,不是非0的状态码,导致后续! [ $STATUS -eq 0 ]的判断永远不成立,Jenkins无法触发失败逻辑。
2. 未处理变量为空的语法问题
后续修正时如果未给变量添加双引号,当STATUS变量为空(比如赋值逻辑错误),判断语句[ $STATUS -eq 0 ]会变成[ -eq 0 ],bash无法识别这种语法,就会抛出“[: -eq: unary operator expected”的错误,导致构建直接失败。
修正后的脚本
#!/bin/bash if [ -f "$SOLUTION" ]; then echo "Building ${branch} :" | tee msbuild.log # 将构建的标准输出和错误输出都写入日志,同时保留退出状态 dotnet build "$SOLUTION" -v m -o "$BUILD_TARGET/${branch}" 2>&1 | tee -a msbuild.log # 获取dotnet build的退出状态码 STATUS=$? # 双引号包裹变量,避免空值语法错误 if [ "$STATUS" -ne 0 ]; then echo "MSBuild failed" | tee -a msbuild.log exit 1 fi else echo "Cannot find solution: ${SOLUTION}!" | tee msbuild.log # 找不到解决方案时标记构建失败 exit 1 fi
关键改动说明
- 用
$?获取dotnet build的真实退出状态码,这是bash中获取上一个命令执行结果的标准方式。 - 给所有变量(如
$SOLUTION、$STATUS)添加双引号,避免变量为空时触发语法错误。 - 通过
2>&1将标准错误输出重定向到标准输出,确保错误信息也能被tee写入日志文件。 - 使用
tee -a追加日志,避免覆盖之前的输出内容。 - 新增找不到解决方案时的
exit 1,确保这种场景下Jenkins也能标记构建失败。
内容的提问来源于stack exchange,提问作者Aenye_Cerbin
相关产品推荐
相关产品推荐

