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

如何在GitHub Action中重试因Java异常失败的SonarQube扫描步骤?

实现SonarQube扫描步骤的失败重试方案

直接在GitHub Action的步骤里用bash循环实现重试逻辑,核心是捕获扫描命令的错误状态,不让它直接终止整个shell进程,同时控制重试次数和间隔时间。

以下是完整的示例配置:

jobs:
  sonar-scan:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      # 其他前置步骤(比如构建、依赖安装等)

      - name: Run SonarQube Scanner with retry
        run: |
          # 设置重试次数和间隔时间(单位:秒)
          MAX_RETRIES=3
          RETRY_INTERVAL=10
          CURRENT_RETRY=0

          while [ $CURRENT_RETRY -lt $MAX_RETRIES ]; do
            echo "SonarQube扫描尝试 $((CURRENT_RETRY + 1))/$MAX_RETRIES"
            # 替换成你实际的SonarQube扫描命令
            sonar-scanner -Dsonar.projectKey=your-project-key -Dsonar.sources=.

            # 检查命令执行状态
            if [ $? -eq 0 ]; then
              echo "扫描成功"
              exit 0
            fi

            CURRENT_RETRY=$((CURRENT_RETRY + 1))
            if [ $CURRENT_RETRY -lt $MAX_RETRIES ]; then
              echo "扫描失败,$RETRY_INTERVAL秒后重试..."
              sleep $RETRY_INTERVAL
            fi
          done

          # 所有重试都失败,标记步骤为失败
          echo "所有重试尝试均失败,终止步骤"
          exit 1
        env:
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
          SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}

关键细节说明

  • 错误状态捕获:通过$?获取扫描命令的退出码,0表示成功,非0表示失败。即使扫描抛出Java异常退出,shell只会记录状态码,不会终止循环。
  • 重试参数自定义:MAX_RETRIES设置最大重试次数,RETRY_INTERVAL设置两次重试的间隔,给网络或SonarQube服务留恢复时间。
  • 最终状态控制:所有重试失败后执行exit 1,让GitHub Action步骤标记为失败,符合流水线的状态逻辑。

解决你之前循环失效的问题

你之前的循环失效,大概率是因为扫描命令触发了shell的set -e(部分场景下GitHub Action会默认开启“命令失败即退出shell”的行为)。如果是这个原因,可以在循环前加上set +e关闭该行为,循环结束后再恢复set -e:

set +e # 关闭命令失败即退出的默认行为
# 循环逻辑...
set -e # 恢复默认行为

不过上面的示例无需额外添加这段代码,因为我们已经通过$?手动处理了错误状态,即使set -e开启,也不会终止循环。

内容的提问来源于stack exchange,提问作者parsley72

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 16:11:02