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

sbt跨版本构建如何避免首次失败即终止,完成全版本兼容检测

sbt跨版本测试跳过失败版本获取完整兼容矩阵方案

方案1:使用sbt内置keep-going参数

sbt提供--keep-going(简写-k)全局参数,任务执行遇到失败时不会立即终止进程,会继续执行所有不依赖失败任务的剩余任务,跨版本测试的每个Scala版本的测试任务互相独立,直接执行如下命令即可跑完所有版本:

sbt -k +test

执行完成后会在日志末尾汇总所有失败的任务信息,你可以直接从日志里提取各版本的兼容情况。

方案2:自定义sbt任务实现结果汇总

如果需要更清晰的版本兼容结果汇总,可以在build.sbt中添加自定义任务,单独处理每个版本的测试执行和结果捕获:

val testAllCrossVersions = taskKey[Unit]("Run test for all cross Scala versions, continue on failure and output result matrix")
testAllCrossVersions := {
  val log = streams.value.log
  val crossVersions = crossScalaVersions.value
  val testResults = crossVersions.map { scalaVer =>
    try {
      val currentState = Project.extract(state.value).appendWithoutSession(
        List(scalaVersion := scalaVer),
        state.value
      )
      Project.runTask(Test / test, currentState) match {
        case Some((_, Value(_))) =>
          log.info(s"Scala $scalaVer: 测试通过")
          scalaVer -> true
        case _ =>
          log.error(s"Scala $scalaVer: 测试失败")
          scalaVer -> false
      }
    } catch {
      case e: Exception =>
        log.error(s"Scala $scalaVer: 测试异常,错误信息:${e.getMessage}")
        scalaVer -> false
    }
  }
  // 打印最终汇总矩阵
  log.info("\n=== 跨Scala版本测试结果汇总 ===")
  testResults.foreach { case (v, isPass) =>
    log.info(s"$v: ${if (isPass) "✅ 兼容" else "❌ 不兼容"}")
  }
  // 若需要CI任务最终返回成功状态(即使有版本失败),可注释下方抛出异常的代码
  val failedCount = testResults.count(!_._2)
  if (failedCount > 0) {
    throw new MessageOnlyException(s"共${failedCount}个Scala版本测试不兼容")
  }
}

添加完成后执行sbt testAllCrossVersions即可直接得到格式化的兼容矩阵结果。

方案3:GitHub Actions矩阵构建(适配你的CI环境)

针对你使用GitHub Actions作为CI的场景,使用CI矩阵构建会比sbt单进程跑所有版本更稳定,且天然支持并行执行、失败不中断其他任务,配置示例如下:

  1. 在项目中新建.github/workflows/cross-test.yml文件,写入以下内容:
name: 跨Scala版本兼容性测试
on: [push, pull_request]
jobs:
  compatibility-test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false # 核心配置:单个版本失败不终止其余版本的测试任务
      matrix:
        scala-version: [
          "2.13.4",
          "2.13.3",
          "2.13.2",
          "2.13.1",
          "2.12.6",
          "2.12.7",
          "2.12.8",
          "2.12.9",
          "2.12.10",
          "2.12.11",
          "2.12.12",
          "2.12.13",
          "2.12.14"
        ]
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      - name: 配置Java环境
        uses: actions/setup-java@v4
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: 执行对应Scala版本测试
        run: sbt "++${{ matrix.scala-version }} test"

配置提交后,GitHub Actions会为每个Scala版本启动独立的测试任务,所有任务执行完成后,可直接在CI详情页看到每个版本的执行结果,形成可视化的兼容矩阵。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 21:24:03