Skip to content

Commit

Permalink
build: configure mima binary checks (#756)
Browse files Browse the repository at this point in the history
Maintaining binary compatibility will be an important aspect once we
reach `1.0`. This PR introduces
[mima](https://github.com/lightbend-labs/mima) but configured to only
produce warnings for now. I'm planning to keep an eye on it to have a
better understanding of what will take to maintain binary compatibility
and identify patterns we could follow to make the process easier. We
should eventually also adopt
[tasty-mima](https://github.com/scalacenter/tasty-mima) but I couldn't
find a way to make it only warn of issues.
  • Loading branch information
fwbrasil authored Oct 14, 2024
1 parent c53e7f2 commit 97ed92d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 3 deletions.
39 changes: 36 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import org.scalajs.jsenv.nodejs.*
import org.typelevel.scalacoptions.ScalacOption
import org.typelevel.scalacoptions.ScalacOptions
import org.typelevel.scalacoptions.ScalaVersion
import sbtdynver.DynVerPlugin.autoImport.*

val scala3Version = "3.5.1"
val scala212Version = "2.12.20"
Expand Down Expand Up @@ -78,6 +79,7 @@ lazy val kyoJVM = project
name := "kyoJVM",
`kyo-settings`
)
.disablePlugins(MimaPlugin)
.aggregate(
`kyo-scheduler`.jvm,
`kyo-scheduler-zio`.jvm,
Expand Down Expand Up @@ -105,6 +107,7 @@ lazy val kyoJS = project
name := "kyoJS",
`kyo-settings`
)
.disablePlugins(MimaPlugin)
.aggregate(
`kyo-scheduler`.js,
`kyo-data`.js,
Expand All @@ -125,6 +128,7 @@ lazy val kyoNative = project
name := "kyoNative",
`kyo-settings`
)
.disablePlugins(MimaPlugin)
.aggregate(
`kyo-data`.native,
`kyo-prelude`.native
Expand All @@ -143,6 +147,7 @@ lazy val `kyo-scheduler` =
libraryDependencies += "org.scalatest" %%% "scalatest" % scalaTestVersion % Test,
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.5.10" % Test
)
.jvmSettings(mimaCheck(false))
.jsSettings(
`js-settings`,
libraryDependencies += "org.scala-js" %%% "scala-js-macrotask-executor" % "1.1.1"
Expand All @@ -157,6 +162,7 @@ lazy val `kyo-scheduler-zio` = sbtcrossproject.CrossProject("kyo-scheduler-zio",
libraryDependencies += "dev.zio" %%% "zio" % zioVersion,
libraryDependencies += "org.scalatest" %%% "scalatest" % scalaTestVersion % Test
)
.jvmSettings(mimaCheck(false))
.settings(
scalacOptions ++= scalacOptionToken(ScalacOptions.source3).value,
crossScalaVersions := List(scala3Version, scala212Version, scala213Version)
Expand All @@ -173,6 +179,7 @@ lazy val `kyo-data` =
libraryDependencies += "org.scalatest" %%% "scalatest" % scalaTestVersion % Test,
libraryDependencies += "dev.zio" %%% "izumi-reflect" % "2.3.10" % Test
)
.jvmSettings(mimaCheck(false))
.nativeSettings(`native-settings`)
.jsSettings(`js-settings`)

Expand All @@ -190,6 +197,7 @@ lazy val `kyo-prelude` =
libraryDependencies += "dev.zio" %%% "zio-test-sbt" % zioVersion % Test,
libraryDependencies += "org.javassist" % "javassist" % "3.30.2-GA" % Test
)
.jvmSettings(mimaCheck(false))
.nativeSettings(`native-settings`)
.jsSettings(`js-settings`)

Expand All @@ -210,6 +218,7 @@ lazy val `kyo-core` =
libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.5.10" % Test,
libraryDependencies += "org.javassist" % "javassist" % "3.30.2-GA" % Test
)
.jvmSettings(mimaCheck(false))
.jsSettings(`js-settings`)

lazy val `kyo-direct` =
Expand All @@ -222,6 +231,7 @@ lazy val `kyo-direct` =
`kyo-settings`,
libraryDependencies += "com.github.rssh" %%% "dotty-cps-async" % "0.9.22"
)
.jvmSettings(mimaCheck(false))
.jsSettings(`js-settings`)

lazy val `kyo-stats-registry` =
Expand All @@ -236,6 +246,7 @@ lazy val `kyo-stats-registry` =
libraryDependencies += "org.scalatest" %%% "scalatest" % scalaTestVersion % Test,
crossScalaVersions := List(scala3Version, scala212Version, scala213Version)
)
.jvmSettings(mimaCheck(false))
.jsSettings(`js-settings`)

