diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index db458021..f9263cee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,7 +76,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -127,7 +127,57 @@ jobs: - name: Download target directories (2.12.18) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.12.18-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 + + - name: Inflate target directories (2.12.18) + run: | + tar xf targets.tar + rm targets.tar + + - name: Download target directories (2.12.18) + uses: actions/download-artifact@v3 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 + + - name: Inflate target directories (2.12.18) + run: | + tar xf targets.tar + rm targets.tar + + - name: Download target directories (2.12.18) + uses: actions/download-artifact@v3 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 + + - name: Inflate target directories (2.12.18) + run: | + tar xf targets.tar + rm targets.tar + + - name: Download target directories (2.12.18) + uses: actions/download-artifact@v3 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 + + - name: Inflate target directories (2.12.18) + run: | + tar xf targets.tar + rm targets.tar + + - name: Download target directories (2.12.18) + uses: actions/download-artifact@v3 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 + + - name: Inflate target directories (2.12.18) + run: | + tar xf targets.tar + rm targets.tar + + - name: Download target directories (2.12.18) + uses: actions/download-artifact@v3 + with: + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 - name: Inflate target directories (2.12.18) run: | diff --git a/build.sbt b/build.sbt index 3a1c42af..95d44e8c 100644 --- a/build.sbt +++ b/build.sbt @@ -43,10 +43,21 @@ ThisBuild / githubWorkflowPublish := Seq( ) ) ) -ThisBuild / version := { - val orig = (ThisBuild / version).value - if (orig.endsWith("-SNAPSHOT")) orig.split("""\+""").head + "-SNAPSHOT" - else orig + +// So that publishLocal doesn't continuously create new versions +def versionFmt(out: sbtdynver.GitDescribeOutput): String = { + val snapshotSuffix = if + (out.isSnapshot()) "-SNAPSHOT" + else "" + out.ref.dropPrefix + snapshotSuffix +} + +def fallbackVersion(d: java.util.Date): String = s"HEAD-${sbtdynver.DynVer timestamp d}" + +ThisBuild / version := dynverGitDescribeOutput.value.mkVersion(versionFmt, fallbackVersion(dynverCurrentDate.value)) +ThisBuild / dynver := { + val d = new java.util.Date + sbtdynver.DynVer.getGitDescribeOutput(d).mkVersion(versionFmt, fallbackVersion(d)) } sbtPlugin := true diff --git a/src/main/scala/sbtghactions/GenerativeKeys.scala b/src/main/scala/sbtghactions/GenerativeKeys.scala index 255eba37..dd727558 100644 --- a/src/main/scala/sbtghactions/GenerativeKeys.scala +++ b/src/main/scala/sbtghactions/GenerativeKeys.scala @@ -66,6 +66,8 @@ trait GenerativeKeys { lazy val githubWorkflowPREventTypes = settingKey[Seq[PREventType]]("A list of pull request event types which will be used to trigger builds (default: [opened, synchronize, reopened])") lazy val githubWorkflowArtifactUpload = settingKey[Boolean]("Controls whether or not to upload target directories in the event that multiple jobs are running sequentially. Can be set on a per-project basis (default: true)") + lazy val githubWorkflowArtifactDownloadExtraKeys = settingKey[Set[String]]( + "Additional matrix keys for which *all* artifacts should be downloaded and not just for the primary value (default: {})") lazy val githubWorkflowJobSetup = settingKey[Seq[WorkflowStep]]("The automatically-generated checkout, setup, and cache steps which are common to all jobs which touch the build (default: autogenerated)") lazy val githubWorkflowEnv = settingKey[Map[String, String]](s"A map of static environment variable assignments global to the workflow (default: { GITHUB_TOKEN: $${{ secrets.GITHUB_TOKEN }} })") diff --git a/src/main/scala/sbtghactions/GenerativePlugin.scala b/src/main/scala/sbtghactions/GenerativePlugin.scala index 37786006..7e355a84 100644 --- a/src/main/scala/sbtghactions/GenerativePlugin.scala +++ b/src/main/scala/sbtghactions/GenerativePlugin.scala @@ -622,7 +622,7 @@ ${indent(jobs.map(compileJob(_, sbt)).mkString("\n\n"), 1)} override def buildSettings = settingDefaults ++ Seq( githubWorkflowPREventTypes := PREventType.Defaults, - + githubWorkflowArtifactDownloadExtraKeys := Set.empty, githubWorkflowGeneratedUploadSteps := { if (githubWorkflowArtifactUpload.value) { val sanitized = pathStrs.value map { str => @@ -636,6 +636,17 @@ ${indent(jobs.map(compileJob(_, sbt)).mkString("\n\n"), 1)} List(s"tar cf targets.tar ${sanitized.mkString(" ")} project/target"), name = Some("Compress target directories")) + val matrixAdditions = githubWorkflowBuildMatrixAdditions.value + val keys = if (matrixAdditions.isEmpty) + "" + else + matrixAdditions + .keys + .toList + .sorted + .map(k => s"$${{ matrix.$k }}") + .mkString("-", "-", "") + val upload = WorkflowStep.Use( UseRef.Public( "actions", @@ -643,7 +654,7 @@ ${indent(jobs.map(compileJob(_, sbt)).mkString("\n\n"), 1)} "v3"), name = Some(s"Upload target directories"), params = Map( - "name" -> s"target-$${{ matrix.os }}-$${{ matrix.scala }}-$${{ matrix.java }}", + "name" -> s"target-$${{ matrix.os }}-$${{ matrix.java }}-$${{ matrix.scala }}$keys", "path" -> "targets.tar")) Seq(tar, upload) @@ -653,24 +664,54 @@ ${indent(jobs.map(compileJob(_, sbt)).mkString("\n\n"), 1)} }, githubWorkflowGeneratedDownloadSteps := { - val scalas = githubWorkflowScalaVersions.value + val extraKeys = githubWorkflowArtifactDownloadExtraKeys.value + val additions = githubWorkflowBuildMatrixAdditions.value + val matrixAdds = additions.map { + case (key, values) => + if (extraKeys(key)) + key -> values // we want to iterate over all values + else + key -> values.take(1) // we only want the primary value + } + + val keys = "scala" :: additions.keys.toList.sorted + val oses = githubWorkflowOSes.value.toList + val scalas = githubWorkflowScalaVersions.value.toList + val javas = githubWorkflowJavaVersions.value.toList + val exclusions = githubWorkflowBuildMatrixExclusions.value.toList + + // we build the list of artifacts, by iterating over all combinations of keys + val artifacts = + expandMatrix( + oses, + scalas, + javas, + matrixAdds, + Nil, + exclusions + ).map { + case _ :: scala :: _ :: tail => scala :: tail + case _ => sys.error("Bug generating artifact download steps") // shouldn't happen + } if (githubWorkflowArtifactUpload.value) { - scalas flatMap { v => + artifacts flatMap { v => + val pretty = v.mkString(", ") + val download = WorkflowStep.Use( UseRef.Public( "actions", "download-artifact", "v3"), - name = Some(s"Download target directories ($v)"), + name = Some(s"Download target directories ($pretty)"), params = Map( - "name" -> s"target-$${{ matrix.os }}-$v-$${{ matrix.java }}")) + "name" -> s"target-$${{ matrix.os }}-$${{ matrix.java }}${v.mkString("-", "-", "")}")) val untar = WorkflowStep.Run( List( "tar xf targets.tar", "rm targets.tar"), - name = Some(s"Inflate target directories ($v)")) + name = Some(s"Inflate target directories ($pretty)")) Seq(download, untar) } @@ -931,7 +972,37 @@ ${indent(jobs.map(compileJob(_, sbt)).mkString("\n\n"), 1)} }, githubWorkflowDir := baseDirectory.value / ".github") - private[sbtghactions] def diff(expected: String, actual: String): String = { + private def expandMatrix( + oses: List[String], + scalas: List[String], + javas: List[JavaSpec], + matrixAdds: Map[String, List[String]], + includes: List[MatrixInclude], + excludes: List[MatrixExclude] + ): List[List[String]] = { + val keys = "os" :: "scala" :: "java" :: matrixAdds.keys.toList.sorted + val matrix = + matrixAdds + ("os" -> oses) + ("scala" -> scalas) + ("java" -> javas.map(_.render)) + + // expand the matrix + keys + .foldLeft(List(List.empty[String])) { (cells, key) => + val values = matrix.getOrElse(key, Nil) + cells.flatMap { cell => values.map(v => cell ::: v :: Nil) } + } + .filterNot { cell => // remove the excludes + val job = keys.zip(cell).toMap + excludes.exists { // there is an exclude that matches the current job + case MatrixExclude(matching) => matching.toSet.subsetOf(job.toSet) + } + } ::: includes.map { // add the includes + case MatrixInclude(matching, additions) => + // yoloing here, but let's wait for the bug report + keys.map(matching) ::: additions.values.toList + } + } + + private def diff(expected: String, actual: String): String = { val expectedLines = expected.split("\n", -1) val actualLines = actual.split("\n", -1) val (lines, _) = expectedLines.zipAll(actualLines, "", "").foldLeft((Vector.empty[String], false)) { diff --git a/src/sbt-test/sbtghactions/check-and-regenerate/expected-ci.yml b/src/sbt-test/sbtghactions/check-and-regenerate/expected-ci.yml index be4d31f8..baeedf69 100644 --- a/src/sbt-test/sbtghactions/check-and-regenerate/expected-ci.yml +++ b/src/sbt-test/sbtghactions/check-and-regenerate/expected-ci.yml @@ -73,7 +73,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }}-${{ matrix.test }} path: targets.tar publish: @@ -112,22 +112,12 @@ jobs: github-token: ${{ secrets.GITHUB_TOKEN }} cache: sbt - - name: Download target directories (2.13.10) + - name: Download target directories (2.13.10, 2.12.17, this) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.10-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.10-2.12.17-this - - name: Inflate target directories (2.13.10) - run: | - tar xf targets.tar - rm targets.tar - - - name: Download target directories (2.12.17) - uses: actions/download-artifact@v3 - with: - name: target-${{ matrix.os }}-2.12.17-${{ matrix.java }} - - - name: Inflate target directories (2.12.17) + - name: Inflate target directories (2.13.10, 2.12.17, this) run: | tar xf targets.tar rm targets.tar diff --git a/src/sbt-test/sbtghactions/githubworkflowoses-clean-publish/.github/workflows/ci.yml b/src/sbt-test/sbtghactions/githubworkflowoses-clean-publish/.github/workflows/ci.yml index ae164536..76ee29e8 100644 --- a/src/sbt-test/sbtghactions/githubworkflowoses-clean-publish/.github/workflows/ci.yml +++ b/src/sbt-test/sbtghactions/githubworkflowoses-clean-publish/.github/workflows/ci.yml @@ -66,7 +66,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -105,23 +105,12 @@ jobs: java-version: 8 cache: sbt - - name: Download target directories (2.13.10) + - name: Download target directories (2.13.10, 2.12.17) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.10-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.10-2.12.17 - - name: Inflate target directories (2.13.10) - shell: bash - run: | - tar xf targets.tar - rm targets.tar - - - name: Download target directories (2.12.17) - uses: actions/download-artifact@v3 - with: - name: target-${{ matrix.os }}-2.12.17-${{ matrix.java }} - - - name: Inflate target directories (2.12.17) + - name: Inflate target directories (2.13.10, 2.12.17) shell: bash run: | tar xf targets.tar diff --git a/src/sbt-test/sbtghactions/no-clean/.github/workflows/ci.yml b/src/sbt-test/sbtghactions/no-clean/.github/workflows/ci.yml index aacb7405..fce12d1e 100644 --- a/src/sbt-test/sbtghactions/no-clean/.github/workflows/ci.yml +++ b/src/sbt-test/sbtghactions/no-clean/.github/workflows/ci.yml @@ -51,7 +51,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -78,22 +78,12 @@ jobs: java-version: 8 cache: sbt - - name: Download target directories (2.13.10) + - name: Download target directories (2.13.10, 2.12.17) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.10-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.10-2.12.17 - - name: Inflate target directories (2.13.10) - run: | - tar xf targets.tar - rm targets.tar - - - name: Download target directories (2.12.17) - uses: actions/download-artifact@v3 - with: - name: target-${{ matrix.os }}-2.12.17-${{ matrix.java }} - - - name: Inflate target directories (2.12.17) + - name: Inflate target directories (2.13.10, 2.12.17) run: | tar xf targets.tar rm targets.tar diff --git a/src/sbt-test/sbtghactions/non-existent-target/.github/workflows/ci.yml b/src/sbt-test/sbtghactions/non-existent-target/.github/workflows/ci.yml index 9fa73b9b..1ea0cc41 100644 --- a/src/sbt-test/sbtghactions/non-existent-target/.github/workflows/ci.yml +++ b/src/sbt-test/sbtghactions/non-existent-target/.github/workflows/ci.yml @@ -50,7 +50,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -80,7 +80,7 @@ jobs: - name: Download target directories (2.13.10) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.10-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.10 - name: Inflate target directories (2.13.10) run: | diff --git a/src/sbt-test/sbtghactions/sbt-native-thin-client/.github/workflows/ci.yml b/src/sbt-test/sbtghactions/sbt-native-thin-client/.github/workflows/ci.yml index edf23b23..3f67212c 100644 --- a/src/sbt-test/sbtghactions/sbt-native-thin-client/.github/workflows/ci.yml +++ b/src/sbt-test/sbtghactions/sbt-native-thin-client/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -97,7 +97,7 @@ jobs: - name: Download target directories (2.12.18) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.12.18-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.12.18 - name: Inflate target directories (2.12.18) run: | diff --git a/src/sbt-test/sbtghactions/suppressed-scala-version/expected-ci.yml b/src/sbt-test/sbtghactions/suppressed-scala-version/expected-ci.yml index 60dddc34..0e4d0904 100644 --- a/src/sbt-test/sbtghactions/suppressed-scala-version/expected-ci.yml +++ b/src/sbt-test/sbtghactions/suppressed-scala-version/expected-ci.yml @@ -52,7 +52,7 @@ jobs: - name: Upload target directories uses: actions/upload-artifact@v3 with: - name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-${{ matrix.scala }} path: targets.tar publish: @@ -82,7 +82,7 @@ jobs: - name: Download target directories (2.13.10) uses: actions/download-artifact@v3 with: - name: target-${{ matrix.os }}-2.13.10-${{ matrix.java }} + name: target-${{ matrix.os }}-${{ matrix.java }}-2.13.10 - name: Inflate target directories (2.13.10) run: |