gitlab.com/sparetimecoders/build-tools@v0.1.0/pkg/stack/scala.go (about) 1 package stack 2 3 import ( 4 "gitlab.com/sparetimecoders/build-tools/pkg/file" 5 "gitlab.com/sparetimecoders/build-tools/pkg/templating" 6 "os" 7 "path/filepath" 8 "strings" 9 ) 10 11 type Scala struct{} 12 13 func (s Scala) Scaffold(dir string, data templating.TemplateData) error { 14 for _, s := range []string{"main", "test"} { 15 for _, t := range []string{"scala", "resources"} { 16 if err := os.MkdirAll(filepath.Join(dir, "src", s, t), 0777); err != nil { 17 return err 18 } 19 } 20 } 21 orgPath := append([]string{dir, "src", "main", "scala"}, strings.Split(data.Organisation, ".")...) 22 if err := os.MkdirAll(filepath.Join(orgPath...), 0777); err != nil { 23 return err 24 } 25 files := []struct { 26 name string 27 content string 28 }{ 29 {"Dockerfile", dockerfile}, 30 {"build.sbt", buildSbt}, 31 {"project/plugins.sbt", pluginsSbt}, 32 {"project/build.properties", "sbt.version=1.3.0"}, 33 {"src/main/resources/logback.xml", logbackXml}, 34 } 35 for _, x := range files { 36 if err := file.WriteTemplated(dir, x.name, x.content, data); err != nil { 37 return err 38 } 39 } 40 if err := file.Append(filepath.Join(dir, ".dockerignore"), dockerignore); err != nil { 41 return err 42 } 43 return file.Append(filepath.Join(dir, ".gitignore"), "target") 44 } 45 46 func (s Scala) Name() string { 47 return "scala" 48 } 49 50 var _ Stack = &Scala{} 51 52 var dockerignore = ` 53 .idea 54 target 55 *.iml` 56 57 var dockerfile = ` 58 FROM hseeberger/scala-sbt:11.0.3_1.3.0_2.13.0 as builder 59 WORKDIR /build 60 61 COPY project /build/project 62 RUN sbt update 63 64 COPY build.sbt /build 65 RUN sbt update 66 67 COPY . /build 68 RUN sbt clean coverage test coverageReport coverageOff stage 69 70 FROM pliljenberg/java:latest 71 72 WORKDIR /opt 73 74 COPY --from=builder /build/target/universal/stage/ /opt 75 76 ENTRYPOINT bin/{{.ProjectName}} -J-Xmx\$JVM_MEM 77 78 CMD [] 79 ` 80 81 var pluginsSbt = ` 82 addSbtPlugin("org.scalariform" % "sbt-scalariform" % "1.8.2") 83 addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1") 84 addSbtPlugin("com.typesafe.sbt" % "sbt-native-packager" % "1.3.15") 85 addSbtPlugin("org.scoverage" % "sbt-scoverage" % "1.5.1") 86 ` 87 88 var buildSbt = ` 89 lazy val logbackVersion = "1.2.3" 90 lazy val logbackJsonVersion = "5.2" 91 lazy val scalaTestVersion = "3.0.5" 92 93 lazy val ` + "`{{.ProjectName}}`" + ` = (project in file(".")). 94 settings( 95 inThisBuild(List( 96 organization := "{{.Organisation}}", 97 scalaVersion := "2.12.8" 98 )), 99 name := "{{.ProjectName}}", 100 resolvers ++= Seq( 101 Resolver.jcenterRepo 102 ), 103 libraryDependencies ++= Seq( 104 "ch.qos.logback" % "logback-classic" % logbackVersion, 105 "net.logstash.logback" % "logstash-logback-encoder" % logbackJsonVersion, 106 107 "org.scalatest" %% "scalatest" % scalaTestVersion % Test 108 ) 109 ) 110 111 enablePlugins(JavaAppPackaging) 112 ` 113 114 var logbackXml = ` 115 <?xml version="1.0" encoding="UTF-8"?> 116 <configuration> 117 <appender name="TEXT" class="ch.qos.logback.core.ConsoleAppender"> 118 <encoder> 119 <pattern>[%-5p] [%d{yyyy-MM-dd HH:mm:ss}] [%30.30logger{30}] %msg%n</pattern> 120 </encoder> 121 </appender> 122 123 <appender name="JSON" class="ch.qos.logback.core.ConsoleAppender"> 124 <encoder class="net.logstash.logback.encoder.LogstashEncoder" /> 125 </appender> 126 127 <logger name="{{.Organisation}}" level="DEBUG" /> 128 129 <root level="INFO"> 130 <appender-ref ref="${LOGFORMAT:-JSON}" /> 131 </root> 132 </configuration> 133 `