From 8f20c28f2c3fa024021b0dc92bdd4d5c8d6a10cd Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 12:26:37 +0100 Subject: [PATCH 1/7] Migrate build.sbt to sbt-projectmatrix --- build.sbt | 54 ++++++++++++++++++++++++++++++++++++--------- project/plugins.sbt | 1 + 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/build.sbt b/build.sbt index abfe3ea..f527995 100644 --- a/build.sbt +++ b/build.sbt @@ -13,10 +13,12 @@ val isScala3 = Def.setting { scalaVersion.value.startsWith("3") } +val mainScalaVersion = scala213 +val jvmScalaVersions = Seq(scala213, scala3) + inThisBuild( List( - scalaVersion := scala213, - crossScalaVersions := Seq(scala213, scala3), + scalaVersion := mainScalaVersion, organization := "com.github.jatcwang", homepage := Some(url("https://github.com/jatcwang/difflicious")), licenses := List("Apache-2.0" -> url("http://www.apache.org/licenses/LICENSE-2.0")), @@ -31,13 +33,18 @@ inThisBuild( ), ) +lazy val crossModules = List(core, coretest, munit, scalatest, weaver, cats, benchmarks) + lazy val difflicious = Project("difflicious", file(".")) - .aggregate(core, coretest, benchmarks, cats, docs, munit, scalatest, weaver) + .aggregate(docs) + .aggregate(crossModules.flatMap(_.projectRefs): _*) .settings(commonSettings, noPublishSettings) -lazy val core = Project("difflicious-core", file("modules/core")) +lazy val core = projectMatrix + .in(file("modules/core")) .settings(commonSettings) .settings( + name := "difflicious-core", libraryDependencies ++= Seq( "dev.zio" %% "izumi-reflect" % "2.3.8", "com.lihaoyi" %% "fansi" % "0.4.0", @@ -54,38 +61,50 @@ lazy val core = Project("difflicious-core", file("modules/core")) Seq(file) }.taskValue, ) + .jvmPlatform(jvmScalaVersions) -lazy val munit = Project("difflicious-munit", file("modules/munit")) +lazy val munit = projectMatrix + .in(file("modules/munit")) .dependsOn(core) .settings(commonSettings) .settings( + name := "difflicious-munit", libraryDependencies ++= Seq( "org.scalameta" %% "munit" % munitVersion, ), ) + .jvmPlatform(jvmScalaVersions) -lazy val scalatest = Project("difflicious-scalatest", file("modules/scalatest")) +lazy val scalatest = projectMatrix + .in(file("modules/scalatest")) .dependsOn(core) .settings(commonSettings) .settings( + name := "difflicious-scalatest", libraryDependencies ++= Seq( "org.scalatest" %% "scalatest-core" % scalatestVersion, ), ) + .jvmPlatform(jvmScalaVersions) -lazy val weaver = Project("difflicious-weaver", file("modules/weaver")) +lazy val weaver = projectMatrix + .in(file("modules/weaver")) .dependsOn(core) .settings(commonSettings) .settings( + name := "difflicious-weaver", libraryDependencies ++= Seq( "com.disneystreaming" %% "weaver-core" % weaverVersion, ), ) + .jvmPlatform(jvmScalaVersions) -lazy val cats = Project("difflicious-cats", file("modules/cats")) +lazy val cats = projectMatrix + .in(file("modules/cats")) .dependsOn(core, coretest % "test->test") .settings(commonSettings) .settings( + name := "difflicious-cats", libraryDependencies ++= Seq( "org.typelevel" %% "cats-core" % catsVersion, ), @@ -93,11 +112,14 @@ lazy val cats = Project("difflicious-cats", file("modules/cats")) "org.typelevel" %% "cats-laws" % catsVersion, ).map(_ % Test), ) + .jvmPlatform(jvmScalaVersions) -lazy val coretest = Project("coretest", file("modules/coretest")) +lazy val coretest = projectMatrix + .in(file("modules/coretest")) .dependsOn(core) .settings(commonSettings, noPublishSettings) .settings( + name := "coretest", libraryDependencies ++= Seq( "org.typelevel" %% "cats-core" % catsVersion, ), @@ -107,9 +129,17 @@ lazy val coretest = Project("coretest", file("modules/coretest")) "org.scalameta" %% "munit-scalacheck" % munitVersion, ).map(_ % Test), ) + .jvmPlatform(jvmScalaVersions) lazy val docs: Project = project - .dependsOn(core, coretest, cats, munit, scalatest, weaver) + .dependsOn( + core.jvm(mainScalaVersion), + coretest.jvm(mainScalaVersion), + cats.jvm(mainScalaVersion), + munit.jvm(mainScalaVersion), + scalatest.jvm(mainScalaVersion), + weaver.jvm(mainScalaVersion), + ) .enablePlugins(MicrositesPlugin) .settings( commonSettings, @@ -158,11 +188,13 @@ lazy val docs: Project = project }, ) -lazy val benchmarks = Project("benchmarks", file("modules/benchmarks")) +lazy val benchmarks = projectMatrix + .in(file("modules/benchmarks")) .dependsOn(coretest) .enablePlugins(JmhPlugin) .settings(commonSettings) .settings(noPublishSettings) + .jvmPlatform(jvmScalaVersions) lazy val commonSettings = Seq( scalacOptions --= { diff --git a/project/plugins.sbt b/project/plugins.sbt index 72aa07a..138196f 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -6,3 +6,4 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.47deg" % "sbt-microsites" % "1.3.4") addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.15.0") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.0") // override mdoc version from microsite +addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1") From befbfd82a61dc0b7321ec3026419858b4304c4c2 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 13:38:44 +0100 Subject: [PATCH 2/7] Use trick with scoped commands --- .github/workflows/ci.yml | 49 ++++++++++++++++++++---------- build.sbt | 65 ++++++++++++++++++++++++++++++++-------- 2 files changed, 87 insertions(+), 27 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 08d7269..ac29715 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,9 +9,9 @@ name: Continuous Integration on: pull_request: - branches: ['**'] + branches: ["**"] push: - branches: ['**'] + branches: ["**"] tags: [v*] env: @@ -23,8 +23,11 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [2.13.11, 3.3.0] + scalaVersion: [2_13, 3_0] + scalaPlatform: [jvm] java: [temurin@11] + env: + BUILD_KEY: ${{matrix.scalaVersion}}_${{matrix.scalaPlatform}} runs-on: ${{ matrix.os }} steps: - name: Checkout current branch (full) @@ -49,18 +52,33 @@ jobs: run: gem install jekyll -v 4.1.1 - name: Check that workflows are up to date - run: sbt '++ ${{ matrix.scala }}' githubWorkflowCheck + if: matrix.scalaVersion == '2_13' && matrix.scalaPlatform == 'jvm' + run: sbt githubWorkflowCheck - - name: Build project - run: sbt '++ ${{ matrix.scala }}' test makeMicrosite publishLocal + - name: Build project & publish locally + run: sbt test publishLocal + + - name: Make microsite + if: matrix.scalaVersion == '2_13' && matrix.scalaPlatform == 'jvm' + run: sbt makeMicrosite - name: Compress target directories - run: tar cf targets.tar modules/benchmarks/target target modules/munit/target docs/target modules/weaver/target modules/scalatest/target modules/core/target modules/cats/target modules/coretest/target project/target + run: | + tar cf targets.tar \ + modules/benchmarks/target \ + target modules/munit/target \ + docs/target \ + modules/weaver/target \ + modules/scalatest/target \ + modules/core/target \ + modules/cats/target \ + modules/coretest/target \ + project/target - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.scalaVersion }}-${{ matrix.java }}-${{ matrix.scalaPlatform }} path: targets.tar publish: @@ -70,7 +88,8 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scala: [2.13.11] + scalaVersion: [2_13] + scalaPlatform: [jvm] java: [temurin@11] runs-on: ${{ matrix.os }} steps: @@ -87,22 +106,22 @@ jobs: java-version: 11 cache: sbt - - name: Download target directories (2.13.11) + - name: Download target directories (2.13 & jvm) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.11-${{ matrix.java }} + name: target-${{ matrix.os }}-2_13-${{ matrix.java }}-jvm - - name: Inflate target directories (2.13.11) + - name: Inflate target directories (2.13 & jvm) run: | tar xf targets.tar rm targets.tar - - name: Download target directories (3.3.0) + - name: Download target directories (3 & jvm) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-3.3.0-${{ matrix.java }} + name: target-${{ matrix.os }}-3_0-${{ matrix.java }}-jvm - - name: Inflate target directories (3.3.0) + - name: Inflate target directories (3 & jvm) run: | tar xf targets.tar rm targets.tar diff --git a/build.sbt b/build.sbt index f527995..cf0ff03 100644 --- a/build.sbt +++ b/build.sbt @@ -1,4 +1,7 @@ +import sbt.internal.ProjectMatrix import sbtghactions.JavaSpec +import complete.DefaultParsers._ +import sbt.Reference.display val munitVersion = "0.7.29" val catsVersion = "2.9.0" @@ -33,12 +36,55 @@ inThisBuild( ), ) -lazy val crossModules = List(core, coretest, munit, scalatest, weaver, cats, benchmarks) +lazy val allModules = List(core, coretest, munit, scalatest, weaver, cats, benchmarks, docs) + +// taken from tapir: https://github.com/softwaremill/tapir/blob/08628a89a751f8bace95f1b57288da1f7c0c9dce/build.sbt#L279 +val scopesDescription = "Scala version can be: 2.12, 2.13, 3; platform: JVM, JS, Native" +val compileScoped = + inputKey[Unit]( + s"Compiles sources in the given scope. Usage: compileScoped [scala version] [platform]. $scopesDescription", + ) +val testScoped = + inputKey[Unit](s"Run tests in the given scope. Usage: testScoped [scala version] [platform]. $scopesDescription") + +val publishLocalScoped = + inputKey[Unit]( + s"Publish artifacts to local ivy repository in the given scope. Usage: publishLocalScoped [scala version] [platform]. $scopesDescription", + ) + +def filterProject(p: String => Boolean) = + ScopeFilter(inProjects(allModules.flatMap(_.projectRefs).filter(pr => p(display(pr.project))): _*)) + +def filterByVersionAndPlatform(scalaVersionFilter: String, platformFilter: String) = filterProject { projectName => + val byPlatform = + if (platformFilter == "JVM") !projectName.contains("JS") && !projectName.contains("Native") + else projectName.contains(platformFilter) + val byVersion = scalaVersionFilter match { + case "2.13" => !projectName.contains("2_12") && !projectName.contains("3") + case "2.12" => projectName.contains("2_12") + case "3" => projectName.contains("3") + } + + byPlatform && byVersion +} lazy val difflicious = Project("difflicious", file(".")) - .aggregate(docs) - .aggregate(crossModules.flatMap(_.projectRefs): _*) + .aggregate(allModules.flatMap(_.projectRefs): _*) .settings(commonSettings, noPublishSettings) + .settings( + compileScoped := Def.inputTaskDyn { + val args = spaceDelimited("").parsed + Def.taskDyn((Test / compile).all(filterByVersionAndPlatform(args.head, args(1)))) + }.evaluated, + testScoped := Def.inputTaskDyn { + val args = spaceDelimited("").parsed + Def.taskDyn((Test / test).all(filterByVersionAndPlatform(args.head, args(1)))) + }.evaluated, + publishLocalScoped := Def.inputTaskDyn { + val args = spaceDelimited("").parsed + Def.taskDyn((Compile / publishLocal).all(filterByVersionAndPlatform(args.head, args(1)))) + }.evaluated, + ) lazy val core = projectMatrix .in(file("modules/core")) @@ -131,17 +177,11 @@ lazy val coretest = projectMatrix ) .jvmPlatform(jvmScalaVersions) -lazy val docs: Project = project - .dependsOn( - core.jvm(mainScalaVersion), - coretest.jvm(mainScalaVersion), - cats.jvm(mainScalaVersion), - munit.jvm(mainScalaVersion), - scalatest.jvm(mainScalaVersion), - weaver.jvm(mainScalaVersion), - ) +lazy val docs: ProjectMatrix = projectMatrix + .dependsOn(core, coretest, cats, munit, scalatest, weaver) .enablePlugins(MicrositesPlugin) .settings( + name := "docs", commonSettings, publish / skip := true, ) @@ -187,6 +227,7 @@ lazy val docs: Project = project (opts ++ extraOpts).filterNot(removes) }, ) + .jvmPlatform(Seq(scala213)) lazy val benchmarks = projectMatrix .in(file("modules/benchmarks")) From 4f37b69cc1bf4c9945a1318bf69c02a1ae1a8393 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 15:45:51 +0100 Subject: [PATCH 3/7] Switch to buildCommands from smithy and fix CI workflow --- .github/workflows/ci.yml | 48 ++++++++---------------- build.sbt | 68 +++++++--------------------------- project/Build.scala | 80 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 109 insertions(+), 87 deletions(-) create mode 100644 project/Build.scala diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ac29715..010ede0 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,9 +9,9 @@ name: Continuous Integration on: pull_request: - branches: ["**"] + branches: ['**'] push: - branches: ["**"] + branches: ['**'] tags: [v*] env: @@ -23,11 +23,9 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scalaVersion: [2_13, 3_0] - scalaPlatform: [jvm] + scala: [2_13, 3_0] java: [temurin@11] - env: - BUILD_KEY: ${{matrix.scalaVersion}}_${{matrix.scalaPlatform}} + scalaPlatform: [jvm] runs-on: ${{ matrix.os }} steps: - name: Checkout current branch (full) @@ -52,33 +50,18 @@ jobs: run: gem install jekyll -v 4.1.1 - name: Check that workflows are up to date - if: matrix.scalaVersion == '2_13' && matrix.scalaPlatform == 'jvm' run: sbt githubWorkflowCheck - - name: Build project & publish locally - run: sbt test publishLocal - - - name: Make microsite - if: matrix.scalaVersion == '2_13' && matrix.scalaPlatform == 'jvm' - run: sbt makeMicrosite + - name: Build project + run: sbt 'test_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'makeMicrosite_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'publishLocal_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' - name: Compress target directories - run: | - tar cf targets.tar \ - modules/benchmarks/target \ - target modules/munit/target \ - docs/target \ - modules/weaver/target \ - modules/scalatest/target \ - modules/core/target \ - modules/cats/target \ - modules/coretest/target \ - project/target + run: tar cf targets.tar modules/weaver/target/jvm-2.13 modules/scalatest/target/jvm-2.13 modules/benchmarks/target/jvm-2.13 target docs/target/jvm-2.13 modules/core/target/jvm-3 modules/munit/target/jvm-3 modules/scalatest/target/jvm-3 modules/weaver/target/jvm-3 modules/benchmarks/target/jvm-3 modules/cats/target/jvm-3 modules/munit/target/jvm-2.13 modules/cats/target/jvm-2.13 modules/core/target/jvm-2.13 modules/coretest/target/jvm-3 modules/coretest/target/jvm-2.13 project/target - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scalaVersion }}-${{ matrix.java }}-${{ matrix.scalaPlatform }} + name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} path: targets.tar publish: @@ -88,8 +71,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - scalaVersion: [2_13] - scalaPlatform: [jvm] + scala: [2.13.11] java: [temurin@11] runs-on: ${{ matrix.os }} steps: @@ -106,22 +88,22 @@ jobs: java-version: 11 cache: sbt - - name: Download target directories (2.13 & jvm) + - name: Download target directories (2_13) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2_13-${{ matrix.java }}-jvm + name: target-${{ matrix.os }}-2_13-${{ matrix.java }} - - name: Inflate target directories (2.13 & jvm) + - name: Inflate target directories (2_13) run: | tar xf targets.tar rm targets.tar - - name: Download target directories (3 & jvm) + - name: Download target directories (3_0) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-3_0-${{ matrix.java }}-jvm + name: target-${{ matrix.os }}-3_0-${{ matrix.java }} - - name: Inflate target directories (3 & jvm) + - name: Inflate target directories (3_0) run: | tar xf targets.tar rm targets.tar diff --git a/build.sbt b/build.sbt index cf0ff03..8f64065 100644 --- a/build.sbt +++ b/build.sbt @@ -8,16 +8,13 @@ val catsVersion = "2.9.0" val scalatestVersion = "3.2.16" val weaverVersion = "0.8.3" -val scala213 = "2.13.11" -val scala3 = "3.3.0" - val isScala3 = Def.setting { // doesn't work well with >= 3.0.0 for `3.0.0-M1` scalaVersion.value.startsWith("3") } -val mainScalaVersion = scala213 -val jvmScalaVersions = Seq(scala213, scala3) +val mainScalaVersion = Build.Scala213 +val jvmScalaVersions = Seq(Build.Scala213, Build.Scala3) inThisBuild( List( @@ -33,58 +30,15 @@ inThisBuild( url("https://almostfunctional.com"), ), ), + commands ++= Build.createBuildCommands(allModules), ), ) -lazy val allModules = List(core, coretest, munit, scalatest, weaver, cats, benchmarks, docs) - -// taken from tapir: https://github.com/softwaremill/tapir/blob/08628a89a751f8bace95f1b57288da1f7c0c9dce/build.sbt#L279 -val scopesDescription = "Scala version can be: 2.12, 2.13, 3; platform: JVM, JS, Native" -val compileScoped = - inputKey[Unit]( - s"Compiles sources in the given scope. Usage: compileScoped [scala version] [platform]. $scopesDescription", - ) -val testScoped = - inputKey[Unit](s"Run tests in the given scope. Usage: testScoped [scala version] [platform]. $scopesDescription") - -val publishLocalScoped = - inputKey[Unit]( - s"Publish artifacts to local ivy repository in the given scope. Usage: publishLocalScoped [scala version] [platform]. $scopesDescription", - ) - -def filterProject(p: String => Boolean) = - ScopeFilter(inProjects(allModules.flatMap(_.projectRefs).filter(pr => p(display(pr.project))): _*)) - -def filterByVersionAndPlatform(scalaVersionFilter: String, platformFilter: String) = filterProject { projectName => - val byPlatform = - if (platformFilter == "JVM") !projectName.contains("JS") && !projectName.contains("Native") - else projectName.contains(platformFilter) - val byVersion = scalaVersionFilter match { - case "2.13" => !projectName.contains("2_12") && !projectName.contains("3") - case "2.12" => projectName.contains("2_12") - case "3" => projectName.contains("3") - } - - byPlatform && byVersion -} +lazy val allModules = Seq(core, coretest, munit, scalatest, weaver, cats, benchmarks, docs).flatMap(_.projectRefs) lazy val difflicious = Project("difflicious", file(".")) - .aggregate(allModules.flatMap(_.projectRefs): _*) + .aggregate(allModules: _*) .settings(commonSettings, noPublishSettings) - .settings( - compileScoped := Def.inputTaskDyn { - val args = spaceDelimited("").parsed - Def.taskDyn((Test / compile).all(filterByVersionAndPlatform(args.head, args(1)))) - }.evaluated, - testScoped := Def.inputTaskDyn { - val args = spaceDelimited("").parsed - Def.taskDyn((Test / test).all(filterByVersionAndPlatform(args.head, args(1)))) - }.evaluated, - publishLocalScoped := Def.inputTaskDyn { - val args = spaceDelimited("").parsed - Def.taskDyn((Compile / publishLocal).all(filterByVersionAndPlatform(args.head, args(1)))) - }.evaluated, - ) lazy val core = projectMatrix .in(file("modules/core")) @@ -99,7 +53,7 @@ lazy val core = projectMatrix } else Seq( "com.softwaremill.magnolia1_2" %% "magnolia" % "1.0.0", - "org.scala-lang" % "scala-reflect" % scala213, + "org.scala-lang" % "scala-reflect" % Build.Scala213, )), Compile / sourceGenerators += Def.task { val file = (Compile / sourceManaged).value / "difflicious" / "TupleDifferInstances.scala" @@ -227,7 +181,7 @@ lazy val docs: ProjectMatrix = projectMatrix (opts ++ extraOpts).filterNot(removes) }, ) - .jvmPlatform(Seq(scala213)) + .jvmPlatform(Seq(Build.Scala213)) lazy val benchmarks = projectMatrix .in(file("modules/benchmarks")) @@ -286,15 +240,21 @@ val setupJekyllSteps = Seq( ), ) +ThisBuild / githubWorkflowBuildMatrixAdditions += ("scalaPlatform", List("jvm")) + ThisBuild / githubWorkflowBuildPreamble ++= setupJekyllSteps ThisBuild / githubWorkflowPublishPreamble ++= setupJekyllSteps +ThisBuild / githubWorkflowScalaVersions := Seq("2_13", "3_0") + +ThisBuild / githubWorkflowBuildSbtStepPreamble := Seq.empty + // Add makeMicrosite to the build step ThisBuild / githubWorkflowBuild ~= { steps => steps.map { case w: WorkflowStep.Sbt if w.commands == List("test") => - w.copy(commands = List("test", "makeMicrosite", "publishLocal")) + w.copy(commands = List("test", "makeMicrosite", "publishLocal").map(_ + "_${{ matrix.scala }}_${{ matrix.scalaPlatform }}")) case w => w } } diff --git a/project/Build.scala b/project/Build.scala new file mode 100644 index 0000000..a0ab517 --- /dev/null +++ b/project/Build.scala @@ -0,0 +1,80 @@ +import sbt._ +import sbt.Keys._ +import com.jsuereth.sbtpgp.PgpKeys._ +import sbt.internal.LogManager +import sbt.internal.util.BufferedAppender +import java.io.PrintStream +import sbt.internal.ProjectMatrix +import sbtprojectmatrix.ProjectMatrixPlugin.autoImport.virtualAxes + +object Build { + + val Scala213 = "2.13.11" + val Scala3 = "3.3.0" + + // copied from: https://github.com/disneystreaming/smithy4s/blob/21a6fb04ab3485c0a4b40fe205a628c6f4750813/project/Smithy4sBuildPlugin.scala#L508 + def createBuildCommands(projects: Seq[ProjectReference]) = { + case class Doublet(scala: String, platform: String) + + val scala3Suffix = VirtualAxis.scalaABIVersion(Scala3).idSuffix + val scala213Suffix = VirtualAxis.scalaABIVersion(Scala213).idSuffix + val jsSuffix = VirtualAxis.js.idSuffix + val nativeSuffix = VirtualAxis.native.idSuffix + + val all: List[(Doublet, Seq[String])] = + projects + .collect { case lp: LocalProject => + var projectId = lp.project + + val scalaAxis = + if (projectId.endsWith(scala3Suffix)) { + projectId = projectId.dropRight(scala3Suffix.length) + "3_0" + } else "2_13" + + val platformAxis = + if (projectId.endsWith(jsSuffix)) { + projectId = projectId.dropRight(jsSuffix.length) + "js" + } else if (projectId.endsWith(nativeSuffix)) { + projectId = projectId.dropRight(nativeSuffix.length) + "native" + } else { + "jvm" + } + + Doublet(scalaAxis, platformAxis) -> lp.project + } + .groupBy(_._1) + .mapValues(_.map(_._2)) + .toList + + // some commands, like test and compile, are setup for all modules + val any = (t: Doublet) => true + // things like scalafix and scalafmt are only enabled on jvm 2.13 projects + val jvm2_13 = (t: Doublet) => t.scala == "2_13" && t.platform == "jvm" + + val jvm = (t: Doublet) => t.platform == "jvm" + + val desiredCommands: Map[String, (String, Doublet => Boolean)] = Map( + "test" -> ("test", any), + "compile" -> ("compile", any), + "makeMicrosite" -> ("makeMicrosite", any), + "publishLocal" -> ("publishLocal", any), + ) + + val cmds = all.flatMap { case (doublet, projects) => + desiredCommands.filter(_._2._2(doublet)).map { case (name, (cmd, _)) => + Command.command( + s"${name}_${doublet.scala}_${doublet.platform}", + ) { state => + projects.foldLeft(state) { case (st, proj) => + s"$proj/$cmd" :: st + } + } + } + } + + cmds + } +} From ecb05764699768128de2691e7c26f1f734b719f3 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 15:56:18 +0100 Subject: [PATCH 4/7] Limit makeMicrosite to 2_13 --- build.sbt | 4 +++- project/Build.scala | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 8f64065..e5c7ca4 100644 --- a/build.sbt +++ b/build.sbt @@ -254,7 +254,9 @@ ThisBuild / githubWorkflowBuildSbtStepPreamble := Seq.empty ThisBuild / githubWorkflowBuild ~= { steps => steps.map { case w: WorkflowStep.Sbt if w.commands == List("test") => - w.copy(commands = List("test", "makeMicrosite", "publishLocal").map(_ + "_${{ matrix.scala }}_${{ matrix.scalaPlatform }}")) + w.copy(commands = + List("test", "publishLocal").map(_ + "_${{ matrix.scala }}_${{ matrix.scalaPlatform }}") :+ "makeMicrosite", + ) case w => w } } diff --git a/project/Build.scala b/project/Build.scala index a0ab517..0bd9dfa 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -59,7 +59,6 @@ object Build { val desiredCommands: Map[String, (String, Doublet => Boolean)] = Map( "test" -> ("test", any), "compile" -> ("compile", any), - "makeMicrosite" -> ("makeMicrosite", any), "publishLocal" -> ("publishLocal", any), ) From 6a7950885ad8c8f9faec0c86e4e6752e72bf35bc Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 16:01:01 +0100 Subject: [PATCH 5/7] Regenerate workflow --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 010ede0..016088e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,7 @@ jobs: run: sbt githubWorkflowCheck - name: Build project - run: sbt 'test_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'makeMicrosite_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'publishLocal_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' + run: sbt 'test_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'publishLocal_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' makeMicrosite - name: Compress target directories run: tar cf targets.tar modules/weaver/target/jvm-2.13 modules/scalatest/target/jvm-2.13 modules/benchmarks/target/jvm-2.13 target docs/target/jvm-2.13 modules/core/target/jvm-3 modules/munit/target/jvm-3 modules/scalatest/target/jvm-3 modules/weaver/target/jvm-3 modules/benchmarks/target/jvm-3 modules/cats/target/jvm-3 modules/munit/target/jvm-2.13 modules/cats/target/jvm-2.13 modules/core/target/jvm-2.13 modules/coretest/target/jvm-3 modules/coretest/target/jvm-2.13 project/target From 22122a75026dc50139cf0a643c41bff2f00ead86 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 16:48:05 +0100 Subject: [PATCH 6/7] Disable artifact uploading --- .github/workflows/ci.yml | 29 ----------------------------- build.sbt | 2 ++ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 016088e..033c726 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,15 +55,6 @@ jobs: - name: Build project run: sbt 'test_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' 'publishLocal_${{ matrix.scala }}_${{ matrix.scalaPlatform }}' makeMicrosite - - name: Compress target directories - run: tar cf targets.tar modules/weaver/target/jvm-2.13 modules/scalatest/target/jvm-2.13 modules/benchmarks/target/jvm-2.13 target docs/target/jvm-2.13 modules/core/target/jvm-3 modules/munit/target/jvm-3 modules/scalatest/target/jvm-3 modules/weaver/target/jvm-3 modules/benchmarks/target/jvm-3 modules/cats/target/jvm-3 modules/munit/target/jvm-2.13 modules/cats/target/jvm-2.13 modules/core/target/jvm-2.13 modules/coretest/target/jvm-3 modules/coretest/target/jvm-2.13 project/target - - - name: Upload target directories - uses: actions/upload-artifact@v3 - with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} - path: targets.tar - publish: name: Publish Artifacts needs: [build] @@ -88,26 +79,6 @@ jobs: java-version: 11 cache: sbt - - name: Download target directories (2_13) - uses: actions/download-artifact@v3 - with: - name: target-${{ matrix.os }}-2_13-${{ matrix.java }} - - - name: Inflate target directories (2_13) - run: | - tar xf targets.tar - rm targets.tar - - - name: Download target directories (3_0) - uses: actions/download-artifact@v3 - with: - name: target-${{ matrix.os }}-3_0-${{ matrix.java }} - - - name: Inflate target directories (3_0) - run: | - tar xf targets.tar - rm targets.tar - - name: Setup ruby uses: ruby/setup-ruby@v1 with: diff --git a/build.sbt b/build.sbt index e5c7ca4..df937e8 100644 --- a/build.sbt +++ b/build.sbt @@ -250,6 +250,8 @@ ThisBuild / githubWorkflowScalaVersions := Seq("2_13", "3_0") ThisBuild / githubWorkflowBuildSbtStepPreamble := Seq.empty +ThisBuild / githubWorkflowArtifactUpload := false + // Add makeMicrosite to the build step ThisBuild / githubWorkflowBuild ~= { steps => steps.map { From a0014ad785d3f402b3b67d586aebe113db6c2481 Mon Sep 17 00:00:00 2001 From: ghostbuster91 Date: Thu, 14 Mar 2024 17:22:30 +0100 Subject: [PATCH 7/7] Update sbt-gha --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/clean.yml | 3 ++- project/plugins.sbt | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 033c726..3833e1f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,13 +29,13 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout current branch (full) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Java (temurin@11) if: matrix.java == 'temurin@11' - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: temurin java-version: 11 @@ -67,13 +67,13 @@ jobs: runs-on: ${{ matrix.os }} steps: - name: Checkout current branch (full) - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Java (temurin@11) if: matrix.java == 'temurin@11' - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: distribution: temurin java-version: 11 diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml index 547aaa4..bfc865d 100644 --- a/.github/workflows/clean.yml +++ b/.github/workflows/clean.yml @@ -17,6 +17,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - name: Delete artifacts + shell: bash {0} run: | # Customize those three lines with your repository and credentials: REPO=${GITHUB_API_URL}/repos/${{ github.repository }} @@ -25,7 +26,7 @@ jobs: ghapi() { curl --silent --location --user _:$GITHUB_TOKEN "$@"; } # A temporary file which receives HTTP response headers. - TMPFILE=/tmp/tmp.$$ + TMPFILE=$(mktemp) # An associative array, key: artifact name, value: number of artifacts of that name. declare -A ARTCOUNT diff --git a/project/plugins.sbt b/project/plugins.sbt index 138196f..f6ff925 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,6 +4,6 @@ addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.6") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.9.3") addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("com.47deg" % "sbt-microsites" % "1.3.4") -addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.15.0") +addSbtPlugin("com.github.sbt" % "sbt-github-actions" % "0.23.0") addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.3.0") // override mdoc version from microsite addSbtPlugin("com.eed3si9n" % "sbt-projectmatrix" % "0.9.1")