Skip to content

Commit 4a3cc9b

Browse files
authored
Merge pull request #135 from lwronski/feature/docker-package
Add docker package logging and generate bootstrap file in temp directory for docker
2 parents a35267c + 4cb6bd7 commit 4a3cc9b

File tree

4 files changed

+52
-32
lines changed

4 files changed

+52
-32
lines changed

modules/build/src/main/scala/scala/build/options/BuildOptions.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,8 @@ final case class BuildOptions(
217217

218218
// FIXME We'll probably need more refined rules if we start to support extra Scala.JS or Scala Native specific types
219219
def packageTypeOpt: Option[PackageType] =
220-
if (scalaJsOptions.enable) Some(PackageType.Js)
220+
if (packageOptions.isDockerEnabled) Some(PackageType.Docker)
221+
else if (scalaJsOptions.enable) Some(PackageType.Js)
221222
else if (scalaNativeOptions.enable) Some(PackageType.Native)
222223
else packageOptions.packageTypeOpt
223224

modules/build/src/main/scala/scala/build/options/PackageType.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ object PackageType {
1818
case object Native extends PackageType {
1919
override def runnable = true
2020
}
21+
case object Docker extends PackageType
2122
case object Debian extends NativePackagerType
2223
case object Dmg extends NativePackagerType
2324
case object Pkg extends NativePackagerType

modules/cli/src/main/scala/scala/cli/commands/Package.scala

Lines changed: 48 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -185,44 +185,44 @@ object Package extends ScalaCommand[PackageOptions] {
185185

186186
lazy val debianSettings = DebianSettings(
187187
shared = sharedSettings,
188-
maintainer = packageOptions.maintainer.mandatory("maintainer", "debian"),
189-
description = packageOptions.description.mandatory("description", "debian"),
188+
maintainer = packageOptions.maintainer.mandatory("--maintainer", "debian"),
189+
description = packageOptions.description.mandatory("--description", "debian"),
190190
debianConflicts = packageOptions.debianOptions.conflicts,
191191
debianDependencies = packageOptions.debianOptions.dependencies,
192192
architecture = packageOptions.debianOptions.architecture.mandatory(
193-
"deb architecture",
193+
"--deb-architecture",
194194
"debian"
195195
)
196196
)
197197

198198
lazy val macOSSettings = MacOSSettings(
199199
shared = sharedSettings,
200200
identifier =
201-
packageOptions.macOSidentifier.mandatory("identifier parameter", "macOs")
201+
packageOptions.macOSidentifier.mandatory("--identifier-parameter", "macOs")
202202
)
203203

204204
lazy val redHatSettings = RedHatSettings(
205205
shared = sharedSettings,
206-
description = packageOptions.description.mandatory("description", "redHat"),
206+
description = packageOptions.description.mandatory("--description", "redHat"),
207207
license =
208-
packageOptions.redHatOptions.license.mandatory("license", "redHat"),
208+
packageOptions.redHatOptions.license.mandatory("--license", "redHat"),
209209
release =
210-
packageOptions.redHatOptions.release.mandatory("release", "redHat"),
210+
packageOptions.redHatOptions.release.mandatory("--release", "redHat"),
211211
rpmArchitecture = packageOptions.redHatOptions.architecture.mandatory(
212-
"rpm architecture",
212+
"--rpm-architecture",
213213
"redHat"
214214
)
215215
)
216216

217217
lazy val windowsSettings = WindowsSettings(
218218
shared = sharedSettings,
219-
maintainer = packageOptions.maintainer.mandatory("maintainer", "windows"),
219+
maintainer = packageOptions.maintainer.mandatory("--maintainer", "windows"),
220220
licencePath = packageOptions.windowsOptions.licensePath.mandatory(
221-
"licence path",
221+
"--licence-path",
222222
"windows"
223223
),
224224
productName = packageOptions.windowsOptions.productName.mandatory(
225-
"product name",
225+
"--product-name",
226226
"windows"
227227
),
228228
exitDialog = packageOptions.windowsOptions.exitDialog,
@@ -249,29 +249,45 @@ object Package extends ScalaCommand[PackageOptions] {
249249
imageResizerOpt = imageResizerOpt
250250
).build()
251251
}
252-
}
252+
case PackageType.Docker =>
253+
val exec = if (build.options.scalaJsOptions.enable) "node" else "sh"
254+
val from = build.options.packageOptions.dockerOptions.from match {
255+
case Some(baseImage) => baseImage
256+
case None => if (build.options.scalaJsOptions.enable) "node" else "openjdk:8-jre-slim"
257+
}
258+
val repository = build.options.packageOptions.dockerOptions.imageRepository.mandatory(
259+
"--docker-image-repository",
260+
"docker"
261+
)
262+
val tag = build.options.packageOptions.dockerOptions.imageTag.getOrElse("latest")
263+
264+
val dockerSettings = DockerSettings(
265+
from = from,
266+
registry = build.options.packageOptions.dockerOptions.imageRegistry,
267+
repository = repository,
268+
tag = Some(tag),
269+
exec = exec
270+
)
253271

254-
// build docker image
255-
if (build.options.packageOptions.isDockerEnabled) {
272+
val appPath = os.temp.dir(prefix = "scala-cli-docker") / "app"
273+
if (build.options.scalaJsOptions.enable) {
274+
val linkerConfig = build.options.scalaJsOptions.linkerConfig
275+
linkJs(build, appPath, Some(mainClass()), addTestInitializer = false, linkerConfig)
276+
}
277+
else {
278+
bootstrap(build, appPath, mainClass(), () => alreadyExistsCheck())
279+
}
256280

257-
val exec = if (build.options.scalaJsOptions.enable) "node" else "sh"
258-
val from = build.options.packageOptions.dockerOptions.from match {
259-
case Some(baseImage) => baseImage
260-
case None => if (build.options.scalaJsOptions.enable) "node" else "adoptopenjdk/openjdk8"
261-
}
281+
logger.message(
282+
"Started building docker image with your application, it would take some time"
283+
)
262284

263-
val dockerSettings = DockerSettings(
264-
from = from,
265-
registry = build.options.packageOptions.dockerOptions.imageRegistry,
266-
repository = build.options.packageOptions.dockerOptions.imageRepository.mandatory(
267-
"image repository",
268-
"docker"
269-
),
270-
tag = build.options.packageOptions.dockerOptions.imageTag,
271-
exec = exec
272-
)
285+
DockerPackage(appPath, dockerSettings).build()
273286

274-
DockerPackage(destPath, dockerSettings).build()
287+
logger.message(
288+
"Built docker image, run it with" + System.lineSeparator() +
289+
s" docker run $repository:$tag"
290+
)
275291
}
276292

277293
logger.message {
@@ -281,6 +297,8 @@ object Package extends ScalaCommand[PackageOptions] {
281297
else if (packageType == PackageType.Js)
282298
s"Wrote $dest, run it with" + System.lineSeparator() +
283299
" node " + printableDest
300+
else if (packageType == PackageType.Docker)
301+
"Wrote docker image"
284302
else
285303
s"Wrote $dest"
286304
}

modules/cli/src/main/scala/scala/cli/commands/PackagerOptions.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ final case class PackagerOptions(
8686
@HelpMessage(
8787
"The image repository"
8888
)
89-
dockerImageRepository: Option[String] = None,
89+
dockerImageRepository: Option[String] = Some("latest"),
9090
@Group("Docker")
9191
@HelpMessage(
9292
"The image tag, the default tag is latest"

0 commit comments

Comments
 (0)