build.sbt (245 lines of code) (raw):
Global / onChangedBuildSource := ReloadOnSourceChanges
Global / excludeLintKeys += scalacOptions
// All Twitter library releases are date versioned as YY.MM.patch
val releaseVersion = "24.8.0-SNAPSHOT"
val logbackVersion = "1.2.11"
val opencensusVersion = "0.19.1"
val slf4jVersion = "1.7.30"
def util(which: String) = "com.twitter" %% ("util-" + which) % releaseVersion
def finagle(which: String) = "com.twitter" %% ("finagle-" + which) % releaseVersion
lazy val noPublishSettings = Seq(
publish / skip := true
)
def gcJavaOptions: Seq[String] = {
val javaVersion = System.getProperty("java.version")
if (javaVersion.startsWith("1.8")) {
jdk8GcJavaOptions
} else {
jdk11GcJavaOptions
}
}
def jdk8GcJavaOptions: Seq[String] = {
Seq(
"-XX:+UseParNewGC",
"-XX:+UseConcMarkSweepGC",
"-XX:+CMSParallelRemarkEnabled",
"-XX:+CMSClassUnloadingEnabled",
"-XX:ReservedCodeCacheSize=128m",
"-XX:SurvivorRatio=128",
"-XX:MaxTenuringThreshold=0",
"-Xss8M",
"-Xms512M",
"-Xmx2G"
)
}
def jdk11GcJavaOptions: Seq[String] = {
Seq(
"-XX:+UseConcMarkSweepGC",
"-XX:+CMSParallelRemarkEnabled",
"-XX:+CMSClassUnloadingEnabled",
"-XX:ReservedCodeCacheSize=128m",
"-XX:SurvivorRatio=128",
"-XX:MaxTenuringThreshold=0",
"-Xss8M",
"-Xms512M",
"-Xmx2G"
)
}
def travisTestJavaOptions: Seq[String] = {
// We have some custom configuration for the Travis environment
// https://docs.travis-ci.com/user/environment-variables/#default-environment-variables
val travisBuild = sys.env.getOrElse("TRAVIS", "false").toBoolean
if (travisBuild) {
Seq(
"-DSKIP_FLAKY=true",
"-DSKIP_FLAKY_TRAVIS=true"
)
} else {
Seq(
"-DSKIP_FLAKY=true"
)
}
}
lazy val sharedSettings = Seq(
version := releaseVersion,
organization := "com.twitter",
scalaVersion := "2.13.6",
crossScalaVersions := Seq("2.12.12", "2.13.6"),
Test / fork := true, // We have to fork to get the JavaOptions
libraryDependencies ++= Seq(
// See https://www.scala-sbt.org/0.13/docs/Testing.html#JUnit
"com.novocode" % "junit-interface" % "0.11" % "test",
"org.mockito" % "mockito-all" % "1.9.5" % "test",
"org.scalacheck" %% "scalacheck" % "1.15.4" % "test",
"org.scalatest" %% "scalatest" % "3.1.2" % "test",
"org.scalatestplus" %% "junit-4-12" % "3.1.2.0" % "test",
"org.scalatestplus" %% "mockito-1-10" % "3.1.0.0" % "test",
"org.scalatestplus" %% "scalacheck-1-14" % "3.1.2.0" % "test"
),
ivyXML :=
<dependencies>
<exclude org="com.sun.jmx" module="jmxri" />
<exclude org="com.sun.jdmk" module="jmxtools" />
<exclude org="javax.jms" module="jms" />
</dependencies>,
scalacOptions ++= Seq(
"-target:jvm-1.8",
"-deprecation",
"-unchecked",
"-feature",
"-Xlint",
"-encoding",
"utf8"
),
javacOptions ++= Seq("-Xlint:unchecked", "-source", "1.8", "-target", "1.8"),
doc / javacOptions := Seq("-source", "1.8"),
javaOptions ++= Seq(
"-Djava.net.preferIPv4Stack=true",
"-XX:+AggressiveOpts",
"-server"
),
javaOptions ++= gcJavaOptions,
Test / javaOptions ++= travisTestJavaOptions,
// This is bad news for things like com.twitter.util.Time
Test / parallelExecution := false,
// -a: print stack traces for failing asserts
testOptions += Tests.Argument(TestFrameworks.JUnit, "-a"),
// Sonatype publishing
Test / publishArtifact := false,
pomIncludeRepository := { _ => false },
publishMavenStyle := true,
publishConfiguration := publishConfiguration.value.withOverwrite(true),
publishLocalConfiguration := publishLocalConfiguration.value.withOverwrite(true),
autoAPIMappings := true,
apiURL := Some(url("https://twitter.github.io/twitter-server/docs/")),
pomExtra :=
<url>https://github.com/twitter/twitter-server</url>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>https://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<scm>
<url>git@github.com:twitter/twitter-server.git</url>
<connection>scm:git:git@github.com:twitter/twitter-server.git</connection>
</scm>
<developers>
<developer>
<id>twitter</id>
<name>Twitter Inc.</name>
<url>https://www.twitter.com/</url>
</developer>
</developers>,
publishTo := {
val nexus = "https://oss.sonatype.org/"
if (version.value.trim.endsWith("SNAPSHOT"))
Some("snapshots" at nexus + "content/repositories/snapshots")
else
Some("releases" at nexus + "service/local/staging/deploy/maven2")
}
)
lazy val root = (project in file("."))
.enablePlugins(
ScalaUnidocPlugin
)
.settings(sharedSettings)
.settings(noPublishSettings)
.aggregate(
twitterServer,
twitterServerOpenCensus,
twitterServerSlf4jJdk14,
twitterServerSlf4jLog4j12,
twitterServerSlf4jLogbackClassic)
lazy val twitterServer = (project in file("server"))
.enablePlugins(
ScalaUnidocPlugin
)
.settings(name := "twitter-server", moduleName := "twitter-server", sharedSettings)
.settings(
libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-api" % slf4jVersion,
finagle("core"),
finagle("http"),
finagle("stats-core"),
finagle("toggle"),
finagle("tunable"),
util("app"),
util("core"),
util("jackson"),
util("jvm"),
util("lint"),
util("registry"),
util("slf4j-api"),
util("slf4j-jul-bridge"),
util("tunable")
)
)
lazy val twitterServerOpenCensus = (project in file("opencensus"))
.enablePlugins(
ScalaUnidocPlugin
)
.settings(
name := "twitter-server-opencensus",
moduleName := "twitter-server-opencensus",
sharedSettings)
.settings(
libraryDependencies ++= Seq(
finagle("core"),
finagle("http"),
"io.opencensus" % "opencensus-api" % opencensusVersion,
"io.opencensus" % "opencensus-contrib-zpages" % opencensusVersion
))
.dependsOn(twitterServer)
lazy val twitterServerSlf4jJdk14 = (project in file("slf4j-jdk14"))
.settings(
name := "twitter-server-slf4j-jdk14",
moduleName := "twitter-server-slf4j-jdk14",
sharedSettings)
.settings(libraryDependencies ++= Seq(
"org.slf4j" % "slf4j-api" % slf4jVersion,
"org.slf4j" % "slf4j-jdk14" % slf4jVersion,
"org.slf4j" % "jcl-over-slf4j" % slf4jVersion,
"org.slf4j" % "log4j-over-slf4j" % slf4jVersion
))
.dependsOn(twitterServer)
lazy val twitterServerSlf4jLog4j12 = (project in file("slf4j-log4j12"))
.settings(
name := "twitter-server-slf4j-log4j12",
moduleName := "twitter-server-slf4j-log4j12",
sharedSettings)
.settings(libraryDependencies ++= Seq(
"log4j" % "log4j" % "1.2.17" % "provided",
"org.slf4j" % "slf4j-api" % slf4jVersion,
"org.slf4j" % "slf4j-log4j12" % slf4jVersion,
"org.slf4j" % "jcl-over-slf4j" % slf4jVersion,
"org.slf4j" % "jul-to-slf4j" % slf4jVersion
))
.dependsOn(twitterServer)
lazy val twitterServerSlf4jLogbackClassic = (project in file("logback-classic"))
.settings(
name := "twitter-server-logback-classic",
moduleName := "twitter-server-logback-classic",
sharedSettings)
.settings(libraryDependencies ++= Seq(
"ch.qos.logback" % "logback-classic" % logbackVersion % "provided",
"ch.qos.logback" % "logback-core" % logbackVersion % "provided",
"org.slf4j" % "slf4j-api" % slf4jVersion,
"org.slf4j" % "jcl-over-slf4j" % slf4jVersion,
"org.slf4j" % "jul-to-slf4j" % slf4jVersion,
"org.slf4j" % "log4j-over-slf4j" % slf4jVersion
))
.dependsOn(twitterServer)
lazy val twitterServerDoc = (project in file("doc"))
.enablePlugins(
ScalaUnidocPlugin,
SphinxPlugin
)
.settings(
name := "twitter-server-doc",
sharedSettings,
Seq(
doc / scalacOptions ++= Seq("-doc-title", "TwitterServer", "-doc-version", version.value),
Sphinx / includeFilter := ("*.html" | "*.png" | "*.js" | "*.css" | "*.gif" | "*.txt")
)
)
.configs(DocTest).settings(inConfig(DocTest)(Defaults.testSettings): _*)
.settings(
DocTest / unmanagedSourceDirectories += baseDirectory.value / "src/sphinx/code",
// Make the "test" command run both, test and doctest:test
test := Seq(Test / test, DocTest / test).dependOn.value
)
.dependsOn(twitterServer)
/* Test Configuration for running tests on doc sources */
lazy val DocTest = config("testdoc") extend Test