如何在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
相关产品推荐
相关产品推荐

