From 7f937c47d9ed91e638486a3db7122703ca771e4d Mon Sep 17 00:00:00 2001 From: Benjamin Benoist Date: Fri, 18 Nov 2022 13:08:20 +0100 Subject: [PATCH] Use sbt-snowplow-release and publish distroless version (close #115) --- .github/workflows/ci.yml | 35 +++++++++++-- build.sbt | 98 +++++++++---------------------------- project/BuildSettings.scala | 90 +++++++++++++++++++++++++++++++--- project/plugins.sbt | 1 + 4 files changed, 136 insertions(+), 88 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34b2d33..e081a78 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -80,16 +80,23 @@ jobs: uses: actions/setup-java@v1 with: java-version: 11 - - name: Get current version - id: ver - run: echo "::set-output name=tag::${GITHUB_REF#refs/tags/}" - name: Docker login run: docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD env: DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }} DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }} + - name: Get current version + id: ver + run: echo "::set-output name=tag::${GITHUB_REF#refs/tags/}" + - name: Get app base directory (distroless) + id: baseDirectoryDistroless + run: | + export BASE_DIRECTORY_DISTROLESS=$(sbt "project igluServerDistroless" baseDirectory -Dsbt.log.noformat=true | sed -n '/\[info\]/ s/\[info\] //p' | tail -1 | tr -d '\n') + echo "::set-output name=directory::$BASE_DIRECTORY_DISTROLESS" - name: Stage the Docker build - run: sbt docker:stage + run: sbt "project igluServer" docker:stage + - name: Stage the Docker distroless build + run: sbt "project igluServerDistroless" docker:stage - name: Docker metadata id: meta uses: docker/metadata-action@v3 @@ -97,7 +104,19 @@ jobs: images: snowplow/iglu-server tags: | type=raw,value=latest,enable=${{ !contains(steps.ver.outputs.tag, 'rc') }} + type=raw,value=latest-focal,enable=${{ !contains(steps.ver.outputs.tag, 'rc') }} type=raw,value=${{ steps.ver.outputs.tag }} + type=raw,value=${{ steps.ver.outputs.tag }}-focal + flavor: | + latest=false + - name: Docker metadata distroless + id: meta-distroless + uses: docker/metadata-action@v3 + with: + images: snowplow/iglu-server + tags: | + type=raw,value=latest-distroless,enable=${{ !contains(steps.ver.outputs.tag, 'rc') }} + type=raw,value=${{ steps.ver.outputs.tag }}-distroless flavor: | latest=false - name: Set up QEMU @@ -108,7 +127,13 @@ jobs: uses: docker/build-push-action@v2 with: context: target/docker/stage - file: target/docker/stage/Dockerfile platforms: linux/amd64,linux/arm64/v8 tags: ${{ steps.meta.outputs.tags }} push: true + - name: Push distroless image + uses: docker/build-push-action@v2 + with: + context: ${{ steps.baseDirectoryDistroless.outputs.directory }}/target/docker/stage + platforms: linux/amd64,linux/arm64/v8 + tags: ${{ steps.meta-distroless.outputs.tags }} + push: true diff --git a/build.sbt b/build.sbt index 27fa8c9..e81c0c7 100644 --- a/build.sbt +++ b/build.sbt @@ -1,77 +1,23 @@ -lazy val root = (project in file(".")) - .settings( - organization := "com.snowplowanalytics", - name := "iglu-server", - scalaVersion := "2.12.9", - libraryDependencies ++= Dependencies.all, - scalacOptions ++= Seq( - "-deprecation", // Emit warning and location for usages of deprecated APIs. - "-encoding", "utf-8", // Specify character encoding used by source files. - "-explaintypes", // Explain type errors in more detail. - "-feature", // Emit warning and location for usages of features that should be imported explicitly. - "-language:existentials", // Existential types (besides wildcard types) can be written and inferred - "-language:experimental.macros", // Allow macro definition (besides implementation and application) - "-language:higherKinds", // Allow higher-kinded types - "-language:implicitConversions", // Allow definition of implicit functions called views - "-unchecked", // Enable additional warnings where generated code depends on assumptions. - "-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access. - "-Xfatal-warnings", // Fail the compilation if there are any warnings. - "-Xfuture", // Turn on future language features. - "-Xlint:adapted-args", // Warn if an argument list is modified to match the receiver. - "-Xlint:by-name-right-associative", // By-name parameter of right associative operator. - "-Xlint:constant", // Evaluation of a constant arithmetic expression results in an error. - "-Xlint:delayedinit-select", // Selecting member of DelayedInit. - "-Xlint:doc-detached", // A Scaladoc comment appears to be detached from its element. - "-Xlint:inaccessible", // Warn about inaccessible types in method signatures. - "-Xlint:infer-any", // Warn when a type argument is inferred to be `Any`. - "-Xlint:missing-interpolator", // A string literal appears to be missing an interpolator id. - "-Xlint:nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. - "-Xlint:nullary-unit", // Warn when nullary methods return Unit. - "-Xlint:option-implicit", // Option.apply used implicit view. - "-Xlint:package-object-classes", // Class or object defined in package object. - "-Xlint:poly-implicit-overload", // Parameterized overloaded implicit methods are not visible as view bounds. - "-Xlint:private-shadow", // A private field (or class parameter) shadows a superclass field. - "-Xlint:stars-align", // Pattern sequence wildcard must align with sequence component. - "-Xlint:type-parameter-shadow", // A local type parameter shadows a type already in scope. - "-Xlint:unsound-match", // Pattern match may not be typesafe. - "-Yno-adapted-args", // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver. - "-Ypartial-unification", // Enable partial unification in type constructor inference - "-Ywarn-dead-code", // Warn when dead code is identified. - "-Ywarn-extra-implicit", // Warn when more than one implicit parameter section is defined. - "-Ywarn-inaccessible", // Warn about inaccessible types in method signatures. - "-Ywarn-infer-any", // Warn when a type argument is inferred to be `Any`. - "-Ywarn-nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. - "-Ywarn-nullary-unit", // Warn when nullary methods return Unit. - "-Ywarn-numeric-widen", // Warn when numerics are widened. - "-Ywarn-unused:implicits", // Warn if an implicit parameter is unused. - "-Ywarn-unused:imports", // Warn if an import selector is not referenced. - "-Ywarn-unused:locals", // Warn if a local definition is unused. - "-Ywarn-unused:params", // Warn if a value parameter is unused. - "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. - "-Ywarn-unused:privates", // Warn if a private member is unused. - "-Ywarn-value-discard" // Warn when non-Unit expression results are unused. - ), - Global / cancelable := true, - Compile / console / scalacOptions --= Seq("-Ywarn-unused:imports", "-Xfatal-warnings") - ) - .settings(BuildSettings.dockerSettings) - .enablePlugins(JavaAppPackaging) - .enablePlugins(BuildInfoPlugin) - .enablePlugins(DockerPlugin) - .settings( - buildInfoKeys := Seq[BuildInfoKey]( - organization, name, version, - BuildInfoKey.constant("SwaggerUI", Dependencies.V.SwaggerUi) // Necessary for StaticService - ), - buildInfoPackage := "com.snowplowanalytics.iglu.server.generated", +lazy val allSettings = BuildSettings.projectSettings ++ + BuildSettings.buildInfoSettings ++ + BuildSettings.dockerSettings ++ + BuildSettings.assemblySettings ++ + BuildSettings.dynVerSettings ++ + BuildSettings.testsSettings ++ + BuildSettings.compilerSettings ++ + (libraryDependencies ++= Dependencies.all) - ) - .settings( - addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.9") - ) - .settings(BuildSettings.assemblySettings) - .settings( - Test / parallelExecution := false, // Because we have several specs that use the database - ThisBuild / dynverVTagPrefix := false, // Otherwise git tags required to have v-prefix - ThisBuild / dynverSeparator := "-" // to be compatible with docker - ) +lazy val root = project + .settings(BuildSettings.projectSettings) + .settings(BuildSettings.dynVerSettings) + .settings(BuildSettings.compilerSettings) + .aggregate(igluServer) + +lazy val igluServer = (project in file(".")) + .settings(allSettings) + .enablePlugins(JavaAppPackaging, BuildInfoPlugin, SnowplowDockerPlugin) + +lazy val igluServerDistroless = (project in file("./distroless")) + .settings(allSettings) + .settings(sourceDirectory := (igluServer / sourceDirectory).value) + .enablePlugins(JavaAppPackaging, BuildInfoPlugin, SnowplowDistrolessDockerPlugin) diff --git a/project/BuildSettings.scala b/project/BuildSettings.scala index 8119eef..1021c73 100644 --- a/project/BuildSettings.scala +++ b/project/BuildSettings.scala @@ -17,20 +17,33 @@ import sbt._ import Keys._ import sbtassembly.AssemblyPlugin.autoImport._ + +import sbtdynver.DynVerPlugin.autoImport._ + +import sbtbuildinfo.BuildInfoPlugin.autoImport.{BuildInfoKey, buildInfoKeys, buildInfoPackage} + import com.typesafe.sbt.packager.Keys.maintainer import com.typesafe.sbt.packager.linux.LinuxPlugin.autoImport._ import com.typesafe.sbt.packager.docker.DockerPlugin.autoImport._ object BuildSettings { + lazy val projectSettings = Seq( + organization := "com.snowplowanalytics", + name := "iglu-server", + scalaVersion := "2.12.9", + licenses += ("Apache-2.0", url("http://www.apache.org/licenses/LICENSE-2.0.html")) + ) + + lazy val buildInfoSettings = Seq( + buildInfoKeys := Seq[BuildInfoKey]( + organization, name, version, + BuildInfoKey.constant("SwaggerUI", Dependencies.V.SwaggerUi) // Necessary for StaticService + ), + buildInfoPackage := "com.snowplowanalytics.iglu.server.generated" + ) + lazy val dockerSettings = Seq( - dockerBaseImage := "eclipse-temurin:11-jre-focal", - Docker / maintainer := "Snowplow Analytics Ltd. ", - dockerUpdateLatest := true, - dockerRepository := Some("snowplow"), - Docker / daemonUserUid := None, - Docker / daemonUser := "daemon", - Docker / defaultLinuxInstallLocation := "/opt/snowplow", dockerCmd := Seq("--help") ) @@ -44,4 +57,67 @@ object BuildSettings { oldStrategy(x) } ) + + lazy val dynVerSettings = Seq( + ThisBuild / dynverVTagPrefix := false, // Otherwise git tags required to have v-prefix + ThisBuild / dynverSeparator := "-" // to be compatible with docker + ) + + lazy val testsSettings = Seq( + Global / cancelable := true, + Test / parallelExecution := false // Because we have several specs that use the database + ) + + lazy val compilerSettings = Seq( + javacOptions := Seq("-source", "11", "-target", "11"), + addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.9"), + Compile / console / scalacOptions --= Seq("-Ywarn-unused:imports", "-Xfatal-warnings"), + scalacOptions ++= Seq( + "-deprecation", // Emit warning and location for usages of deprecated APIs. + "-encoding", "utf-8", // Specify character encoding used by source files. + "-explaintypes", // Explain type errors in more detail. + "-feature", // Emit warning and location for usages of features that should be imported explicitly. + "-language:existentials", // Existential types (besides wildcard types) can be written and inferred + "-language:experimental.macros", // Allow macro definition (besides implementation and application) + "-language:higherKinds", // Allow higher-kinded types + "-language:implicitConversions", // Allow definition of implicit functions called views + "-unchecked", // Enable additional warnings where generated code depends on assumptions. + "-Xcheckinit", // Wrap field accessors to throw an exception on uninitialized access. + "-Xfatal-warnings", // Fail the compilation if there are any warnings. + "-Xfuture", // Turn on future language features. + "-Xlint:adapted-args", // Warn if an argument list is modified to match the receiver. + "-Xlint:by-name-right-associative", // By-name parameter of right associative operator. + "-Xlint:constant", // Evaluation of a constant arithmetic expression results in an error. + "-Xlint:delayedinit-select", // Selecting member of DelayedInit. + "-Xlint:doc-detached", // A Scaladoc comment appears to be detached from its element. + "-Xlint:inaccessible", // Warn about inaccessible types in method signatures. + "-Xlint:infer-any", // Warn when a type argument is inferred to be `Any`. + "-Xlint:missing-interpolator", // A string literal appears to be missing an interpolator id. + "-Xlint:nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Xlint:nullary-unit", // Warn when nullary methods return Unit. + "-Xlint:option-implicit", // Option.apply used implicit view. + "-Xlint:package-object-classes", // Class or object defined in package object. + "-Xlint:poly-implicit-overload", // Parameterized overloaded implicit methods are not visible as view bounds. + "-Xlint:private-shadow", // A private field (or class parameter) shadows a superclass field. + "-Xlint:stars-align", // Pattern sequence wildcard must align with sequence component. + "-Xlint:type-parameter-shadow", // A local type parameter shadows a type already in scope. + "-Xlint:unsound-match", // Pattern match may not be typesafe. + "-Yno-adapted-args", // Do not adapt an argument list (either by inserting () or creating a tuple) to match the receiver. + "-Ypartial-unification", // Enable partial unification in type constructor inference + "-Ywarn-dead-code", // Warn when dead code is identified. + "-Ywarn-extra-implicit", // Warn when more than one implicit parameter section is defined. + "-Ywarn-inaccessible", // Warn about inaccessible types in method signatures. + "-Ywarn-infer-any", // Warn when a type argument is inferred to be `Any`. + "-Ywarn-nullary-override", // Warn when non-nullary `def f()' overrides nullary `def f'. + "-Ywarn-nullary-unit", // Warn when nullary methods return Unit. + "-Ywarn-numeric-widen", // Warn when numerics are widened. + "-Ywarn-unused:implicits", // Warn if an implicit parameter is unused. + "-Ywarn-unused:imports", // Warn if an import selector is not referenced. + "-Ywarn-unused:locals", // Warn if a local definition is unused. + "-Ywarn-unused:params", // Warn if a value parameter is unused. + "-Ywarn-unused:patvars", // Warn if a variable bound in a pattern is unused. + "-Ywarn-unused:privates", // Warn if a private member is unused. + "-Ywarn-value-discard" // Warn when non-Unit expression results are unused. + ) + ) } diff --git a/project/plugins.sbt b/project/plugins.sbt index 4b10741..ecf2bae 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -5,3 +5,4 @@ addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.7.3") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.9.0") addSbtPlugin("com.dwijnand" % "sbt-dynver" % "4.1.1") addSbtPlugin("org.scalameta" % "sbt-scalafmt" % "2.4.2") +addSbtPlugin("com.snowplowanalytics" % "sbt-snowplow-release" % "0.1.0") \ No newline at end of file