From 14cb6a87251b7053b1c2a67c43e7406d7f011856 Mon Sep 17 00:00:00 2001 From: Nikita Miazin Date: Wed, 9 Aug 2023 21:54:44 +0300 Subject: [PATCH 1/5] add MIMA checks to ensure binary compatibility across different versions --- build.sbt | 16 +++++++++++++--- project/MimaSettings.scala | 18 ++++++++++++++++++ project/plugins.sbt | 1 + 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 project/MimaSettings.scala diff --git a/build.sbt b/build.sbt index 810617b04..1f7d28c9b 100644 --- a/build.sbt +++ b/build.sbt @@ -1,4 +1,5 @@ import sbt.Def +import MimaSettings.mimaSettings lazy val kafkaVersion = "3.7.0" lazy val embeddedKafkaVersion = "3.7.0" // Should be the same as kafkaVersion, except for the patch part @@ -66,9 +67,10 @@ val excludeInferAny = { options: Seq[String] => options.filterNot(Set("-Xlint:in lazy val root = project .in(file(".")) .settings( - name := "zio-kafka", - publish / skip := true, - crossScalaVersions := Nil // https://www.scala-sbt.org/1.x/docs/Cross-Build.html#Cross+building+a+project+statefully + name := "zio-kafka", + publish / skip := true, + crossScalaVersions := Nil, // https://www.scala-sbt.org/1.x/docs/Cross-Build.html#Cross+building+a+project+statefully, + commands += lint ) .aggregate( zioKafka, @@ -104,6 +106,7 @@ lazy val zioKafka = .enablePlugins(BuildInfoPlugin) .settings(stdSettings("zio-kafka")) .settings(buildInfoSettings("zio.kafka")) + .settings(mimaSettings(failOnProblem = true)) .settings(enableZIO(enableStreaming = true)) .settings( libraryDependencies ++= Seq( @@ -126,6 +129,7 @@ lazy val zioKafkaTestkit = .dependsOn(zioKafka) .enablePlugins(BuildInfoPlugin) .settings(stdSettings("zio-kafka-testkit")) + .settings(mimaSettings(failOnProblem = false)) .settings( libraryDependencies ++= Seq( "dev.zio" %% "zio" % zioVersion.value, @@ -187,6 +191,7 @@ lazy val zioKafkaExample = addCommandAlias("fmt", "all scalafmtSbt scalafmt test:scalafmt") addCommandAlias("check", "all scalafmtSbtCheck scalafmtCheck test:scalafmtCheck") +addCommandAlias("mimaCheck", "+zioKafka/mimaReportBinaryIssues;+zioKafkaTestkit/mimaReportBinaryIssues") lazy val docs = project .in(file("zio-kafka-docs")) @@ -206,3 +211,8 @@ lazy val docs = project ) .enablePlugins(WebsitePlugin) .dependsOn(zioKafka, zioKafkaTestkit) + +lazy val lint = { + val defaultLint = zio.sbt.Commands.ComposableCommand.lint + defaultLint.copy(commandStrings = defaultLint.commandStrings :+ "mimaCheck").toCommand +} diff --git a/project/MimaSettings.scala b/project/MimaSettings.scala new file mode 100644 index 000000000..9252b1159 --- /dev/null +++ b/project/MimaSettings.scala @@ -0,0 +1,18 @@ +import com.typesafe.tools.mima.core.* +import com.typesafe.tools.mima.core.ProblemFilters.* +import com.typesafe.tools.mima.plugin.MimaKeys.* +import sbt.* +import sbt.Keys.{ name, organization } + +object MimaSettings { + lazy val bincompatVersionToCompare = "2.4.2" + + def mimaSettings(failOnProblem: Boolean) = + Seq( + mimaPreviousArtifacts := Set(organization.value %% name.value % bincompatVersionToCompare), + mimaBinaryIssueFilters ++= Seq( + exclude[Problem]("zio.kafka.consumer.internal.*") + ), + mimaFailOnProblem := failOnProblem + ) +} diff --git a/project/plugins.sbt b/project/plugins.sbt index b95081aa5..ecab40995 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -7,5 +7,6 @@ addSbtPlugin("dev.zio" % "zio-sbt-ci" % zioSbtVersion) addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.12.0") addSbtPlugin("org.typelevel" % "sbt-tpolecat" % "0.5.1") addSbtPlugin("com.github.sbt" % "sbt-native-packager" % "1.10.0") +addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.1.3") resolvers ++= Resolver.sonatypeOssRepos("public") From 33caba33480eeeb6bd9b341b79f2bab8a7f1b9f4 Mon Sep 17 00:00:00 2001 From: Erik van Oosten Date: Sat, 13 Apr 2024 16:09:17 +0200 Subject: [PATCH 2/5] Make mima check optional Also: use scala 3 syntax in sbt files. --- build.sbt | 15 +++++++++++++-- project/MimaSettings.scala | 24 +++++++++++++++--------- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index 1f7d28c9b..990c72a97 100644 --- a/build.sbt +++ b/build.sbt @@ -1,6 +1,16 @@ import sbt.Def import MimaSettings.mimaSettings +/** + * As of zio-kafka version 2.8.0 releases are binary compatible. This is checked with Mima. + * + * Keep this value set to the oldest minor release (with patch version set to "0") that is still binary compatible. + * + * Set this value to `None` when master is _not_ binary compatible with te last minor release, the next release shall + * increase the minor version. + */ +lazy val binCompatVersionToCompare = None // Some("2.8.0") + lazy val kafkaVersion = "3.7.0" lazy val embeddedKafkaVersion = "3.7.0" // Should be the same as kafkaVersion, except for the patch part @@ -106,7 +116,7 @@ lazy val zioKafka = .enablePlugins(BuildInfoPlugin) .settings(stdSettings("zio-kafka")) .settings(buildInfoSettings("zio.kafka")) - .settings(mimaSettings(failOnProblem = true)) + .settings(mimaSettings(binCompatVersionToCompare, failOnProblem = true)) .settings(enableZIO(enableStreaming = true)) .settings( libraryDependencies ++= Seq( @@ -129,7 +139,7 @@ lazy val zioKafkaTestkit = .dependsOn(zioKafka) .enablePlugins(BuildInfoPlugin) .settings(stdSettings("zio-kafka-testkit")) - .settings(mimaSettings(failOnProblem = false)) + .settings(mimaSettings(binCompatVersionToCompare, failOnProblem = false)) .settings( libraryDependencies ++= Seq( "dev.zio" %% "zio" % zioVersion.value, @@ -212,6 +222,7 @@ lazy val docs = project .enablePlugins(WebsitePlugin) .dependsOn(zioKafka, zioKafkaTestkit) +// Extend 'lint' with mimaCheck lazy val lint = { val defaultLint = zio.sbt.Commands.ComposableCommand.lint defaultLint.copy(commandStrings = defaultLint.commandStrings :+ "mimaCheck").toCommand diff --git a/project/MimaSettings.scala b/project/MimaSettings.scala index 9252b1159..6e6c1bdad 100644 --- a/project/MimaSettings.scala +++ b/project/MimaSettings.scala @@ -5,14 +5,20 @@ import sbt.* import sbt.Keys.{ name, organization } object MimaSettings { - lazy val bincompatVersionToCompare = "2.4.2" - def mimaSettings(failOnProblem: Boolean) = - Seq( - mimaPreviousArtifacts := Set(organization.value %% name.value % bincompatVersionToCompare), - mimaBinaryIssueFilters ++= Seq( - exclude[Problem]("zio.kafka.consumer.internal.*") - ), - mimaFailOnProblem := failOnProblem - ) + def mimaSettings(binCompatVersionToCompare: Option[String], failOnProblem: Boolean): Seq[Def.Setting[?]] = + binCompatVersionToCompare match { + case None => + Seq.empty + case Some(binCompatVersion) => + Seq( + mimaPreviousArtifacts := Set(organization.value %% name.value % binCompatVersion), + mimaBinaryIssueFilters ++= Seq( + exclude[Problem]("zio.kafka.consumer.internal.*") + ), + mimaFailOnProblem := failOnProblem + ) + + } + } From c8be86e07a73e362b40ac10bc3fb53863762dfab Mon Sep 17 00:00:00 2001 From: Erik van Oosten Date: Sat, 13 Apr 2024 17:04:49 +0200 Subject: [PATCH 3/5] Make mima check optional (fix) --- project/MimaSettings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/MimaSettings.scala b/project/MimaSettings.scala index 6e6c1bdad..170598da4 100644 --- a/project/MimaSettings.scala +++ b/project/MimaSettings.scala @@ -9,7 +9,7 @@ object MimaSettings { def mimaSettings(binCompatVersionToCompare: Option[String], failOnProblem: Boolean): Seq[Def.Setting[?]] = binCompatVersionToCompare match { case None => - Seq.empty + Seq(mimaFailOnProblem := false) case Some(binCompatVersion) => Seq( mimaPreviousArtifacts := Set(organization.value %% name.value % binCompatVersion), From 1549799c83df480f6b4bb53bcede126e4cee2d90 Mon Sep 17 00:00:00 2001 From: Erik van Oosten Date: Sat, 13 Apr 2024 17:09:36 +0200 Subject: [PATCH 4/5] Make mima check optional (fix 2) --- project/MimaSettings.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/MimaSettings.scala b/project/MimaSettings.scala index 170598da4..71cdbafe6 100644 --- a/project/MimaSettings.scala +++ b/project/MimaSettings.scala @@ -9,7 +9,7 @@ object MimaSettings { def mimaSettings(binCompatVersionToCompare: Option[String], failOnProblem: Boolean): Seq[Def.Setting[?]] = binCompatVersionToCompare match { case None => - Seq(mimaFailOnProblem := false) + Seq(mimaPreviousArtifacts := Set.empty) case Some(binCompatVersion) => Seq( mimaPreviousArtifacts := Set(organization.value %% name.value % binCompatVersion), From 22c5e46263884426d7fccf59b24d3bb820939d96 Mon Sep 17 00:00:00 2001 From: Erik van Oosten Date: Sat, 13 Apr 2024 17:53:39 +0200 Subject: [PATCH 5/5] Fix typo --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 990c72a97..590f260bc 100644 --- a/build.sbt +++ b/build.sbt @@ -6,7 +6,7 @@ import MimaSettings.mimaSettings * * Keep this value set to the oldest minor release (with patch version set to "0") that is still binary compatible. * - * Set this value to `None` when master is _not_ binary compatible with te last minor release, the next release shall + * Set this value to `None` when master is _not_ binary compatible with the latest minor release, the next release shall * increase the minor version. */ lazy val binCompatVersionToCompare = None // Some("2.8.0")