You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 12:40:33