diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f36b3a4b..02be0049 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,6 +43,23 @@ jobs: - name: Run unit tests run: sbt testUnit + mima: + runs-on: ubuntu-24.04 + steps: + - name: Checkout current branch + uses: actions/checkout@v6 + with: + fetch-depth: 0 + - name: Setup Scala and Java + uses: coursier/setup-action@v3 + with: + jvm: temurin:25 + apps: sbt + - name: Cache scala dependencies + uses: coursier/cache-action@v8 + - name: Check binary compatibility + run: sbt mima + docs: runs-on: ubuntu-24.04 steps: @@ -111,7 +128,7 @@ jobs: publish: runs-on: ubuntu-24.04 - needs: [lint, unit, integration] + needs: [lint, unit, mima, integration] if: github.event_name != 'pull_request' steps: - name: Checkout current branch diff --git a/build.sbt b/build.sbt index 29bafd84..24ac2660 100644 --- a/build.sbt +++ b/build.sbt @@ -77,6 +77,13 @@ addCommandAlias("itKyo", "integrationTestsKyo/test") addCommandAlias("exampleKyo", "examplesKyo/run") +addCommandAlias( + "mima", + "all core/mimaReportBinaryIssues opentelemetry/mimaReportBinaryIssues compatCe/mimaReportBinaryIssues " + + "clientZio/mimaReportBinaryIssues clientCe/mimaReportBinaryIssues clientOx/mimaReportBinaryIssues " + + "clientPekko/mimaReportBinaryIssues clientKyo/mimaReportBinaryIssues" +) + addCommandAlias( "docAll", "all core/doc opentelemetry/doc compatCe/doc clientZio/doc clientCe/doc clientOx/doc clientPekko/doc clientKyo/doc" @@ -96,6 +103,7 @@ lazy val root = project lazy val core = (projectMatrix in file("sage-core")) .settings(name := "sage-core") .settings(commonSettings) + .settings(mimaSettings) .settings(parallelUnitTests) .defaultAxes(VirtualAxis.jvm, VirtualAxis.scalaVersionAxis(scala3Version, scala3Version)) .customRow( @@ -109,6 +117,7 @@ lazy val opentelemetry = (projectMatrix in file("sage-opentelemetry")) .dependsOn(core) .settings(name := "sage-opentelemetry") .settings(commonSettings) + .settings(mimaSettings) .settings(parallelUnitTests) .settings( libraryDependencies ++= Seq( @@ -130,6 +139,7 @@ lazy val compatCe = project .in(file("sage-compat-ce")) .settings(name := "sage-compat-ce") .settings(commonSettings) + .settings(mimaSettings) .settings( libraryDependencies ++= Seq( "org.typelevel" %% "cats-effect" % catsEffectVersion, @@ -152,6 +162,7 @@ lazy val client = (projectMatrix in file("sage-client")) .enablePlugins(BuildInfoPlugin) .settings(name := "sage-client") .settings(commonSettings) + .settings(mimaSettings) .settings(parallelUnitTests) .settings( // compatLibrary emits an implicit Future anchor row; it's a compile-only baseline, never published @@ -279,6 +290,14 @@ lazy val commonSettings = Def.settings( Test / fork := true ) +lazy val mimaSettings = Def.settings( + // the unpublished Future anchor row has no previous release to compare against + mimaPreviousArtifacts := { + if (moduleName.value.endsWith("-future")) Set.empty + else previousStableVersion.value.map(organization.value %% moduleName.value % _).toSet + } +) + // Only for container-free cells: integration suites each boot their own container, so running them in // parallel would multiply peak load and invite timing races lazy val parallelUnitTests = Def.settings(Test / testForkedParallel := true) diff --git a/project/plugins.sbt b/project/plugins.sbt index b6cc8ee0..1e612efd 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -3,4 +3,5 @@ addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.11.0") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.13.2") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.6.2") addSbtPlugin("com.github.sbt" % "sbt-ci-release" % "1.12.1") +addSbtPlugin("com.typesafe" % "sbt-mima-plugin" % "1.2.1") addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.4.8")