From bf3343187b5e799787f2ae2fa2a729a12167239e Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 2 Aug 2018 13:47:47 -0700 Subject: Rename plugins to include a -Plugin suffix --- README.md | 29 +++---- .../xyz.driver.sbt/IntegrationTestPackaging.scala | 4 +- src/main/scala/xyz.driver.sbt/Library.scala | 53 ------------ src/main/scala/xyz.driver.sbt/LibraryPlugin.scala | 53 ++++++++++++ src/main/scala/xyz.driver.sbt/LintPlugin.scala | 99 ++++++++++++++++++++++ src/main/scala/xyz.driver.sbt/Linting.scala | 97 --------------------- src/main/scala/xyz.driver.sbt/Service.scala | 85 ------------------- src/main/scala/xyz.driver.sbt/ServicePlugin.scala | 85 +++++++++++++++++++ src/sbt-test/sbt-settings/service/build.sbt | 2 +- 9 files changed, 251 insertions(+), 256 deletions(-) delete mode 100644 src/main/scala/xyz.driver.sbt/Library.scala create mode 100644 src/main/scala/xyz.driver.sbt/LibraryPlugin.scala create mode 100644 src/main/scala/xyz.driver.sbt/LintPlugin.scala delete mode 100644 src/main/scala/xyz.driver.sbt/Linting.scala delete mode 100644 src/main/scala/xyz.driver.sbt/Service.scala create mode 100644 src/main/scala/xyz.driver.sbt/ServicePlugin.scala diff --git a/README.md b/README.md index ab33606..5406e8d 100644 --- a/README.md +++ b/README.md @@ -29,15 +29,14 @@ activated out-of-the-box. | Name | Enabled | |--------------------------|----------------------------------------| -| Linting | automatic | -| Versioning | automatic | +| LintPlugin | automatic | +| LibraryPlugin | manual | +| ServicePlugin | manual | | IntegrationTestPackaging | automatic, if ServicePlugin is enabled | -| Library | manual | -| Service | manual | -### Linting +### Lint Plugin -*[source](src/main/scala/xyz.driver.sbt/Linting.scala)* +*[source](src/main/scala/xyz.driver.sbt/LintPlugin.scala)* - Includes configuration for scalafmt and scalastyle, modifies the `test` task to check for formatting and styling. @@ -47,14 +46,6 @@ activated out-of-the-box. This plugin can get in the way of developer productivity. If that is the case, it can simply be disabled. -### Versioning - -*[source](src/main/scala/xyz.driver.sbt/Versioning.scala)* - -Sets the project organization and reads version information from -git. It also enables overriding the version by setting a `VERSION` -environment variable (which may be useful to do from CI). - ### Integration Test Packaging *[source](src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala)* @@ -64,14 +55,16 @@ integration tests in deployed applications images. ### Library Plugin -*[source](src/main/scala/xyz.driver.sbt/Library.scala)* +*[source](src/main/scala/xyz.driver.sbt/LibraryPlugin.scala)* -Common settings for libraries. It only sets the default publish -target to Driver's artifactory. +Common settings for libraries. Sets the project organization and reads +version information from git. It also enables overriding the version +by setting a `VERSION` environment variable (which may be useful to do +from CI). ### Service Plugin -*[source](src/main/scala/xyz.driver.sbt/Service.scala)* +*[source](src/main/scala/xyz.driver.sbt/ServicePlugin.scala)* Packages an application as a docker image and provides a way to include internal TLS certificates. diff --git a/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala b/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala index c89dcec..d81edd6 100644 --- a/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala +++ b/src/main/scala/xyz.driver.sbt/IntegrationTestPackaging.scala @@ -12,7 +12,7 @@ import scala.collection.JavaConverters._ object IntegrationTestPackaging extends AutoPlugin { - override def requires = Service + override def requires = ServicePlugin override def trigger = allRequirements object autoImport { @@ -76,7 +76,7 @@ object IntegrationTestPackaging extends AutoPlugin { cp ++ tests ++ Seq(scriptFile -> s"bin/${normalizedName.value}-it") }, - Service.autoImport.customCommands := List( + ServicePlugin.autoImport.customCommands := List( "mkdir -p test", s"ln -s ${(defaultLinuxInstallLocation in Docker).value}/bin/${normalizedName.value}-it /test/run_integration_test.sh" ) diff --git a/src/main/scala/xyz.driver.sbt/Library.scala b/src/main/scala/xyz.driver.sbt/Library.scala deleted file mode 100644 index 4e63f90..0000000 --- a/src/main/scala/xyz.driver.sbt/Library.scala +++ /dev/null @@ -1,53 +0,0 @@ -package xyz.driver.sbt - -import com.typesafe.sbt.GitPlugin -import com.typesafe.sbt.SbtGit.git -import java.time.Instant -import sbt.Keys._ -import sbt._ -import sbt.plugins.JvmPlugin - -/** Common settings for a library, Driver style. */ -object Library extends AutoPlugin { - - override def requires = JvmPlugin - - lazy val repositorySettings: Seq[Setting[_]] = Seq( - resolvers += "releases" at "https://drivergrp.jfrog.io/drivergrp/releases", - resolvers += "snapshots" at "https://drivergrp.jfrog.io/drivergrp/snapshots" - ) - - lazy val publicationSettings: Seq[Setting[_]] = Seq( - organization := "xyz.driver", - publishTo := { - val jfrog = "https://drivergrp.jfrog.io/drivergrp/" - if (isSnapshot.value) Some("snapshots" at jfrog + "snapshots;build.timestamp=" + Instant.now().toEpochMilli) - else Some("releases" at jfrog + "releases") - }, - skip in publish := false - ) - - // Get version from git unless a VERSION environment variable is set - lazy val versionSettings: Seq[Setting[_]] = sys.env.get("VERSION") match { - case None => - GitPlugin.autoImport.versionWithGit ++ Seq( - git.useGitDescribe := true, // get version from git - git.baseVersion := "0.0.0" // this version is used for new projects without any commits - ) - case Some(v) => - Seq( - version := v - ) - } - - override def buildSettings = versionSettings ++ Seq( - skip in publish := true - ) - - override def projectSettings: Seq[Def.Setting[_]] = repositorySettings ++ publicationSettings ++ Seq( - javacOptions ++= Seq("-target", "1.8"), - crossScalaVersions := List("2.12.6"), - scalaVersion := crossScalaVersions.value.last - ) - -} diff --git a/src/main/scala/xyz.driver.sbt/LibraryPlugin.scala b/src/main/scala/xyz.driver.sbt/LibraryPlugin.scala new file mode 100644 index 0000000..501f2fb --- /dev/null +++ b/src/main/scala/xyz.driver.sbt/LibraryPlugin.scala @@ -0,0 +1,53 @@ +package xyz.driver.sbt + +import com.typesafe.sbt.GitPlugin +import com.typesafe.sbt.SbtGit.git +import java.time.Instant +import sbt.Keys._ +import sbt._ +import sbt.plugins.JvmPlugin + +/** Common settings for a library, Driver style. */ +object LibraryPlugin extends AutoPlugin { + + override def requires = JvmPlugin + + lazy val repositorySettings: Seq[Setting[_]] = Seq( + resolvers += "releases" at "https://drivergrp.jfrog.io/drivergrp/releases", + resolvers += "snapshots" at "https://drivergrp.jfrog.io/drivergrp/snapshots" + ) + + lazy val publicationSettings: Seq[Setting[_]] = Seq( + organization := "xyz.driver", + publishTo := { + val jfrog = "https://drivergrp.jfrog.io/drivergrp/" + if (isSnapshot.value) Some("snapshots" at jfrog + "snapshots;build.timestamp=" + Instant.now().toEpochMilli) + else Some("releases" at jfrog + "releases") + }, + skip in publish := false + ) + + // Get version from git unless a VERSION environment variable is set + lazy val versionSettings: Seq[Setting[_]] = sys.env.get("VERSION") match { + case None => + GitPlugin.autoImport.versionWithGit ++ Seq( + git.useGitDescribe := true, // get version from git + git.baseVersion := "0.0.0" // this version is used for new projects without any commits + ) + case Some(v) => + Seq( + version := v + ) + } + + override def buildSettings: Seq[sbt.Setting[_]] = versionSettings ++ Seq( + skip in publish := true + ) + + override def projectSettings: Seq[Def.Setting[_]] = repositorySettings ++ publicationSettings ++ Seq( + javacOptions ++= Seq("-target", "1.8"), + crossScalaVersions := List("2.12.6"), + scalaVersion := crossScalaVersions.value.last + ) + +} diff --git a/src/main/scala/xyz.driver.sbt/LintPlugin.scala b/src/main/scala/xyz.driver.sbt/LintPlugin.scala new file mode 100644 index 0000000..7d882cb --- /dev/null +++ b/src/main/scala/xyz.driver.sbt/LintPlugin.scala @@ -0,0 +1,99 @@ +package xyz.driver.sbt + +import org.scalafmt.sbt.ScalafmtPlugin +import org.scalafmt.sbt.ScalafmtPlugin.autoImport._ +import org.scalastyle.sbt.ScalastylePlugin +import org.scalastyle.sbt.ScalastylePlugin.autoImport.{scalastyle, scalastyleConfig} +import sbt.Keys._ +import sbt.{Def, _} + +import scala.collection.JavaConverters._ + +/** Enforces common formatting and catches compiler warnings. */ +object LintPlugin extends AutoPlugin { + + override def requires = ScalafmtPlugin && ScalastylePlugin + override def trigger = allRequirements + + lazy val formatSettings: Seq[Def.Setting[_]] = Seq( + scalafmtConfig := { + val packaged = getClass.getClassLoader.getResourceAsStream("scalafmt.conf") + val out = file(".scalafmt.conf") + IO.write(out, IO.readBytes(packaged)) + Some(out) + }, + test in Test := { + (test in Test).value + scalafmtCheck.value + } + ) + + lazy val scalastyleSettings: Seq[Def.Setting[_]] = Seq( + scalastyleConfig := { + val stream = getClass.getClassLoader.getResourceAsStream("scalastyle-config.xml") + val out = file("scalastyle-config.xml") + IO.write(out, IO.readBytes(stream)) + out + }, + test in Test := { + (test in Test).value + (scalastyle in Test).toTask("").value + } + ) + + lazy val scalacSettings: Seq[Def.Setting[_]] = Seq( + scalacOptions in Compile ++= Seq( + "-language:higherKinds", + "-language:implicitConversions", + "-language:postfixOps", + "-language:reflectiveCalls", // TODO this should be discouraged + "-unchecked", + "-deprecation", + "-feature", + "-encoding", + "utf8", + "-Xlint:_,-unused,-missing-interpolator", + "-Ywarn-numeric-widen", + "-Ywarn-dead-code", + "-Ywarn-unused:_,-explicits,-implicits" + ), + // Currently, scalac does not provide a way to fine-tune the treating of + // warnings as errors. Either all are considered errors + // (with -Xfatal-warnings), or none are. This hack analyzes the compiler's + // output and treats all warnings as errors, except for deprecations. + compile in Compile := { + val log = streams.value.log + val compiled = (compile in Compile).value + val problems = compiled.readSourceInfos().getAllSourceInfos.asScala.flatMap { + case (_, info) => info.getReportedProblems + } + var deprecationsOnly = true + problems.foreach { + problem => + if (!problem.message().contains("is deprecated")) { + deprecationsOnly = false + val pos = problem.position + val file = pos.sourcePath.asScala.getOrElse("?") + val line = pos.line.asScala.map(_.toString).getOrElse("?") + val col = pos.pointer.asScala.map(_.toString).getOrElse("?") + val msg = problem.message + val desc = pos.lineContent() + "\n" + pos.pointerSpace.asScala + .getOrElse("") + "^" + log.error(s"[fatal warning] $file:$line:$col $msg\n$desc") + } + } + if (!deprecationsOnly) { + throw new MessageOnlyException( + "Fatal warnings: some warnings other than deprecations were found. " + + "This failure can be ignored by removing the lint plugin from the sbt project. " + + "(E.g. add `disablePlugins(LintPlugin)` to build.sbt).") + } + compiled + } + ) + + lazy val lintSettings: Seq[Def.Setting[_]] = formatSettings ++ scalastyleSettings ++ scalacSettings + + override def projectSettings: Seq[Def.Setting[_]] = inConfig(Compile)(lintSettings) ++ inConfig(Test)(lintSettings) + +} diff --git a/src/main/scala/xyz.driver.sbt/Linting.scala b/src/main/scala/xyz.driver.sbt/Linting.scala deleted file mode 100644 index 4afca9a..0000000 --- a/src/main/scala/xyz.driver.sbt/Linting.scala +++ /dev/null @@ -1,97 +0,0 @@ -package xyz.driver.sbt - -import org.scalafmt.sbt.ScalafmtPlugin -import org.scalafmt.sbt.ScalafmtPlugin.autoImport._ -import org.scalastyle.sbt.ScalastylePlugin -import org.scalastyle.sbt.ScalastylePlugin.autoImport.{scalastyle, scalastyleConfig} -import sbt.Keys._ -import sbt._ - -import scala.collection.JavaConverters._ - -/** Enforces common formatting and catches compiler warnings. */ -object Linting extends AutoPlugin { - - override def requires = ScalafmtPlugin && ScalastylePlugin - override def trigger = allRequirements - - lazy val formatSettings: Seq[Def.Setting[_]] = Seq( - scalafmtConfig := { - val packaged = getClass.getClassLoader.getResourceAsStream("scalafmt.conf") - val out = file(".scalafmt.conf") - IO.write(out, IO.readBytes(packaged)) - Some(out) - }, - test in Test := { - (test in Test).value - scalafmtCheck.value - } - ) - - lazy val scalastyleSettings: Seq[Def.Setting[_]] = Seq( - scalastyleConfig := { - val stream = getClass.getClassLoader.getResourceAsStream("scalastyle-config.xml") - val out = file("scalastyle-config.xml") - IO.write(out, IO.readBytes(stream)) - out - }, - test in Test := { - (test in Test).value - (scalastyle in Test).toTask("").value - } - ) - - lazy val scalacSettings: Seq[Def.Setting[_]] = Seq( - scalacOptions in Compile ++= Seq( - "-language:higherKinds", - "-language:implicitConversions", - "-language:postfixOps", - "-language:reflectiveCalls", // TODO this should be discouraged - "-unchecked", - "-deprecation", - "-feature", - "-encoding", - "utf8", - "-Xlint:_,-unused,-missing-interpolator", - "-Ywarn-numeric-widen", - "-Ywarn-dead-code", - "-Ywarn-unused:_,-explicits,-implicits" - ), - // Currently, scalac does not provide a way to fine-tune the treating of - // warnings as errors. Either all are considered errors - // (with -Xfatal-warnings), or none are. This hack analyzes the compiler's - // output and treats all warnings as errors, except for deprecations. - compile in Compile := { - val log = streams.value.log - val compiled = (compile in Compile).value - val problems = compiled.readSourceInfos().getAllSourceInfos.asScala.flatMap { - case (_, info) => info.getReportedProblems - } - var deprecationsOnly = true - problems.foreach { - problem => - if (!problem.message().contains("is deprecated")) { - deprecationsOnly = false - val pos = problem.position - val file = pos.sourcePath.asScala.getOrElse("?") - val line = pos.line.asScala.map(_.toString).getOrElse("?") - val col = pos.pointer.asScala.map(_.toString).getOrElse("?") - val msg = problem.message - val desc = pos.lineContent() + "\n" + pos.pointerSpace.asScala - .getOrElse("") + "^" - log.error(s"[fatal warning] $file:$line:$col $msg\n$desc") - } - } - if (!deprecationsOnly) - throw new MessageOnlyException( - "Fatal warnings: some warnings other than deprecations were found. Disable " + - "the `Linting` plugin to ignore fatal warnings.") - compiled - } - ) - - lazy val lintSettings = formatSettings ++ scalastyleSettings ++ scalacSettings - - override def projectSettings: Seq[Def.Setting[_]] = inConfig(Compile)(lintSettings) ++ inConfig(Test)(lintSettings) - -} diff --git a/src/main/scala/xyz.driver.sbt/Service.scala b/src/main/scala/xyz.driver.sbt/Service.scala deleted file mode 100644 index 5a9fd52..0000000 --- a/src/main/scala/xyz.driver.sbt/Service.scala +++ /dev/null @@ -1,85 +0,0 @@ -package xyz.driver.sbt - -import com.typesafe.sbt.GitPlugin.autoImport._ -import com.typesafe.sbt.SbtNativePackager.Universal -import com.typesafe.sbt.packager.Keys._ -import com.typesafe.sbt.packager.archetypes.JavaAppPackaging -import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport.Docker -import com.typesafe.sbt.packager.docker.{Cmd, DockerPlugin} -import java.time.Instant -import sbt.Keys._ -import sbt.{Def, _} -import sbtbuildinfo.BuildInfoPlugin -import sbtbuildinfo.BuildInfoPlugin.autoImport._ - -/** Common settings to a service. */ -object Service extends AutoPlugin { - - override def requires = BuildInfoPlugin && DockerPlugin && JavaAppPackaging - - object autoImport { - val customCommands = taskKey[List[String]]("Additional commands that are run as part of docker packaging.") - } - import autoImport._ - - lazy val buildInfoSettings = Seq( - buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, git.gitHeadCommit), - buildInfoPackage := organization.value, - buildInfoOptions += BuildInfoOption.BuildTime - ) - - lazy val dockerSettings = Seq( - name in Docker := name.value, - // Settings reference http://www.scala-sbt.org/sbt-native-packager/formats/docker.html - maintainer in Docker := "Driver Inc. ", - aggregate in Docker := true, // include subprojects, - dockerRepository := Some("gcr.io/driverinc-sandbox"), - dockerUpdateLatest := true, // automatically update the latest tag - dockerBaseImage := "openjdk:11", - dockerLabels := Map( - "build.timestamp" -> Instant.now().toString - ) ++ git.gitHeadCommit.value.map("git.commit" -> _), - customCommands := Nil, - dockerCommands := dockerCommands.value.flatMap { // @see http://blog.codacy.com/2015/07/16/dockerizing-scala/ - case cmd @ Cmd("FROM", _) => cmd :: customCommands.value.map(customCommand => Cmd("RUN", customCommand)) - case other => List(other) - }, - bashScriptExtraDefines += { - s"""|if [[ -f /etc/${name.value}/ssl/issuing_ca ]]; then - | keytool -import \ - | -alias driverincInternal \ - | -cacerts \ - | -file /etc/${name.value}/ssl/issuing_ca \ - | -storepass changeit -noprompt \ - | || exit 1 - |else - | echo "No truststore customization." >&2 - |fi - |""".stripMargin - }, - javaOptions in Universal ++= Seq( - // -J params will be added as jvm parameters - - // Leave some space for overhead, such as running a debug shell in a - // container under heavy load. This may need to be tweaked if heavy use of - // off-heap memory is made. - "-J-XX:MaxRAMPercentage=90" - ) - ) - - override def projectSettings: Seq[Def.Setting[_]] = - Library.repositorySettings ++ buildInfoSettings ++ dockerSettings ++ Seq( - organization := "xyz.driver", - crossScalaVersions := List("2.12.6"), - scalaVersion := crossScalaVersions.value.last, - publish := { - streams.value.log - .warn(s"Project ${name.value} is a service and will therefore not be published to an artifactory.") - } - ) - - override def buildSettings: Seq[Def.Setting[_]] = - addCommandAlias("start", "reStart") ++ - addCommandAlias("stop", "reStop") - -} diff --git a/src/main/scala/xyz.driver.sbt/ServicePlugin.scala b/src/main/scala/xyz.driver.sbt/ServicePlugin.scala new file mode 100644 index 0000000..82e20de --- /dev/null +++ b/src/main/scala/xyz.driver.sbt/ServicePlugin.scala @@ -0,0 +1,85 @@ +package xyz.driver.sbt + +import com.typesafe.sbt.GitPlugin.autoImport._ +import com.typesafe.sbt.SbtNativePackager.Universal +import com.typesafe.sbt.packager.Keys._ +import com.typesafe.sbt.packager.archetypes.JavaAppPackaging +import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport.Docker +import com.typesafe.sbt.packager.docker.{Cmd, DockerPlugin} +import java.time.Instant +import sbt.Keys._ +import sbt.{Def, _} +import sbtbuildinfo.BuildInfoPlugin +import sbtbuildinfo.BuildInfoPlugin.autoImport._ + +/** Common settings to a service. */ +object ServicePlugin extends AutoPlugin { + + override def requires = BuildInfoPlugin && DockerPlugin && JavaAppPackaging + + object autoImport { + val customCommands = taskKey[List[String]]("Additional commands that are run as part of docker packaging.") + } + import autoImport._ + + lazy val buildInfoSettings = Seq( + buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion, git.gitHeadCommit), + buildInfoPackage := organization.value, + buildInfoOptions += BuildInfoOption.BuildTime + ) + + lazy val dockerSettings = Seq( + name in Docker := name.value, + // Settings reference http://www.scala-sbt.org/sbt-native-packager/formats/docker.html + maintainer in Docker := "Driver Inc. ", + aggregate in Docker := true, // include subprojects, + dockerRepository := Some("gcr.io/driverinc-sandbox"), + dockerUpdateLatest := true, // automatically update the latest tag + dockerBaseImage := "openjdk:11", + dockerLabels := Map( + "build.timestamp" -> Instant.now().toString + ) ++ git.gitHeadCommit.value.map("git.commit" -> _), + customCommands := Nil, + dockerCommands := dockerCommands.value.flatMap { // @see http://blog.codacy.com/2015/07/16/dockerizing-scala/ + case cmd @ Cmd("FROM", _) => cmd :: customCommands.value.map(customCommand => Cmd("RUN", customCommand)) + case other => List(other) + }, + bashScriptExtraDefines += { + s"""|if [[ -f /etc/${name.value}/ssl/issuing_ca ]]; then + | keytool -import \ + | -alias driverincInternal \ + | -cacerts \ + | -file /etc/${name.value}/ssl/issuing_ca \ + | -storepass changeit -noprompt \ + | || exit 1 + |else + | echo "No truststore customization." >&2 + |fi + |""".stripMargin + }, + javaOptions in Universal ++= Seq( + // -J params will be added as jvm parameters + + // Leave some space for overhead, such as running a debug shell in a + // container under heavy load. This may need to be tweaked if heavy use of + // off-heap memory is made. + "-J-XX:MaxRAMPercentage=90" + ) + ) + + override def projectSettings: Seq[Def.Setting[_]] = + LibraryPlugin.repositorySettings ++ buildInfoSettings ++ dockerSettings ++ Seq( + organization := "xyz.driver", + crossScalaVersions := List("2.12.6"), + scalaVersion := crossScalaVersions.value.last, + publish := { + streams.value.log + .warn(s"Project ${name.value} is a service and will therefore not be published to an artifactory.") + } + ) + + override def buildSettings: Seq[Def.Setting[_]] = + addCommandAlias("start", "reStart") ++ + addCommandAlias("stop", "reStop") + +} diff --git a/src/sbt-test/sbt-settings/service/build.sbt b/src/sbt-test/sbt-settings/service/build.sbt index c55af36..f09443e 100644 --- a/src/sbt-test/sbt-settings/service/build.sbt +++ b/src/sbt-test/sbt-settings/service/build.sbt @@ -1,3 +1,3 @@ lazy val service = project .in(file(".")) - .enablePlugins(Service) + .enablePlugins(ServicePlugin) -- cgit v1.2.3