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单进程跑所有版本更稳定,且天然支持并行执行、失败不中断其他任务,配置示例如下:
- 在项目中新建
.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
相关产品推荐
相关产品推荐