lazy val `kyo-stats-otel` =
Expand All @@ -250,6 +261,7 @@ lazy val `kyo-stats-otel` =
libraryDependencies += "io.opentelemetry" % "opentelemetry-sdk" % "1.43.0" % Test,
libraryDependencies += "io.opentelemetry" % "opentelemetry-exporters-inmemory" % "0.9.1" % Test
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-cache` =
crossProject(JVMPlatform)
Expand All @@ -261,6 +273,7 @@ lazy val `kyo-cache` =
`kyo-settings`,
libraryDependencies += "com.github.ben-manes.caffeine" % "caffeine" % "3.1.8"
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-sttp` =
crossProject(JSPlatform, JVMPlatform)
Expand All @@ -273,6 +286,7 @@ lazy val `kyo-sttp` =
libraryDependencies += "com.softwaremill.sttp.client3" %%% "core" % "3.10.0"
)
.jsSettings(`js-settings`)
.jvmSettings(mimaCheck(false))

lazy val `kyo-tapir` =
crossProject(JVMPlatform)
Expand All @@ -286,6 +300,7 @@ lazy val `kyo-tapir` =
libraryDependencies += "com.softwaremill.sttp.tapir" %% "tapir-core" % "1.11.7",
libraryDependencies += "com.softwaremill.sttp.tapir" %% "tapir-netty-server" % "1.11.7"
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-caliban` =
crossProject(JVMPlatform)
Expand All @@ -301,6 +316,7 @@ lazy val `kyo-caliban` =
libraryDependencies += "com.github.ghostdogpr" %% "caliban" % "2.9.0",
libraryDependencies += "com.github.ghostdogpr" %% "caliban-tapir" % "2.9.0"
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-test` =
crossProject(JVMPlatform, JSPlatform)
Expand All @@ -314,9 +330,11 @@ lazy val `kyo-test` =
libraryDependencies += "dev.zio" %%% "zio" % zioVersion,
libraryDependencies += "dev.zio" %%% "zio-test" % zioVersion,
libraryDependencies += "dev.zio" %%% "zio-test-sbt" % zioVersion % Test
).jsSettings(
)
.jsSettings(
`js-settings`
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-zio` =
crossProject(JVMPlatform, JSPlatform)
Expand All @@ -329,9 +347,11 @@ lazy val `kyo-zio` =
libraryDependencies += "dev.zio" %%% "zio" % zioVersion,
libraryDependencies += "dev.zio" %%% "zio-test" % zioVersion,
libraryDependencies += "dev.zio" %%% "zio-test-sbt" % zioVersion % Test
).jsSettings(
)
.jsSettings(
`js-settings`
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-cats` =
crossProject(JSPlatform, JVMPlatform)
Expand All @@ -342,9 +362,11 @@ lazy val `kyo-cats` =
.settings(
`kyo-settings`,
libraryDependencies += "org.typelevel" %%% "cats-effect" % catsVersion
).jsSettings(
)
.jsSettings(
`js-settings`
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-combinators` =
crossProject(JSPlatform, JVMPlatform)
Expand All @@ -356,6 +378,7 @@ lazy val `kyo-combinators` =
`kyo-settings`
)
.jsSettings(`js-settings`)
.jvmSettings(mimaCheck(false))

lazy val `kyo-examples` =
crossProject(JVMPlatform)
Expand All @@ -365,6 +388,7 @@ lazy val `kyo-examples` =
.dependsOn(`kyo-tapir`)
.dependsOn(`kyo-direct`)
.dependsOn(`kyo-core`)
.disablePlugins(MimaPlugin)
.settings(
`kyo-settings`,
fork := true,
Expand All @@ -377,6 +401,7 @@ lazy val `kyo-examples` =
Compile / doc / sources := Seq.empty,
libraryDependencies += "com.softwaremill.sttp.tapir" %% "tapir-json-zio" % "1.11.7"
)
.jvmSettings(mimaCheck(false))

lazy val `kyo-bench` =
crossProject(JVMPlatform)
Expand All @@ -387,6 +412,7 @@ lazy val `kyo-bench` =
.dependsOn(`kyo-core`)
.dependsOn(`kyo-sttp`)
.dependsOn(`kyo-scheduler-zio`)
.disablePlugins(MimaPlugin)
.settings(
`kyo-settings`,
Test / testForkedParallel := true,
Expand Down Expand Up @@ -492,3 +518,10 @@ def scalacOptionTokens(proposedScalacOptions: Set[ScalacOption]) = Def.setting {
val version = ScalaVersion.fromString(scalaVersion.value).right.get
ScalacOptions.tokensForVersion(version, proposedScalacOptions)
}

def mimaCheck(failOnProblem: Boolean) =
Seq(
mimaPreviousArtifacts ++= previousStableVersion.value.map(organization.value %% name.value % _).toSet,
mimaBinaryIssueFilters ++= Seq(),
mimaFailOnProblem := failOnProblem
)
2 changes: 2 additions & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.6.1")

addSbtPlugin("org.scoverage" % "sbt-scoverage" % "2.2.1")

addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.4")

// addSbtPlugin("com.gradle" % "sbt-develocity" % "1.0.1")

// addSbtPlugin("com.github.sbt" % "sbt-jacoco" % "3.4.0")
Expand Down

0 comments on commit 97ed92d

Please sign in to comment.