From 757e9cc4ccadfc12b3d3055cbf257ff8b868a1f4 Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 16:06:58 -0400 Subject: [PATCH 1/6] Add the CI release plugin and adjust GitHub Actions to add the publish step --- .github/workflows/ci.yml | 41 +++++++++++++++++++++++++++ .gitignore | 5 ++++ build.sbt | 61 ++++++++++++++++++++-------------------- project/plugins.sbt | 5 ++-- 4 files changed, 79 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ff881f5..0d4c442b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -65,6 +65,47 @@ jobs: - name: Upload Codecov Results run: codecov -F ${{ matrix.scala }} + publish: + name: Publish Artifacts + needs: [build] + if: github.event_name != 'pull_request' && (github.ref == 'refs/heads/master' || startsWith(github.ref, 'refs/tags/v')) + strategy: + matrix: + os: [ubuntu-latest] + scala: [2.12.14] + java: [adopt@1.8] + runs-on: ${{ matrix.os }} + steps: + - name: Checkout current branch (full) + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Setup Java and Scala + uses: olafurpg/setup-scala@v13 + with: + java-version: ${{ matrix.java }} + + - name: Cache sbt + uses: actions/cache@v2 + with: + path: | + ~/.sbt + ~/.ivy2/cache + ~/.coursier/cache/v1 + ~/.cache/coursier/v1 + ~/AppData/Local/Coursier/Cache/v1 + ~/Library/Caches/Coursier/v1 + key: ${{ runner.os }}-sbt-cache-v2-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }} + + - name: Publish artifacts + env: + PGP_PASSPHRASE: ${{ secrets.PGP_PASSPHRASE }} + PGP_SECRET: ${{ secrets.PGP_SECRET }} + SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} + SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} + run: sbt ++${{ matrix.scala }} ci-release + docs: name: Documentation strategy: diff --git a/.gitignore b/.gitignore index af472ae5..de05a51e 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,8 @@ bin/ # OS X .DS_Store node_modules + +# VSCode +.history +.metals +.vscode diff --git a/build.sbt b/build.sbt index b83405da..55dc55e4 100644 --- a/build.sbt +++ b/build.sbt @@ -10,11 +10,11 @@ val irrecVersion = "0.4.0" val Scala212 = "2.12.14" +ThisBuild / versionScheme := Some("semver-spec") + ThisBuild / crossScalaVersions := Seq(Scala212) ThisBuild / scalaVersion := (ThisBuild / crossScalaVersions).value.last -ThisBuild / githubWorkflowPublishTargetBranches := Seq() - ThisBuild / githubWorkflowArtifactUpload := false ThisBuild / githubWorkflowBuild := Seq( @@ -33,6 +33,24 @@ ThisBuild / githubWorkflowBuild := Seq( ) ) +ThisBuild / githubWorkflowPublishTargetBranches := Seq( + RefPredicate.Equals(Ref.Branch("master")), + RefPredicate.StartsWith(Ref.Tag("v")) +) + +ThisBuild / githubWorkflowPublish := Seq( + WorkflowStep.Sbt( + List("ci-release"), + name = Some("Publish artifacts"), + env = Map( + "PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}", + "PGP_SECRET" -> "${{ secrets.PGP_SECRET }}", + "SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}", + "SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}" + ) + ) +) + ThisBuild / githubWorkflowAddedJobs ++= Seq( WorkflowJob( "docs", @@ -70,8 +88,8 @@ lazy val cats = project "org.typelevel" %% "cats-effect" % catsEffectVersion, "org.typelevel" %% "cats-mtl-core" % catsMtlVersion, "org.typelevel" %% "alleycats-core" % catsCoreVersion, - "org.apache.spark" %% "spark-core" % sparkVersion % "provided", - "org.apache.spark" %% "spark-sql" % sparkVersion % "provided")) + "org.apache.spark" %% "spark-core" % sparkVersion % Provided, + "org.apache.spark" %% "spark-sql" % sparkVersion % Provided)) .dependsOn(dataset % "test->test;compile->compile") lazy val dataset = project @@ -80,8 +98,8 @@ lazy val dataset = project .settings(framelessTypedDatasetREPL: _*) .settings(publishSettings: _*) .settings(libraryDependencies ++= Seq( - "org.apache.spark" %% "spark-core" % sparkVersion % "provided", - "org.apache.spark" %% "spark-sql" % sparkVersion % "provided", + "org.apache.spark" %% "spark-core" % sparkVersion % Provided, + "org.apache.spark" %% "spark-sql" % sparkVersion % Provided, "net.ceedubs" %% "irrec-regex-gen" % irrecVersion % Test )) .dependsOn(core % "test->test;compile->compile") @@ -92,9 +110,9 @@ lazy val ml = project .settings(framelessTypedDatasetREPL: _*) .settings(publishSettings: _*) .settings(libraryDependencies ++= Seq( - "org.apache.spark" %% "spark-core" % sparkVersion % "provided", - "org.apache.spark" %% "spark-sql" % sparkVersion % "provided", - "org.apache.spark" %% "spark-mllib" % sparkVersion % "provided" + "org.apache.spark" %% "spark-core" % sparkVersion % Provided, + "org.apache.spark" %% "spark-sql" % sparkVersion % Provided, + "org.apache.spark" %% "spark-mllib" % sparkVersion % Provided )) .dependsOn( core % "test->test;compile->compile", @@ -108,9 +126,9 @@ lazy val docs = project .settings(scalacOptions --= Seq("-Xfatal-warnings", "-Ywarn-unused-import")) .enablePlugins(MdocPlugin) .settings(libraryDependencies ++= Seq( - "org.apache.spark" %% "spark-core" % sparkVersion, - "org.apache.spark" %% "spark-sql" % sparkVersion, - "org.apache.spark" %% "spark-mllib" % sparkVersion + "org.apache.spark" %% "spark-core" % sparkVersion, + "org.apache.spark" %% "spark-sql" % sparkVersion, + "org.apache.spark" %% "spark-mllib" % sparkVersion )) .settings( addCompilerPlugin("org.typelevel" % "kind-projector" % "0.13.0" cross CrossVersion.full), @@ -142,6 +160,7 @@ lazy val framelessSettings = Seq( "-Xfuture" ), licenses += ("Apache-2.0", url("http://opensource.org/licenses/Apache-2.0")), + homepage := Some(url("https://github.com/typelevel/frameless")), Test / testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-oDF"), libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % shapeless, @@ -187,17 +206,8 @@ lazy val framelessTypedDatasetREPL = Seq( lazy val publishSettings = Seq( publishMavenStyle := true, - publishTo := { - val nexus = "https://oss.sonatype.org/" - if (isSnapshot.value) - Some(Opts.resolver.sonatypeSnapshots) - else - Some(Opts.resolver.sonatypeStaging) - }, Test / publishArtifact := false, - pomIncludeRepository := Function.const(false), pomExtra in Global := { - https://github.com/typelevel/frameless git@github.com:typelevel/frameless.git scm:git:git@github.com:typelevel/frameless.git @@ -243,15 +253,6 @@ lazy val noPublishSettings = Seq( publishArtifact := false ) -lazy val credentialSettings = Seq( - // For Travis CI - see http://www.cakesolutions.net/teamblogs/publishing-artefacts-to-oss-sonatype-nexus-using-sbt-and-travis-ci - credentials ++= (for { - username <- Option(System.getenv().get("SONATYPE_USERNAME")) - password <- Option(System.getenv().get("SONATYPE_PASSWORD")) - } yield Credentials("Sonatype Nexus Repository Manager", "oss.sonatype.org", username, password)).toSeq -) - - lazy val copyReadme = taskKey[Unit]("copy for website generation") lazy val copyReadmeImpl = Def.task { val from = baseDirectory.value / "README.md" diff --git a/project/plugins.sbt b/project/plugins.sbt index fc0c1608..220776ab 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,5 +1,4 @@ -addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "3.9.9") -addSbtPlugin("com.github.sbt" % "sbt-pgp" % "2.1.2") +addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.8.2") addSbtPlugin("com.codecommit" % "sbt-github-actions" % "0.13.0") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.22") \ No newline at end of file +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.22") \ No newline at end of file From b92a855a7a911b61b9ea4ca2470d1022af80e0b3 Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 16:25:05 -0400 Subject: [PATCH 2/6] Move githubWorkflow generation to the bottom of the build.sbt file --- build.sbt | 98 +++++++++++++++++++++++++++---------------------------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/build.sbt b/build.sbt index 55dc55e4..2b8d59b7 100644 --- a/build.sbt +++ b/build.sbt @@ -15,55 +15,6 @@ ThisBuild / versionScheme := Some("semver-spec") ThisBuild / crossScalaVersions := Seq(Scala212) ThisBuild / scalaVersion := (ThisBuild / crossScalaVersions).value.last -ThisBuild / githubWorkflowArtifactUpload := false - -ThisBuild / githubWorkflowBuild := Seq( - WorkflowStep.Use(UseRef.Public("actions", "setup-python", "v2"), - name = Some("Setup Python"), - params = Map("python-version" -> "3.x") - ), - WorkflowStep.Run(List("pip install codecov"), - name = Some("Setup codecov") - ), - WorkflowStep.Sbt(List("coverage", "test", "coverageReport"), - name = Some("Test & Compute Coverage") - ), - WorkflowStep.Run(List("codecov -F ${{ matrix.scala }}"), - name = Some("Upload Codecov Results") - ) -) - -ThisBuild / githubWorkflowPublishTargetBranches := Seq( - RefPredicate.Equals(Ref.Branch("master")), - RefPredicate.StartsWith(Ref.Tag("v")) -) - -ThisBuild / githubWorkflowPublish := Seq( - WorkflowStep.Sbt( - List("ci-release"), - name = Some("Publish artifacts"), - env = Map( - "PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}", - "PGP_SECRET" -> "${{ secrets.PGP_SECRET }}", - "SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}", - "SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}" - ) - ) -) - -ThisBuild / githubWorkflowAddedJobs ++= Seq( - WorkflowJob( - "docs", - "Documentation", - githubWorkflowJobSetup.value.toList ::: List( - WorkflowStep.Sbt(List("doc", "mdoc"), - name = Some("Documentation") - ) - ), - scalas = List(Scala212) - ) -) - lazy val root = Project("frameless", file("." + "frameless")).in(file(".")) .aggregate(core, cats, dataset, ml, docs) .settings(framelessSettings: _*) @@ -260,3 +211,52 @@ lazy val copyReadmeImpl = Def.task { sbt.IO.copy(List((from, to)), overwrite = true, preserveLastModified = true, preserveExecutable = true) } copyReadme := copyReadmeImpl.value + +ThisBuild / githubWorkflowArtifactUpload := false + +ThisBuild / githubWorkflowBuild := Seq( + WorkflowStep.Use(UseRef.Public("actions", "setup-python", "v2"), + name = Some("Setup Python"), + params = Map("python-version" -> "3.x") + ), + WorkflowStep.Run(List("pip install codecov"), + name = Some("Setup codecov") + ), + WorkflowStep.Sbt(List("coverage", "test", "coverageReport"), + name = Some("Test & Compute Coverage") + ), + WorkflowStep.Run(List("codecov -F ${{ matrix.scala }}"), + name = Some("Upload Codecov Results") + ) +) + +ThisBuild / githubWorkflowPublishTargetBranches := Seq( + RefPredicate.Equals(Ref.Branch("master")), + RefPredicate.StartsWith(Ref.Tag("v")) +) + +ThisBuild / githubWorkflowPublish := Seq( + WorkflowStep.Sbt( + List("ci-release"), + name = Some("Publish artifacts"), + env = Map( + "PGP_PASSPHRASE" -> "${{ secrets.PGP_PASSPHRASE }}", + "PGP_SECRET" -> "${{ secrets.PGP_SECRET }}", + "SONATYPE_PASSWORD" -> "${{ secrets.SONATYPE_PASSWORD }}", + "SONATYPE_USERNAME" -> "${{ secrets.SONATYPE_USERNAME }}" + ) + ) +) + +ThisBuild / githubWorkflowAddedJobs ++= Seq( + WorkflowJob( + "docs", + "Documentation", + githubWorkflowJobSetup.value.toList ::: List( + WorkflowStep.Sbt(List("doc", "mdoc"), + name = Some("Documentation") + ) + ), + scalas = List(Scala212) + ) +) From 4a18e256d1eddc31ea5aaad728d797c62ae5013b Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 17:26:29 -0400 Subject: [PATCH 3/6] Change the homepage address --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index 2b8d59b7..6118de33 100644 --- a/build.sbt +++ b/build.sbt @@ -111,7 +111,7 @@ lazy val framelessSettings = Seq( "-Xfuture" ), licenses += ("Apache-2.0", url("http://opensource.org/licenses/Apache-2.0")), - homepage := Some(url("https://github.com/typelevel/frameless")), + homepage := Some(url("https://typelevel.org/frameless")), Test / testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-oDF"), libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % shapeless, From 64df23c98db4d432a4ef24e92a6c03079e6b0d1e Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 17:41:19 -0400 Subject: [PATCH 4/6] Add the nexus badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 436711cb..8b0df089 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,9 @@ [![Workflow Badge](https://github.com/typelevel/frameless/actions/workflows/ci.yml/badge.svg?branch=master)](https://github.com/typelevel/frameless/actions/workflows/ci.yml) [![Codecov Badge](https://codecov.io/gh/typelevel/frameless/branch/master/graph/badge.svg)](https://codecov.io/gh/typelevel/frameless) -[![Maven Badge](https://img.shields.io/maven-central/v/org.typelevel/frameless-dataset_2.12.svg)](https://maven-badges.herokuapp.com/maven-central/org.typelevel/frameless-dataset_2.12) [![Discord Badge](https://img.shields.io/badge/chat-on%20discord-46BC99)](https://discord.gg/ZDZsxWcBJt) +[![Maven Badge](https://img.shields.io/maven-central/v/org.typelevel/frameless-core_2.12?color=blue)](https://search.maven.org/search?q=g:org.typelevel%20and%20frameless) +[![Snapshots Badge](https://img.shields.io/nexus/s/https/oss.sonatype.org/org.typelevel/frameless-core_2.12)](https://oss.sonatype.org/content/repositories/snapshots/org/typelevel/) Frameless is a Scala library for working with [Spark](http://spark.apache.org/) using more expressive types. It consists of the following modules: From 80cc8e069b09e5a58eda639d9662a05fa617e95b Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 18:03:31 -0400 Subject: [PATCH 5/6] Address review comments --- build.sbt | 1 - project/plugins.sbt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 6118de33..28e51dd1 100644 --- a/build.sbt +++ b/build.sbt @@ -156,7 +156,6 @@ lazy val framelessTypedDatasetREPL = Seq( ) lazy val publishSettings = Seq( - publishMavenStyle := true, Test / publishArtifact := false, pomExtra in Global := { diff --git a/project/plugins.sbt b/project/plugins.sbt index 220776ab..f2dabeb2 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,4 +1,4 @@ addSbtPlugin("com.geirsson" % "sbt-ci-release" % "1.5.7") addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.8.2") addSbtPlugin("com.codecommit" % "sbt-github-actions" % "0.13.0") -addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.22") \ No newline at end of file +addSbtPlugin("org.scalameta" % "sbt-mdoc" % "2.2.22") From f0b89d8a00f03afbfdaad3f5fe869c899b9e3f79 Mon Sep 17 00:00:00 2001 From: Grigory Pomadchin Date: Wed, 25 Aug 2021 19:40:14 -0400 Subject: [PATCH 6/6] Add release-drafter.yaml --- .github/release-drafter.yaml | 21 +++++++++++++++++++++ .github/workflows/release-drafter.yaml | 16 ++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 .github/release-drafter.yaml create mode 100644 .github/workflows/release-drafter.yaml diff --git a/.github/release-drafter.yaml b/.github/release-drafter.yaml new file mode 100644 index 00000000..cd6d0069 --- /dev/null +++ b/.github/release-drafter.yaml @@ -0,0 +1,21 @@ +name-template: '$NEXT_MINOR_VERSION' +tag-template: 'v$NEXT_MINOR_VERSION' +categories: + - title: 'Added' + labels: + - 'feature' + - title: 'Changed' + labels: + - 'enhancement' + - 'dependency-update' + - title: 'Fixed' + labels: + - 'fix' + - 'bug' +exclude-labels: + - 'skip-changelog' + - 'documentation' + - 'build/process improvement' +change-template: '- $TITLE [#$NUMBER](https://github.com/sbt/sbt-jni/pull/$NUMBER) (@$AUTHOR)' +template: | + $CHANGES diff --git a/.github/workflows/release-drafter.yaml b/.github/workflows/release-drafter.yaml new file mode 100644 index 00000000..3f656ef6 --- /dev/null +++ b/.github/workflows/release-drafter.yaml @@ -0,0 +1,16 @@ +name: Release Drafter + +on: + push: + branches: + - main + pull_request: + types: [opened, reopened, synchronize] + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: release-drafter/release-drafter@v5.15.0 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}