-
Notifications
You must be signed in to change notification settings - Fork 1
/
build.sbt
103 lines (92 loc) · 2.77 KB
/
build.sbt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
import Dependencies._
import scala.sys.process._
ThisBuild / scalaVersion := "2.12.8"
ThisBuild / organization := "org.dijksterhuis"
ThisBuild / organizationName := "dijksterhuis"
ThisBuild / description := "Template for Python projects built with sbt."
ThisBuild / licenses := List("Apache 2" -> new URL("http://www.apache.org/licenses/LICENSE-2.0.txt"))
ThisBuild / homepage := Some(url("https://github.com/dijksterhuis/sbtPython"))
releaseUseGlobalVersion := false
ThisBuild / scmInfo := Some(
ScmInfo(
url("https://github.com/dijksterhuis/sbtPython"),
"scm:[email protected]:dijksterhuis/sbtPython.git"
)
)
ThisBuild / developers := List(
Developer(
id = "dijksterhuis",
name = "Mike Robeson",
email = "[email protected]",
url = url("https://github.io/dijksterhuis")
)
)
// -- root project settings
lazy val root = (project in file("."))
.settings(
name := "sbtPython",
libraryDependencies += scalaTest % Test
)
// -- Plugins
enablePlugins(GitVersioning)
enablePlugins(sbtdocker.DockerPlugin)
enablePlugins(GitBranchPrompt)
// -- Python tests
// https://stackoverflow.com/a/48415997
val testPythonTask = TaskKey[Unit]("testPython", "Run python tests.")
fork in testPythonTask := true
testPythonTask := {
val s: TaskStreams = streams.value
val baseDir = baseDirectory.value
s.log.info("Executing task testPython")
lazy val result: Int = Process("python3 -m unittest src.test.python.test_main").!
if(result != 0){sys.error("Python tests failed!")}
}
//attach custom test task to default test tasks
test in Test := {
testPythonTask.value
(test in Test).value
}
testOnly in Test := {
testPythonTask.value
(testOnly in Test).inputTaskValue
}
// -- python packaging
// TODO
// 1. Zip archiving
// 2. setup.py install?
// -- docker
buildOptions in docker := BuildOptions(
cache = true,
removeIntermediateContainers = BuildOptions.Remove.Always,
pullBaseImage = BuildOptions.Pull.Always
)
imageNames in docker := Seq(
ImageName(
namespace = Some(organizationName.value),
repository = name.value.toLowerCase,
tag = Some("latest")
),
ImageName(
namespace = Some(organizationName.value),
repository = name.value.toLowerCase,
tag = Some("v" + version.value)
)
)
dockerfile in docker := {
val username = "python"
val appDir = "src/main/python"
val targetDir = "/app"
val requirementsFile = "requirements.txt"
new Dockerfile {
from("python:3")
run("useradd", "-ms", "/bin/bash", username)
// copy python files to staging area first, then copy to image
stageFile(file(appDir), targetDir)
copyRaw(targetDir, targetDir)
run("chown", "-R", username + ":" + username, targetDir)
run("chmod", "-R", "+x", targetDir)
user(username)
cmd("/app/main.py")
}
}