diff --git a/src/main/scala/com/typesafe/sbt/packager/SettingsHelper.scala b/src/main/scala/com/typesafe/sbt/packager/SettingsHelper.scala index f4fec6e66..14b9151c0 100644 --- a/src/main/scala/com/typesafe/sbt/packager/SettingsHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/SettingsHelper.scala @@ -24,19 +24,24 @@ object SettingsHelper { deliverLocalConfiguration <<= (crossTarget, ivyLoggingLevel) map { (outDir, level) => Classpaths.deliverConfig(outDir, logging = level) }, deliverConfiguration <<= deliverLocalConfiguration, publishConfiguration <<= (packagedArtifacts, checksums, publishTo, isSnapshot) map { (as, checks, publishTo, isSnap) => - new PublishConfiguration(ivyFile = None, + new PublishConfiguration( + ivyFile = None, resolverName = Classpaths.getPublishTo(publishTo).name, artifacts = as, checksums = checks, logging = UpdateLogging.DownloadOnly, - overwrite = isSnap) + overwrite = isSnap + ) }, publishLocalConfiguration <<= (packagedArtifacts, checksums, isSnapshot) map { (as, checks, isSnap) => - new PublishConfiguration(ivyFile = None, + new PublishConfiguration( + ivyFile = None, resolverName = "local", artifacts = as, checksums = checks, logging = UpdateLogging.DownloadOnly, - overwrite = isSnap) - })) ++ addPackage(config, packageTask, extension) + overwrite = isSnap + ) + } + )) ++ addPackage(config, packageTask, extension) } \ No newline at end of file diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaApp.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaApp.scala index 331b8dedd..2b6ba5cfc 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaApp.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaApp.scala @@ -6,7 +6,7 @@ import sbt._ import sbt.Keys.{ mappings, target, name, mainClass, sourceDirectory } import packager.Keys.{ packageName, executableScriptName } import linux.{ LinuxFileMetaData, LinuxPackageMapping } -import linux.LinuxPlugin.autoImport.{linuxPackageMappings, defaultLinuxInstallLocation} +import linux.LinuxPlugin.autoImport.{ linuxPackageMappings, defaultLinuxInstallLocation } import SbtNativePackager.{ Universal, Debian } /** @@ -39,7 +39,7 @@ object JavaAppPackaging extends AutoPlugin with JavaAppStartScript { */ val batTemplate = "bat-template" - object autoImport extends JavaAppKeys + object autoImport extends JavaAppKeys import JavaAppPackaging.autoImport._ @@ -95,7 +95,8 @@ object JavaAppPackaging extends AutoPlugin with JavaAppStartScript { val d = target / installLocation d.mkdirs() LinuxPackageMapping(Seq(d -> (installLocation + "/" + name)), LinuxFileMetaData()) - }) + } + ) private def makeRelativeClasspathNames(mappings: Seq[(File, String)]): Seq[String] = for { diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBashScript.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBashScript.scala index 510ffa8d5..61aaac14b 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBashScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBashScript.scala @@ -26,7 +26,8 @@ object JavaAppBashScript { mainClass: String, appClasspath: Seq[String] = Seq("*"), configFile: Option[String] = None, - extras: Seq[String] = Nil): Seq[String] = + extras: Seq[String] = Nil + ): Seq[String] = Seq(mainClassDefine(mainClass)) ++ (configFile map configFileDefine).toSeq ++ Seq(makeClasspathDefine(appClasspath)) ++ diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBatScript.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBatScript.scala index a94fa904a..d89e001d9 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBatScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppBatScript.scala @@ -28,7 +28,8 @@ object JavaAppBatScript { name: String, mainClass: String, appClasspath: Seq[String] = Seq("*"), - extras: Seq[String] = Nil): Seq[(String, String)] = { + extras: Seq[String] = Nil + ): Seq[(String, String)] = { val replacements = Seq( "APP_NAME" -> name, "APP_ENV_NAME" -> makeEnvFriendlyName(name) @@ -50,7 +51,8 @@ object JavaAppBatScript { } def generateScript( - replacements: Seq[(String, String)], template: java.net.URL = bashTemplateSource): String = + replacements: Seq[(String, String)], template: java.net.URL = bashTemplateSource + ): String = TemplateWriter.generateScript(template, replacements, "\r\n", TemplateWriter.batFriendlyKeySurround) } \ No newline at end of file diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppKeys.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppKeys.scala index 53c14d092..41af4c682 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppKeys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaAppKeys.scala @@ -17,11 +17,13 @@ trait JavaAppKeys { val projectDependencyArtifacts = TaskKey[Seq[Attributed[File]]]("projectDependencyArtifacts", "The set of exported artifacts from our dependent projects.") val scriptClasspath = TaskKey[Seq[String]]("scriptClasspath", "A list of relative filenames (to the lib/ folder in the distribution) of what to include on the classpath.") val makeBatScript = TaskKey[Option[File]]("makeBatScript", "Creates or discovers the bat script used by this project.") - val batScriptReplacements = TaskKey[Seq[(String, String)]]("batScriptReplacements", + val batScriptReplacements = TaskKey[Seq[(String, String)]]( + "batScriptReplacements", """|Replacements of template parameters used in the windows bat script. | Default supported templates: | APP_ENV_NAME - the name of the application for defining _HOME variables | APP_NAME - the name of the app | APP_DEFINES - the defines to go into the app - | """.stripMargin) + | """.stripMargin + ) } diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala index 3513a8ca9..cb16dfd35 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerApplication.scala @@ -103,7 +103,8 @@ object JavaServerAppPackaging extends AutoPlugin { debianMakePreinstScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements) map makeMaintainerScript(Preinst), debianMakePostinstScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements) map makeMaintainerScript(Postinst), debianMakePrermScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements) map makeMaintainerScript(Prerm), - debianMakePostrmScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements) map makeMaintainerScript(Postrm)) + debianMakePostrmScript <<= (target in Universal, serverLoading in Debian, linuxScriptReplacements) map makeMaintainerScript(Postrm) + ) } def rpmSettings: Seq[Setting[_]] = { @@ -173,7 +174,8 @@ object JavaServerAppPackaging extends AutoPlugin { requiredStopFacilities: Option[String], startRunlevels: Option[String], stopRunlevels: Option[String], - loader: ServerLoader): Seq[(String, String)] = { + loader: ServerLoader + ): Seq[(String, String)] = { // Upstart cannot handle empty values val (startOn, stopOn) = loader match { @@ -238,9 +240,12 @@ object JavaServerAppPackaging extends AutoPlugin { Some(script) } - protected def makeMaintainerScript(scriptName: String, - template: Option[URL] = None, archetype: String = ARCHETYPE, config: Configuration = Debian)( - tmpDir: File, loader: ServerLoader, replacements: Seq[(String, String)]): Option[File] = { + protected def makeMaintainerScript( + scriptName: String, + template: Option[URL] = None, archetype: String = ARCHETYPE, config: Configuration = Debian + )( + tmpDir: File, loader: ServerLoader, replacements: Seq[(String, String)] + ): Option[File] = { val scriptBits = JavaServerBashScript(scriptName, archetype, config, replacements, template) getOrElse { sys.error(s"Couldn't load [$scriptName] for config [${config.name}] in archetype [$archetype]") } diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerBashScript.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerBashScript.scala index e305fea8a..f480953fd 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerBashScript.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/JavaServerBashScript.scala @@ -40,7 +40,8 @@ object JavaServerBashScript { archetype: String, config: Configuration, replacements: Seq[(String, String)], - template: Option[URL] = None): Option[String] = { + template: Option[URL] = None + ): Option[String] = { // use template or else search for a default val url = template orElse { Option(getClass getResource s"$archetype/${config.name}/$script-template") diff --git a/src/main/scala/com/typesafe/sbt/packager/archetypes/TemplateWriter.scala b/src/main/scala/com/typesafe/sbt/packager/archetypes/TemplateWriter.scala index f9a7fef28..2f6de2719 100644 --- a/src/main/scala/com/typesafe/sbt/packager/archetypes/TemplateWriter.scala +++ b/src/main/scala/com/typesafe/sbt/packager/archetypes/TemplateWriter.scala @@ -33,17 +33,20 @@ object TemplateWriter { private def replace( line: String, replacements: Seq[(String, String)], - keySurround: String => String): String = { + keySurround: String => String + ): String = { replacements.foldLeft(line) { case (line, (key, value)) => keySurround(key).r.replaceAllIn(line, java.util.regex.Matcher.quoteReplacement(value)) } } - private def replaceValues(lines: Seq[String], + private def replaceValues( + lines: Seq[String], replacements: Seq[(String, String)], eol: String, - keySurround: String => String): String = { + keySurround: String => String + ): String = { val sb = new StringBuilder for (line <- lines) { sb append replace(line, replacements, keySurround) @@ -57,7 +60,8 @@ object TemplateWriter { replacements: Seq[(String, String)], eol: String = "\n", keySurround: String => String = bashFriendlyKeySurround, - charset: java.nio.charset.Charset = defaultCharset): String = { + charset: java.nio.charset.Charset = defaultCharset + ): String = { val lines = sbt.IO.readLinesURL(source, charset) replaceValues(lines, replacements, eol, keySurround) } @@ -67,7 +71,8 @@ object TemplateWriter { replacements: Seq[(String, String)], eol: String = "\n", keySurround: String => String = bashFriendlyKeySurround, - charset: java.nio.charset.Charset = defaultCharset): String = { + charset: java.nio.charset.Charset = defaultCharset + ): String = { replaceValues(source split eol, replacements, eol, keySurround) } } \ No newline at end of file diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/DebianMetadata.scala b/src/main/scala/com/typesafe/sbt/packager/debian/DebianMetadata.scala index a908cb1bc..23fe542e4 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/DebianMetadata.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/DebianMetadata.scala @@ -7,7 +7,8 @@ case class PackageInfo( version: String, maintainer: String, summary: String, - description: String) + description: String +) /** Represents package meta used by debian when constructing packages. */ case class PackageMetaData( @@ -16,7 +17,8 @@ case class PackageMetaData( architecture: String = "all", section: String = "java", depends: Seq[String] = Seq.empty, - recommends: Seq[String] = Seq.empty) { + recommends: Seq[String] = Seq.empty +) { def makeContent(installSizeEstimate: Long = 0L): String = { // TODO: Pretty print with line wrap. val sb = new StringBuilder @@ -64,7 +66,8 @@ case class DebianControlScriptReplacements( author: String, descr: String, name: String, - version: String) { + version: String +) { /** * Generates the replacement sequence for the debian @@ -74,5 +77,6 @@ case class DebianControlScriptReplacements( "author" -> author, "descr" -> descr, "name" -> name, - "version" -> version) + "version" -> version + ) } \ No newline at end of file diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala index 20101b83f..056854910 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/DebianPlugin.scala @@ -78,7 +78,7 @@ object DebianPlugin extends AutoPlugin with DebianNativePackaging { // TODO maybe we can put settings/debiansettings together /** - * Enables native packaging by default + * Enables native packaging by default */ override lazy val projectSettings = settings ++ inConfig(Debian)(debianSettings) ++ debianNativeSettings @@ -115,12 +115,13 @@ object DebianPlugin extends AutoPlugin with DebianNativePackaging { debianMaintainerScripts <++= (debianMakePrermScript, debianControlScriptsDirectory) map scriptMapping(Names.Prerm), debianMaintainerScripts <++= (debianMakePreinstScript, debianControlScriptsDirectory) map scriptMapping(Names.Preinst), debianMaintainerScripts <++= (debianMakePostinstScript, debianControlScriptsDirectory) map scriptMapping(Names.Postinst), - debianMaintainerScripts <++= (debianMakePostrmScript, debianControlScriptsDirectory) map scriptMapping(Names.Postrm)) + debianMaintainerScripts <++= (debianMakePostrmScript, debianControlScriptsDirectory) map scriptMapping(Names.Postrm) + ) /** * == Debian scoped settings == * Everything used inside the debian scope - * + * */ private def debianSettings: Seq[Setting[_]] = inConfig(Debian)( Seq( @@ -141,7 +142,8 @@ object DebianPlugin extends AutoPlugin with DebianNativePackaging { if (data.info.description == null || data.info.description.isEmpty) { sys.error( """packageDescription in Debian cannot be empty. Use - packageDescription in Debian := "My package Description"""") + packageDescription in Debian := "My package Description"""" + ) } val cfile = dir / Names.Debian / Names.Control IO.write(cfile, data.makeContent(size), java.nio.charset.Charset.defaultCharset) @@ -215,7 +217,8 @@ object DebianPlugin extends AutoPlugin with DebianNativePackaging { linuxScriptReplacements += ("header" -> "#!/bin/sh\nset -e") // Adding package specific implementation settings - )) + ) + ) } @@ -350,4 +353,4 @@ object DebianDeployPlugin extends AutoPlugin { override def projectSettings = SettingsHelper.makeDeploymentSettings(Debian, packageBin in Debian, "deb") ++ SettingsHelper.makeDeploymentSettings(Debian, genChanges in Debian, "changes") -} +} diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/JDebPackaging.scala b/src/main/scala/com/typesafe/sbt/packager/debian/JDebPackaging.scala index 977515619..7942a67f7 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/JDebPackaging.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/JDebPackaging.scala @@ -2,7 +2,6 @@ package com.typesafe.sbt package packager package debian - import com.typesafe.sbt.packager.archetypes.TemplateWriter import com.typesafe.sbt.packager.universal.Archives import sbt._ @@ -49,7 +48,8 @@ object JDebPackaging extends AutoPlugin with DebianPluginLike { if (data.info.description == null || data.info.description.isEmpty) { sys.error( """packageDescription in Debian cannot be empty. Use - packageDescription in Debian := "My package Description"""") + packageDescription in Debian := "My package Description"""" + ) } val cfile = dir / Names.Debian / Names.Control IO.write(cfile, data.makeContent(size), java.nio.charset.Charset.defaultCharset) @@ -83,7 +83,8 @@ object JDebPackaging extends AutoPlugin with DebianPluginLike { val console = new JDebConsole(log) val archive = archiveFilename(normalizedName.value, version.value, packageArchitecture.value) val debianFile = targetDir.getParentFile / archive - val debMaker = new DebMaker(console, + val debMaker = new DebMaker( + console, fileAndDirectoryProducers(mappings, targetDir) ++ linkProducers(symlinks), conffileProducers(mappings, targetDir) ) @@ -95,8 +96,8 @@ object JDebPackaging extends AutoPlugin with DebianPluginLike { debMaker validate () debMaker makeDeb () debianFile - }) - + } + ) /** * The same as [[DebianPluginLike.copyAndFixPerms]] except chmod invocation (for windows compatibility). @@ -113,7 +114,6 @@ object JDebPackaging extends AutoPlugin with DebianPluginLike { } else IO.copyFile(from, to, true) } - /** * The same as [[DebianPluginLike.filterAndFixPerms]] except chmod invocation (for windows compatibility). * Permissions will be handled by jDeb packager itself. @@ -125,7 +125,6 @@ object JDebPackaging extends AutoPlugin with DebianPluginLike { script } - /** * Creating file and directory producers. These "produce" the * files for the debian packaging. diff --git a/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala index 93fdf5db4..99f1cb168 100644 --- a/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/debian/Keys.scala @@ -32,8 +32,10 @@ trait DebianKeys { val genChanges = TaskKey[File]("gen-changes", "runs the dpkg-genchanges command to generate the .changes file.") // Debian control scripts - val debianControlScriptsDirectory = SettingKey[File]("debian-control-scripts-directory", - "Directory where all debian control scripts reside. Default is 'src/debian/DEBIAN'") + val debianControlScriptsDirectory = SettingKey[File]( + "debian-control-scripts-directory", + "Directory where all debian control scripts reside. Default is 'src/debian/DEBIAN'" + ) val debianMakePreinstScript = TaskKey[Option[File]]("makePreinstScript", "Creates or discovers the preinst script used by this project") val debianMakePrermScript = TaskKey[Option[File]]("makePrermScript", "Creates or discovers the prerm script used by this project") val debianMakePostinstScript = TaskKey[Option[File]]("makePostInstScript", "Creates or discovers the postinst script used by this project") diff --git a/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala index 3a2796fa6..1d7c6152f 100644 --- a/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/docker/DockerPlugin.scala @@ -58,7 +58,7 @@ object DockerPlugin extends AutoPlugin { import autoImport._ override def requires = universal.UniversalPlugin - + override lazy val projectSettings = Seq( dockerBaseImage := "dockerfile/java:latest", dockerExposedPorts := Seq(), @@ -69,7 +69,8 @@ object DockerPlugin extends AutoPlugin { dockerRepository := None, dockerUpdateLatest := false, sourceDirectory in Docker <<= sourceDirectory apply (_ / "docker"), - target in Docker <<= target apply (_ / "docker") + target in Docker <<= target apply (_ / "docker"), + dockerEntrypoint := Seq("bin/%s" format executableScriptName.value) ) ++ mapGenericFilesToDocker ++ inConfig(Docker)(Seq( daemonUser := "daemon", @@ -85,7 +86,7 @@ object DockerPlugin extends AutoPlugin { }, dockerGenerateConfig <<= (dockerBaseImage, defaultLinuxInstallLocation, maintainer, daemonUser, executableScriptName, - dockerExposedPorts, dockerExposedVolumes, target) map generateDockerConfig, + dockerExposedPorts, dockerExposedVolumes, target, dockerEntrypoint) map generateDockerConfig, dockerGenerateContext := Stager.stage("docker")(streams.value, target.value / "files", mappings.value), dockerTarget <<= (dockerRepository, packageName, version) map { (repo, name, version) => @@ -105,7 +106,7 @@ object DockerPlugin extends AutoPlugin { } )) - private[this] final def makeDockerContent(dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, execScript: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String]) = { + private[this] final def makeDockerContent(dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, execScript: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String], entrypoint: Seq[String]) = { val fromCommand = Cmd("FROM", dockerBaseImage) val maintainerCommand: Option[Cmd] = { @@ -120,7 +121,7 @@ object DockerPlugin extends AutoPlugin { Cmd("WORKDIR", "%s" format dockerBaseDirectory), ExecCmd("RUN", "chown", "-R", daemonUser, "."), Cmd("USER", daemonUser), - ExecCmd("ENTRYPOINT", "bin/%s" format execScript), + ExecCmd("ENTRYPOINT", entrypoint: _*), ExecCmd("CMD") ) @@ -153,8 +154,9 @@ object DockerPlugin extends AutoPlugin { } private[this] final def generateDockerConfig( - dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, execScript: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String], target: File) = { - val dockerContent = makeDockerContent(dockerBaseImage, dockerBaseDirectory, maintainer, daemonUser, execScript, exposedPorts, exposedVolumes) + dockerBaseImage: String, dockerBaseDirectory: String, maintainer: String, daemonUser: String, execScript: String, exposedPorts: Seq[Int], exposedVolumes: Seq[String], target: File, entrypoint: Seq[String] + ) = { + val dockerContent = makeDockerContent(dockerBaseImage, dockerBaseDirectory, maintainer, daemonUser, execScript, exposedPorts, exposedVolumes, entrypoint) val f = target / "Dockerfile" IO.write(f, dockerContent) diff --git a/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala index 03ef6b015..ab2dcf95d 100644 --- a/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/docker/Keys.scala @@ -18,5 +18,6 @@ trait DockerKeys { val dockerExposedVolumes = SettingKey[Seq[String]]("dockerExposedVolumes", "Volumes exposed by Docker image") val dockerRepository = SettingKey[Option[String]]("dockerRepository", "Repository for published Docker image") val dockerUpdateLatest = SettingKey[Boolean]("dockerUpdateLatest", "Set to update latest tag") + val dockerEntrypoint = SettingKey[Seq[String]]("dockerEntrypoint", "Entrypoint arguments passed in exec form") } diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala index 16ef46871..b7150c214 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/Keys.scala @@ -23,7 +23,8 @@ trait LinuxKeys { val linuxMakeStartScript = TaskKey[Option[File]]("makeStartScript", "Creates or discovers the start script used by this project") val linuxStartScriptTemplate = TaskKey[URL]("linuxStartScriptTemplate", "The location of the template start script file we use for debian (upstart or init.d") val linuxEtcDefaultTemplate = TaskKey[URL]("linuxEtcDefaultTemplate", "The location of the /etc/default/ template script.") - val linuxScriptReplacements = SettingKey[Seq[(String, String)]]("linuxScriptReplacements", + val linuxScriptReplacements = SettingKey[Seq[(String, String)]]( + "linuxScriptReplacements", """|Replacements of template parameters used in linux scripts. | Default supported templates: | execScript - name of the script in /usr/bin @@ -36,7 +37,8 @@ trait LinuxKeys { | appClasspath - application classpath | appMainClass - main class to start | daemonUser - daemon user - """.stripMargin) + """.stripMargin + ) val makeEtcDefault = TaskKey[Option[File]]("makeEtcDefault", "Creates or discovers the /etc/default/ script") diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala index 5c91d28f0..7986e154d 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPackageMapping.scala @@ -10,7 +10,8 @@ case class LinuxFileMetaData( group: String = Users.Root, permissions: String = "755", config: String = "false", - docs: Boolean = false) { + docs: Boolean = false +) { def withUser(u: String) = copy(user = u) def withGroup(g: String) = copy(group = g) @@ -22,7 +23,8 @@ case class LinuxFileMetaData( case class LinuxPackageMapping( mappings: Traversable[(File, String)], fileData: LinuxFileMetaData = LinuxFileMetaData(), - zipped: Boolean = false) { + zipped: Boolean = false +) { def withUser(user: String) = copy(fileData = fileData withUser user) def withGroup(group: String) = copy(fileData = fileData withGroup group) diff --git a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala index 0a35a5efe..f2541a251 100644 --- a/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/linux/LinuxPlugin.scala @@ -24,7 +24,7 @@ object LinuxPlugin extends AutoPlugin { override lazy val projectSettings = linuxSettings ++ mapGenericFilesToLinux object autoImport extends LinuxKeys with LinuxMappingDSL { - val Linux = config("linux") + val Linux = config("linux") } import autoImport._ @@ -126,11 +126,11 @@ object LinuxPlugin extends AutoPlugin { } if (needsConfLink) Seq(LinuxSymlink( link = configLocation + "/" + pkg, - destination = installLocation + "/" + pkg + "/conf")) + destination = installLocation + "/" + pkg + "/conf" + )) else Seq.empty - }) - - + } + ) /** * @@ -153,7 +153,8 @@ object LinuxPlugin extends AutoPlugin { daemonGroup: String, daemonShell: String, retries: Int = 0, - retryTimeout: Int = 60): Seq[(String, String)] = + retryTimeout: Int = 60 + ): Seq[(String, String)] = Seq( "author" -> author, "descr" -> description, @@ -165,7 +166,8 @@ object LinuxPlugin extends AutoPlugin { "version" -> version, "daemon_user" -> daemonUser, "daemon_group" -> daemonGroup, - "daemon_shell" -> daemonShell) + "daemon_shell" -> daemonShell + ) /** * Load the default controlscript functions which contain @@ -224,7 +226,8 @@ object LinuxPlugin extends AutoPlugin { packageMappingWithRename((binaries ++ directories): _*) withUser user withGroup group withPerms "0755", packageMappingWithRename(compressedManPages: _*).gzipped withUser user withGroup group withPerms "0644", packageMappingWithRename(configFiles: _*) withConfig () withUser user withGroup group withPerms "0644", - packageMappingWithRename(remaining: _*) withUser user withGroup group withPerms "0644") + packageMappingWithRename(remaining: _*) withUser user withGroup group withPerms "0644" + ) } } diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/Keys.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/Keys.scala index e1cdc82d9..3de2afc20 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/Keys.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/Keys.scala @@ -42,8 +42,10 @@ trait RpmKeys { // SCRIPTS val rpmScripts = SettingKey[RpmScripts]("rpm-scripts", "Configuration of pre- and post-integration scripts.") - val rpmScriptsDirectory = SettingKey[File]("rpm-scriptlets-directory", - "Directory where all debian control scripts reside. Default is 'src/rpm/scriptlets'") + val rpmScriptsDirectory = SettingKey[File]( + "rpm-scriptlets-directory", + "Directory where all debian control scripts reside. Default is 'src/rpm/scriptlets'" + ) val rpmPretrans = SettingKey[Option[String]]("rpm-pretrans", "%pretrans scriptlet") val rpmPre = SettingKey[Option[String]]("rpm-pre", "%pre scriptlet") diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala index b375e6042..3a877f7b1 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmHelper.scala @@ -66,7 +66,8 @@ object RpmHelper { private[this] def buildPackage( workArea: File, spec: RpmSpec, - log: sbt.Logger): Unit = { + log: sbt.Logger + ): Unit = { val buildRoot = workArea / "buildroot" val specsDir = workArea / "SPECS" val gpg = false diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala index 58500e8ba..017ca0be8 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmMetadata.scala @@ -18,7 +18,8 @@ case class RpmMetadata( summary: String, description: String, autoprov: String, - autoreq: String) { + autoreq: String +) { } /** @@ -31,14 +32,16 @@ case class RpmDescription( group: Option[String] = None, packager: Option[String] = None, icon: Option[String] = None, - changelogFile: Option[String] = None) + changelogFile: Option[String] = None +) case class RpmDependencies( provides: Seq[String] = Seq.empty, requirements: Seq[String] = Seq.empty, prereq: Seq[String] = Seq.empty, obsoletes: Seq[String] = Seq.empty, - conflicts: Seq[String] = Seq.empty) { + conflicts: Seq[String] = Seq.empty +) { def contents: String = { val sb = new StringBuilder def appendSetting(prefix: String, values: Seq[String]) = @@ -59,7 +62,8 @@ case class RpmScripts( verifyscript: Option[String] = None, posttrans: Option[String] = None, preun: Option[String] = None, - postun: Option[String] = None) { + postun: Option[String] = None +) { def contents(): String = { val labelledScripts = Seq("%pretrans", "%pre", "%post", "%verifyscript", "%posttrans", "%preun", "%postun") .zip(Seq(pretrans, pre, post, verifyscript, posttrans, preun, postun)) @@ -68,12 +72,14 @@ case class RpmScripts( } -case class RpmSpec(meta: RpmMetadata, +case class RpmSpec( + meta: RpmMetadata, desc: RpmDescription = RpmDescription(), deps: RpmDependencies = RpmDependencies(), scriptlets: RpmScripts = RpmScripts(), mappings: Seq[LinuxPackageMapping] = Seq.empty, - symlinks: Seq[LinuxSymlink] = Seq.empty) { + symlinks: Seq[LinuxSymlink] = Seq.empty +) { // TODO - here we want to validate that all the data we have is ok to place // in the RPM. e.g. the Description/vendor etc. must meet specific requirements. diff --git a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala index 89b492f16..cd929d243 100644 --- a/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/rpm/RpmPlugin.scala @@ -12,12 +12,12 @@ import linux.LinuxPlugin.autoImport.{ linuxPackageMappings, linuxPackageSymlinks import packager.Keys._ /** - * Plugin containing all generic values used for packaging rpms. - * + * Plugin containing all generic values used for packaging rpms. + * * @example Enable the plugin in the `build.sbt` * {{{ * enablePlugins(RpmPlugin) - * }}} + * }}} */ object RpmPlugin extends AutoPlugin { diff --git a/src/main/scala/com/typesafe/sbt/packager/universal/Archives.scala b/src/main/scala/com/typesafe/sbt/packager/universal/Archives.scala index 06c4e77b8..f397657cf 100644 --- a/src/main/scala/com/typesafe/sbt/packager/universal/Archives.scala +++ b/src/main/scala/com/typesafe/sbt/packager/universal/Archives.scala @@ -45,7 +45,8 @@ object Archives { "-megabytes", "%d" format neededMegabytes, "-fs", "HFS+", "-volname", name, - name), Some(target)).! match { + name + ), Some(target)).! match { case 0 => () case n => sys.error("Error creating dmg: " + dmg + ". Exit code " + n) } @@ -58,7 +59,8 @@ object Archives { "hdiutil", "attach", dmg.getAbsolutePath, "-readwrite", "-mountpoint", - mountedPath), Some(target)).! match { + mountedPath + ), Some(target)).! match { case 0 => () case n => sys.error("Unable to mount dmg: " + dmg + ". Exit code " + n) } diff --git a/src/main/scala/com/typesafe/sbt/packager/windows/WindowsPlugin.scala b/src/main/scala/com/typesafe/sbt/packager/windows/WindowsPlugin.scala index e45260f22..863586e86 100644 --- a/src/main/scala/com/typesafe/sbt/packager/windows/WindowsPlugin.scala +++ b/src/main/scala/com/typesafe/sbt/packager/windows/WindowsPlugin.scala @@ -70,7 +70,8 @@ object WindowsPlugin extends AutoPlugin { version in Windows, maintainer in Windows, packageSummary in Windows, - packageDescription in Windows) apply { (id, uid, version, mtr, title, desc) => + packageDescription in Windows + ) apply { (id, uid, version, mtr, title, desc) => WindowsProductInfo( id = id, title = title, @@ -127,11 +128,12 @@ object WindowsPlugin extends AutoPlugin { */ def mapGenericFilesToWindows: Seq[Setting[_]] = Seq( mappings in Windows <<= mappings in Universal, - wixFeatures <<= (packageName in Windows, mappings in Windows) map makeWindowsFeatures) + wixFeatures <<= (packageName in Windows, mappings in Windows) map makeWindowsFeatures + ) /** * Generates the wix configuration features - * + * * @param name - title of the core package * @param mappings - use to generate different features * @return windows features @@ -151,7 +153,8 @@ object WindowsPlugin extends AutoPlugin { title = name, desc = "All core files.", absent = "disallow", - components = files) + components = files + ) // TODO - Detect bat files to add paths... val addBinToPath = // TODO - we may have issues here... @@ -159,7 +162,8 @@ object WindowsPlugin extends AutoPlugin { id = "AddBinToPath", title = "Update Enviornment Variables", desc = "Update PATH environment variables (requires restart).", - components = Seq(AddDirectoryToPath("bin"))) + components = Seq(AddDirectoryToPath("bin")) + ) val configLinks = for { (file, name) <- mappings if !file.isDirectory @@ -170,7 +174,8 @@ object WindowsPlugin extends AutoPlugin { id = "AddConfigLinks", title = "Configuration start menu links", desc = "Adds start menu shortcuts to edit configuration files.", - components = Seq(AddShortCuts(configLinks))) + components = Seq(AddShortCuts(configLinks)) + ) // TODO - Add feature for shortcuts to binary scripts. Seq(corePackage, addBinToPath, menuLinks) } diff --git a/src/main/scala/com/typesafe/sbt/packager/windows/WixHelper.scala b/src/main/scala/com/typesafe/sbt/packager/windows/WixHelper.scala index b878838c5..6cb85b13e 100644 --- a/src/main/scala/com/typesafe/sbt/packager/windows/WixHelper.scala +++ b/src/main/scala/com/typesafe/sbt/packager/windows/WixHelper.scala @@ -17,7 +17,8 @@ case class WindowsProductInfo( comments: String = "", installScope: String = "perMachine", installerVersion: String = "200", - compressed: Boolean = true) + compressed: Boolean = true +) sealed trait FeatureComponent /** Define a new feature, that will be selectable in the default MSI. */ @@ -28,11 +29,13 @@ case class WindowsFeature( absent: String = "allow", level: String = "1", display: String = "collapse", - components: Seq[FeatureComponent] = Seq.empty) extends FeatureComponent {} + components: Seq[FeatureComponent] = Seq.empty +) extends FeatureComponent {} /** Adds a file into a given windows feature. */ case class ComponentFile( source: String, - editable: Boolean = false) extends FeatureComponent + editable: Boolean = false +) extends FeatureComponent /** * Will add the directory to the windows path. NOTE: Only one of these * per MSI. @@ -40,7 +43,8 @@ case class ComponentFile( case class AddDirectoryToPath(dir: String = "") extends FeatureComponent case class AddShortCuts( target: Seq[String], - workingDir: String = "INSTALLDIR") extends FeatureComponent + workingDir: String = "INSTALLDIR" +) extends FeatureComponent // TODO - Shortcut as a component element. @@ -204,7 +208,8 @@ object WixHelper { def makeWixConfig( name: String, // package name product: WindowsProductInfo, - rest: xml.Node): xml.Node = { + rest: xml.Node + ): xml.Node = { @@ -245,7 +250,8 @@ object WixHelper { val xml = ( - ) + + ) (Seq(id), xml) } def handleDirectory(dir: File): (Seq[String], scala.xml.Node) = { @@ -261,7 +267,8 @@ object WixHelper { xml } } - ) + + ) (buf.toSeq, xml) } def recursiveHelper(f: File): (Seq[String], scala.xml.Node) = diff --git a/src/sbt-test/docker/entrypoint/build.sbt b/src/sbt-test/docker/entrypoint/build.sbt new file mode 100644 index 000000000..e8f9be44e --- /dev/null +++ b/src/sbt-test/docker/entrypoint/build.sbt @@ -0,0 +1,7 @@ +enablePlugins(DockerPlugin) + +name := "simple-test" + +version := "0.1.0" + +dockerEntrypoint := Seq("/bin/sh", "-c", "env") diff --git a/src/sbt-test/docker/entrypoint/project/plugins.sbt b/src/sbt-test/docker/entrypoint/project/plugins.sbt new file mode 100644 index 000000000..b53de154c --- /dev/null +++ b/src/sbt-test/docker/entrypoint/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % sys.props("project.version")) diff --git a/src/sbt-test/docker/entrypoint/test b/src/sbt-test/docker/entrypoint/test new file mode 100644 index 000000000..6ab640bcb --- /dev/null +++ b/src/sbt-test/docker/entrypoint/test @@ -0,0 +1,3 @@ +# Stage the distribution and ensure files show up. +> docker:stage +$ exec grep -q -F 'ENTRYPOINT ["/bin/sh", "-c", "env"]' target/docker/Dockerfile diff --git a/src/sphinx/DetailedTopics/docker.rst b/src/sphinx/DetailedTopics/docker.rst index e4b9cbbcb..3177305e5 100644 --- a/src/sphinx/DetailedTopics/docker.rst +++ b/src/sphinx/DetailedTopics/docker.rst @@ -58,6 +58,10 @@ Environment Settings ``dockerExposedVolumes in Docker`` A list of data volumes to make available in the Docker image. + ``dockerEntrypoint in Docker`` + Overrides the default entrypoint for docker-specific service discovery tasks before running the application. + Defaults to the bash executable script, available at ``bin/