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  `